Có cách nào để vô hiệu hóa bộ đệm của bộ đệm là cảnh báo chỉ đọc được không?


9

Tôi không thấy cảnh báo này đặc biệt hữu ích và khá mất tập trung vì nó ẩn văn bản hiện tại trong khu vực tiếng vang trong một khoảnh khắc ngắn. Điều này cũng có vẻ không cần thiết, vì dù sao tôi cũng sẽ nhận thấy rằng tôi không thể viết trong các khu vực chỉ đọc. Có cách nào để vô hiệu hóa nó?

Câu trả lời:


9

Có, bạn có thể tắt các tin nhắn này bằng cách đặt command-error-functionthành một chức năng bỏ qua buffer-read-onlytín hiệu.

(defun my-command-error-function (data context caller)
  "Ignore the buffer-read-only signal; pass the rest to the default handler."
  (when (not (eq (car data) 'buffer-read-only))
    (command-error-default-function data context caller)))

(setq command-error-function #'my-command-error-function)

(Đã thử nghiệm bằng GNU Emacs 24.5.1.)


Vì tò mò, sẽ không ghi đè command-error-functiongiá trị ảnh hưởng đến tất cả các lỗi và không chỉ các lỗi "chỉ đọc bộ đệm"? Tôi không thể chính xác tìm ra những gì thay đổi này sẽ ảnh hưởng từ mã nguồn.
Kaushal Modi

1
Vâng, nó sẽ. Đó chính xác là lý do tại sao tôi có (when ...)biểu mẫu trong đoạn mã: cách này các tín hiệu chúng ta không quan tâm được chuyển đến trình xử lý mặc định và buffer-read-onlybị bỏ qua.
Constantine

Ah OK, tôi hoàn toàn bỏ lỡ cuộc gọi đó command-error-default-function.
Kaushal Modi

1
Thật tuyệt, tôi đã tìm kiếm một cách dễ dàng để loại bỏ rác "Văn bản chỉ đọc" trong bộ lọc nhỏ và đây là một mẹo nhỏ.
whacka

1
@mcb: Theo tôi biết thì không thể tách vùng tiếng vang và vùng đệm mini. Tôi tin rằng câu trả lời philsmà bạn liên kết đến là chính xác, tức là chúng ta sẽ cần mã C mới cho việc này.
Constantine

3

Nguồn của lỗi 'chỉ đọc bộ đệm'

Tôi tin rằng nguồn của lỗi đó: Buffer is read-only: <#BUFFER-NAME>nằm trong mã nguồn C.

Vì vậy, giải pháp cho vấn đề này là điều chỉnh mã nguồn và xây dựng emacs cục bộ bằng cách nhận xét dòng cụ thể này .

Để tham khảo, đây là đoạn mã đó đưa ra lỗi đó:

if (!NILP (BVAR (current_buffer, read_only))
    && NILP (Vinhibit_read_only)
    && NILP (Fget_text_property (pos, Qinhibit_read_only, Qnil)))
  xsignal1 (Qbuffer_read_only, Fcurrent_buffer ());
return Qnil;

.. và bình luận ra xsignaldòng đó nên thực hiện các mẹo.


Phương pháp đề xuất

Có một cách dễ dàng hơn nhiều để tránh sự phiền toái này trong suốt thời gian bạn làm việc trong bộ đệm chỉ đọc .. bạn có thể tạm thời KHÔNG làm cho nó chỉ đọc.

  • Làm M-x read-only-mode(bị ràng buộc theo mặc định C-x C-q) bật tắt bất kỳ bộ đệm nào giữa chế độ chỉ đọc và chế độ có thể chỉnh sửa.

Vì vậy, nếu bạn đang nhận được rất nhiều lỗi này, chỉ cần làm cho bộ đệm tạm thời có thể chỉnh sửa bằng cách nhấn C-x C-q.


Lưu ý cảnh báo: Thực hiện hack nguồn C có thể là một nguồn gây nhầm lẫn lớn trong tương lai. Vì vậy, tôi sẽ không làm điều đó.


1
Theo như tôi có thể nói (defun barf-if-buffer-read-only () nil)có tác dụng tương tự như nhận xét xsignal1cuộc gọi và xây dựng lại Emacs. :-)
Constantine

@Constantine TIL rằng chúng ta có thể ghi đè các hàm C trong elisp. Cảm ơn!
Kaushal Modi

Về việc sửa đổi mọi thứ bằng cách sử dụng elisp: điều này làm tôi nhớ đến câu hỏi cũ này về nil: emacs.stackexchange.com/questions/2935/how-can-i-bring-back-nil
Constantine
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.