Seperti yang sudah dijawab dalam komentar, Emacs menjadi sangat lambat dalam tampilan ulang untuk garis panjang adalah masalah yang terkenal . Memperbaikinya akan sangat bagus, tetapi perlu banyak pemikiran untuk dilakukan dengan benar. Saya punya ide tentang bagaimana hal itu dapat dilakukan berdasarkan bagian 6.3 dari dokumen ini
(pada dasarnya, menyimpan informasi garis visual dalam buffer saat ini dan memperbaruinya pada penyisipan spasi putih, properti tampilan, perubahan jendela, dll., Kemudian gunakan informasi itu dalam tampilkan kembali kode untuk menghindari pemindaian untuk itu sepanjang waktu), tetapi saya tidak cukup akrab dengan internal C untuk melakukannya.
Namun ada beberapa solusi. Yang paling jelas adalah menyetel parameter yang terkait tampilan (seperti, mengaktifkan pemotongan garis visual dalam instance Emacs grafis, menggunakan Emacs non-grafis untuk melakukan hal itu secara otomatis, menonaktifkan fitur Bidi, dll.) Dan memproses ulang konten file yang Anda inginkan. sedang membaca. Yang kurang jelas adalah secara otomatis pasca-pemrosesan file, baik itu dengan benar-benar memotong baris mereka atau menambahkan properti teks yang membuat garis tampak lebih pendek daripada yang sebenarnya. Untuk mengubahnya menjadi jawaban yang lebih menarik, saya akan menyajikan peretasan yang sangat buruk dari opsi sebelumnya yang hanya akan bekerja untuk comint
mode yang diarsipkan:
(defun my-comint-shorten-long-lines (text)
(let* ((regexp "^\\(.\\{80\\}\\).*?$")
(shortened-text (replace-regexp-in-string regexp "\\1" text)))
(if (string= shortened-text text)
text
(propertize shortened-text 'help-echo text))))
(add-hook 'comint-preoutput-filter-functions 'my-comint-shorten-long-lines)
Ini mendefinisikan my-comint-shorten-long-lines
, suatu fungsi yang mengambil string yang mungkin terdiri dari banyak baris dan menggunakan kekuatan ekspresi reguler untuk mengganti baris di dalamnya dengan panjang 80 karakter atau lebih dengan versi singkat yang menampilkan teks asli ketika melayang di atasnya. Ketika digunakan sebagai pengait di
comint-preoutput-filter-functions
dalamnya akan menyaring semua comint
output sebelum ditampilkan.
Namun, rendisi hack ini memiliki kelemahan yang cukup serius. Dalam mode yang memiliki fontifikasi dasar yang sedang berlangsung (seperti, M-x ielm
), itu akan dengan senang hati memotong garis-garis yang merupakan bagian dari string dan akan dengan cara itu mengklasifikasikan semuanya sampai kutipan berikutnya sebagai string! Bukan itu yang kita inginkan dan dapat diperbaiki dengan sedikit penguasaan regex (tapi mungkin akan menerobos dalam REPL untuk bahasa seperti Python). Sementara kita melakukannya, mari kita sorot juga keluaran yang lebih pendek:
(defun my-comint-shorten-long-lines (text)
(let* ((regexp "^\\(.\\{80\\}\\).*?\\(\"?\\)$")
(shortened-text (replace-regexp-in-string regexp "\\1\\2" text)))
(if (string= shortened-text text)
text
(propertize shortened-text 'font-lock-face 'shadow 'help-echo text))))
(add-hook 'comint-preoutput-filter-functions 'my-comint-shorten-long-lines)
Itu sedikit lebih baik, tetapi masih jelek. Melayang pada output seperti find /
in M-x shell
tidak menarik (idealnya kita hanya ingin menampilkan garis yang tidak tertutup, tidak semua output), deteksi string paling sederhana dan pemotongan dapat diindikasikan lebih baik dengan elips alih-alih mengklasifikasikan semuanya. Selain itu, bahkan tidak dijamin bahwa teks yang masuk tidak berubah menjadi kumpulan. Semua ini berteriak untuk melakukan langkah pemrosesan dalam buffer sementara, tetapi akan dibiarkan bagi pembaca sebagai latihan (atau penulis sebagai posting blog potensial).