Setelah menyalin Emacs, buffer pasta OS-X mendapatkan CR bukan LF

1

Ketika saya melakukan Emacs-copy atau -cotong dalam file teks dengan akhiran baris unix (0x0a), dan kemudian melihat papan tulis di Terminal, baris baru telah diganti dengan pengembalian kereta tunggal.

File (dibuat dengan Emacs) memiliki akhiran baris baru:

$ hexdump -C quick.txt
00000000  74 68 65 20 71 75 69 63  6b 0a 62 72 6f 77 6e 20  |the quick.brown |
00000010  66 6f 78 0a                                       |fox.|
00000014

Menyalin file (di Terminal) ke buffer paste, lalu menampilkan buffer paste, kita masih melihat baris baru:

$ pbcopy <quick.txt ; pbpaste | hexdump -C
00000000  74 68 65 20 71 75 69 63  6b 0a 62 72 6f 77 6e 20  |the quick.brown |
00000010  66 6f 78 0a                                       |fox.|
00000014

Setelah membuka file dengan Emacs (berjendela), memilih teks dan menyalin dengan Cmd-W(terikat ke kill-ring-save), kemudian menampilkan buffer paste di Terminal, saya mendapatkan:

$ pbpaste | hexdump -C
00000000  74 68 65 20 71 75 69 63  6b 0d 62 72 6f 77 6e 20  |the quick.brown |
00000010  66 6f 78 0d                                       |fox.|
00000014

Baris baru sekarang carriage-return.

Mengapa mereka diterjemahkan, dan bagaimana saya bisa mencegahnya?

  • OS-X 10.6.7
  • Emacs 22.3.1 di jendela GUI
  • Menyembunyikan .emacs.el tidak berpengaruh pada terjemahan (kustomisasi saya jangan pergi).
JRobert
sumber

Jawaban:

0

Saya menemukan utas di tempat lain tentang "bug" ini, termasuk perbaikan ("bug" dalam tanda kutip karena sepertinya keputusan desain oleh pengembang Emacs, hanya satu yang tidak bekerja untuk saya).

Seiji Zenitani membuka utas dan memposting solusi seseorang mengirimnya (dia tidak mengatakan siapa), yang akan saya posting di bawah jika utas hilang. Komentar adalah milikku; kodenya saat dia mempostingnya.

Intinya adalah bahwa ada terjemahan yang disengaja (rupanya) dari unix-mode ke akhir baris mode Mac ketika menyalin Emacs-cut atau -copy ke papan tulis OS-X (\ n -> \ r, persis apa yang saya lihat). Bisa dibilang, papan tulis paling sering digunakan untuk menempelkan ke aplikasi Mac sehingga menerjemahkan ke mode Mac pada papan tulis akan masuk akal. Yang juga dapat diperdebatkan adalah bahwa pengguna Emacs mungkin akan bekerja di Unix yang mendasarinya, jadi menyalin string dalam mode unix masuk akal, dan itulah solusi yang saya pilih. Ini membantu bahwa sebagian besar aplikasi Mac tampaknya menerima string Unix-mode.

Cara mengatasinya:

;; Perbaikan bug untuk: "Setelah copy Emacs, buffer pasta OS-X mendapatkan CRs di mana LF sebelumnya",
;; dengan mendefinisikan ulang ... / term / mac-win.el / mac-string-to-utxt.
;; Baris 7 mengubah sistem pengkodean menjadi unix (was mac)
;; Baris 23,24 hapus "-mac" dari "utf-16be-mac" dan "utf-16le-mac" dan muncul
;; untuk diterapkan pada pengkodean Jepang.
;; Lihat: http://old.nabble.com/Fwd%3A-Line-endings-bug-to10657191.html#a10730618

(defun mac-string-to-utxt (string & sistem pengkodean opsional)
 (atau sistem pengkodean (sistem pengkodean setq mac-sistem-sistem pengkodean))
 (biarkan (penyandian data)
   (when (and (fboundp 'mac-code-convert-string)
              (memq (coding-system-base coding-system)
                    (find-coding-systems-string string)))
     (sistem pengkodean setq
           (coding-system-change-eol-conversion coding-system 'unix))
     (let ((str string))
       (when (and (eq system-type 'darwin)
                  (eq coding-system 'jepang-shift-jis-mac))
         (setq encoding mac-text-encoding-mac-japanese-basic-varian)
         (setq str (subst-char-in-string? \\? \ x80 str))
         (subst-char-in-string? \\? \ x5c str t)
         ;; Khusus ASCII?
         (jika (string-match "\\` [\ x00- \ x7f] * \\ '"str)
             (setq str nil))))
       (dan str
            (setq data (mac-code-convert-string)
                        (encode-coding-string str coding-system)
                        (atau sistem pengkodean pengkodean) nil))))))
   (atau data (encode-coding-string string (if (eq (byteorder)? B))
                                             utf-16be
                                           'utf-16le)))))
JRobert
sumber