Yorumlarda daha önce yanıtlandığı gibi, Emacs uzun satırlar için yeniden gösterilmesinde çok yavaş hale geldi, iyi bilinen bir konudur . Bunu düzeltmek çok güzel olurdu, ancak doğru bir şekilde çekilmesi için çok fazla düşünceye ihtiyaç var. Bu belgenin 6.3 bölümüne göre nasıl başarılabileceğine dair bir fikrim var
(temel olarak, görsel arabellek bilgisini geçerli arabellekte saklayın ve boşluk, görüntü özellikleri, pencere değişiklikleri vb. Eklendiğinde güncelleyin, ardından bu bilgileri kullanın her zaman taramaktan kaçınmak için yeniden görüntüleme kodunu kullanın), ancak C dahili bileşenlerini çıkarmak için yeterince tanıdık değilim.
Gerçi geçici çözümler var. En belirgin olanları, ekranla ilgili parametreleri ayarlamaktır (grafiksel Emacs örneğinde görsel satır kesme işlemini etkinleştirmek, grafiksel olmayan bir Emacs kullanarak bunu otomatik olarak yapmak, Bidi özelliklerini devre dışı bırakmak vb.) Ve dosya içeriklerini önceden işlemektir. ' Daha az belirgin olanı, dosyaları gerçekte satırlarından keserek veya satırların gerçekte olduğundan daha kısa görünmesini sağlayan metin özellikleri ekleyerek, dosyaları otomatik olarak sonradan işlemektir. Bunu daha ilginç bir cevaba dönüştürmek için, sadece comint
-eseri modlar için çalışacak olan eski seçeneğin oldukça çirkin bir hackini sunacağım :
(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)
Bu, my-comint-shorten-long-lines
muhtemelen birçok satırdan oluşan bir dize alan ve içindeki herhangi bir satırı 80 karakter veya daha uzun bir uzunlukla değiştirmek için normal ifadelerin gücünü kullanan bir işlev tanımlar , üzerine geldiğinde orijinal metni görüntüleyen kısaltılmış bir sürümle. Kanca olarak kullanıldığında,
comint-preoutput-filter-functions
tüm comint
çıktılar görüntülenmeden önce filtrelenir .
Ancak, hack'in bu yorumu oldukça ciddi bir zayıflığa sahiptir. Temel yazı tipinin devam ettiği (örneğin, M-x ielm
) modlarda , bir dizenin parçası olan satırları mutlu bir şekilde kesecek ve bu şekilde bir sonraki alıntıya kadar her şeyi dize olarak yazacak! İstediğimiz bu değil ve biraz daha fazla regex ustalığı ile düzeltilebilir (ancak muhtemelen Python gibi bir dil için bir REPL içine girer). Biz oradayken, kısaltılmış çıktıyı da vurgulayalım:
(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)
Bu biraz daha iyi, ama yine de çirkin. Gibi bir şey çıktı üzerine geldiğinizde find /
de M-x shell
cazip değil (biz ideal olarak kısaltılmamış çizgi, tüm çıkış görüntülemek isterdim), dize algılama en iyi gelişmemiş olduğu ve kestirme yerine herşeyi fontifying ait üç nokta ile daha iyi belirtilebilir. Bunun da ötesinde, gelen metnin gruplara dönüştürülmediği bile garanti edilmez. Tüm bunlar geçici bir arabellekte işleme adımını yapmak için çığlık atıyor, ancak okuyucuya alıştırma olarak (ya da yazar potansiyel blog yazısı olarak) bırakılacak.