Jak już wspomniano w komentarzach, Emacs bardzo powoli spowalniający wyświetlanie długich linii jest dobrze znanym problemem . Naprawienie go byłoby bardzo miłe, ale wymaga wiele przemyślenia, aby poprawnie go wyciągnąć. Mam pomysł, jak można to osiągnąć na podstawie sekcji 6.3 tego dokumentu
(w zasadzie przechowuj informacje o liniach wizualnych w bieżącym buforze i aktualizuj je po wstawieniu białych znaków, właściwości wyświetlania, zmian okna itp., A następnie użyj tych informacji w ponownie wyświetlaj kod, aby uniknąć ciągłego skanowania), ale nie znam wystarczająco wewnętrznych elementów C, aby go pobrać.
Istnieją jednak obejścia. Najbardziej oczywiste z nich to dostrajanie parametrów związanych z wyświetlaniem (np. Włączanie wizualnego obcięcia linii w graficznej instancji Emacsa, używanie nie graficznego Emacsa, aby to zrobić automatycznie, wyłączanie funkcji Bidi itp.) I wstępne przetwarzanie zawartości pliku, który „ ponowne wczytywanie. Mniej oczywistym jest automatyczne przetwarzanie plików, czy to przez obcięcie ich linii lub dodanie właściwości tekstowych, które sprawiają, że linie wydają się krótsze niż w rzeczywistości. Aby zamienić to w ciekawszą odpowiedź, przedstawię dość brzydki hack poprzedniej opcji, która będzie działać tylko dla comint
trybów generowanych:
(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)
Definiuje my-comint-shorten-long-lines
to funkcję, która pobiera ciąg znaków prawdopodobnie składający się z wielu wierszy i wykorzystuje moc wyrażeń regularnych do zastąpienia dowolnego wiersza o długości 80 znaków lub większej skróconą wersją, która wyświetla oryginalny tekst po najechaniu na niego kursorem. Jeśli zostanie użyty jako zaczep
comint-preoutput-filter-functions
, filtruje wszystkie comint
dane wyjściowe przed ich wyświetleniem.
Jednak wykonanie hacka ma dość poważną słabość. W trybach, w których działa podstawowa czcionka (jak, M-x ielm
), z radością odetnie linie, które są częścią łańcucha i w ten sposób będzie fontantyzować wszystko, aż do następnego cytatu jako łańcucha! To nie jest to, czego chcemy i może być naprawione za pomocą nieco większej znajomości wyrażeń regularnych (ale prawdopodobnie złamie się w REPL dla języka takiego jak Python). Skoro już o tym mowa, podkreślmy także skróconą wydajność:
(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)
To trochę lepiej, ale nadal brzydko. Umieszczanie wskaźnika na wyjściu czegoś takiego jak find /
w M-x shell
nie jest atrakcyjne (najlepiej chcielibyśmy wyświetlać niesortowaną linię, a nie wszystkie dane wyjściowe), wykrywanie ciągów jest w najlepszym razie szczątkowe, a obcięcie można lepiej wskazać elipsami zamiast wszystko. Co więcej, nie ma nawet gwarancji, że nadchodzący tekst nie zostanie przekształcony w partie. Wszystko to krzyczy za wykonanie kroku przetwarzania w tymczasowym buforze, ale zostanie pozostawione czytelnikowi jako ćwiczenie (lub autorowi jako potencjalny post na blogu).