Як уже було сказано в коментарях, Emacs стає дуже повільним у своїй повторній програмі для довгих ліній - добре відоме питання . Виправити це було б дуже приємно, але потрібно багато думок, щоб правильно їх зняти. У мене є уявлення про те, як це могло бути здійснено на основі розділу 6.3 цього документа
(в основному, зберігати візуальну інформацію про рядки у поточному буфері та оновлювати її при вставці пробілу, властивостях відображення, зміні вікон тощо), а потім використовувати цю інформацію в код повторного відображення, щоб уникнути сканування на ньому весь час), але я недостатньо знайомий із внутрішніми документами C, щоб його зняти.
Однак є й обхідні шляхи. Найбільш очевидними з них можуть бути налаштування параметрів, що стосуються дисплея (наприклад, включення візуального обрізання ліній в екземплярі графічного Emacs, використання неграфічного Emacs для автоматичного виконання, відключення функцій Bidi тощо) та попередня обробка вмісту файлу, який ви ' Повторне читання. Менш очевидний - це автоматично після обробки файлів, будь то насправді обрізання їх рядків або додавання властивостей тексту, які роблять рядки коротшими, ніж вони є насправді. Щоб перетворити це на більш цікаву відповідь, я представляю досить некрасивий хак колишньої опції, яка працюватиме лише для comint
режимів, що отримуються раніше:
(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)
Це визначає my-comint-shorten-long-lines
функцію, яка займає рядок, можливо, складається з багатьох рядків і використовує силу регулярних виразів, щоб замінити будь-який рядок в ній довжиною 80 символів і більше на скорочену версію, яка відображає оригінальний текст при наведенні на нього курсором. Якщо його використовувати як гачок,
comint-preoutput-filter-functions
він буде фільтрувати весь comint
вихід, перш ніж його відображати.
Однак це відтворення хака має досить серйозну слабкість. У режимах, у яких триває основна фентифікація (наприклад, M-x ielm
), вона з радістю буде відрізати лінії, що є частиною рядка, і таким чином впорядкує все до наступної цитати як рядок! Це не те, що ми хочемо, і це може бути виправлено за допомогою трохи кращого майстерності регулярних виразів (але, мабуть, воно введеться в REPL для такої мови, як Python). Поки ми до цього звернемо увагу, також виділимо скорочений вихід:
(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)
Це трохи краще, але все ж потворно. Наведення на висновок чогось подібного find /
до M-x shell
не є привабливим (ми в ідеалі хотіли б лише відобразити нескорочену лінію, а не весь вихід), виявлення рядків у кращому випадку є рудиментарним, і усікання може бути вказане краще еліпсами, а не присвячувати все. Крім того, навіть не гарантується, що текст, що надходить, не перетвориться на партії. Все це кричить за те, щоб зробити крок обробки у тимчасовому буфері, але читач залишиться як вправа (або автор як потенційна публікація в блозі).