Như đã trả lời trong các bình luận, Emacs trở nên rất chậm trong việc hiển thị lại các dòng dài là một vấn đề nổi tiếng . Sửa nó sẽ rất hay, nhưng cần nhiều suy nghĩ để được rút ra một cách chính xác. Tôi có ý tưởng về cách thực hiện nó dựa trên phần 6.3 của tài liệu này
(về cơ bản, lưu trữ thông tin dòng hình ảnh trong bộ đệm hiện tại và cập nhật nó khi chèn khoảng trắng, thuộc tính hiển thị, thay đổi cửa sổ, v.v., sau đó sử dụng thông tin đó trong mã hiển thị lại để tránh quét mọi lúc), nhưng không đủ quen thuộc với các phần bên trong C để kéo nó đi.
Có cách giải quyết mặc dù. Những cái rõ ràng nhất sẽ điều chỉnh các tham số liên quan đến hiển thị (như, cho phép cắt ngắn dòng trực quan trong trường hợp Emacs đồ họa, sử dụng Emacs không có đồ họa để thực hiện tự động, vô hiệu hóa các tính năng Bidi, v.v.) và xử lý trước nội dung tệp bạn ' đang đọc lại. Một điều ít rõ ràng hơn là tự động xử lý hậu kỳ các tệp, bằng cách thực sự cắt bớt các dòng của chúng hoặc thêm các thuộc tính văn bản làm cho các dòng xuất hiện ngắn hơn so với thực tế. Để biến điều này thành một câu trả lời thú vị hơn, tôi sẽ trình bày một bản hack khá xấu xí của tùy chọn trước đây sẽ chỉ hoạt động cho comint
các chế độ được tạo ra:
(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)
Điều này xác định my-comint-shorten-long-lines
, một hàm lấy một chuỗi có thể bao gồm nhiều dòng và sử dụng sức mạnh của các biểu thức chính quy để thay thế bất kỳ dòng nào trong đó có độ dài từ 80 ký tự trở lên bằng một phiên bản rút gọn hiển thị văn bản gốc khi di chuột qua nó. Khi được sử dụng như hook trong
comint-preoutput-filter-functions
nó sẽ lọc tất cả comint
đầu ra trước khi nó được hiển thị.
Tuy nhiên, phiên bản hack này có một điểm yếu khá nghiêm trọng. Trong các chế độ có phông chữ cơ bản đang diễn ra (như, M-x ielm
), nó sẽ vui vẻ cắt bỏ các dòng là một phần của chuỗi và theo cách đó sẽ phông chữ mọi thứ cho đến khi trích dẫn tiếp theo dưới dạng chuỗi! Đó không phải là những gì chúng ta muốn và có thể được sửa chữa với một chút thành thạo regex (nhưng có lẽ sẽ phá vỡ bên trong REPL cho một ngôn ngữ như Python). Trong khi chúng ta đang ở đó, chúng ta hãy làm nổi bật đầu ra rút ngắn:
(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)
Điều đó tốt hơn một chút, nhưng vẫn xấu xí. Di chuột vào đầu ra của một cái gì đó như find /
trong M-x shell
không hấp dẫn (lý tưởng nhất là chúng tôi chỉ muốn hiển thị dòng không được bao bọc, không phải tất cả đầu ra), phát hiện chuỗi là thô sơ nhất và cắt ngắn có thể được chỉ định tốt hơn bằng dấu chấm lửng thay vì phông chữ mọi thứ. Trên hết, nó thậm chí không đảm bảo rằng văn bản đến không được chuyển thành lô. Tất cả điều này hét lên để thực hiện bước xử lý trong một bộ đệm tạm thời, nhưng sẽ được dành cho người đọc dưới dạng bài tập (hoặc tác giả là bài đăng blog tiềm năng).