Есть ли способ отключить предупреждение «буфер доступен только для чтения»?

9

Я не считаю это предупреждение особенно полезным и довольно отвлекающим, потому что оно на короткое время скрывает текущий текст в области эха. Это также кажется ненужным, потому что в любом случае я замечу, что не могу писать в областях только для чтения. Есть ли способ отключить его?

Ленар Хойт
источник

Ответы:

9

Да, вы можете отключить эти сообщения, установив command-error-functionфункцию, которая игнорирует buffer-read-onlyсигналы.

(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)

(Протестировано с использованием GNU Emacs 24.5.1.)

Константин
источник
Из любопытства, не повлияет ли переопределение command-error-functionзначения на все ошибки, а не только на ошибки «только для чтения в буфере»? Я не могу точно понять, что все эти изменения повлияют на исходный код.
Каушал Моди
1
Да, это так. Именно поэтому у меня есть (when ...)форма в фрагменте кода: таким образом сигналы, которые нас не интересуют, передаются в обработчик по умолчанию и buffer-read-onlyигнорируются.
Константин
Ах, хорошо, я полностью пропустил этот звонок command-error-default-function.
Каушал Моди
1
Сладкий, я искал простой способ избавиться от этого мусора «Текст только для чтения» только в минибуфере, и это делает свое дело.
whacka
1
@mcb: Насколько я знаю, невозможно разделить область эха и мини-буфер. Я полагаю, что ответ, на philsкоторый вы ссылались, является правильным, то есть для этого нам понадобится новый C-код.
Константин
3

Источник ошибки «буфер только для чтения»

Я считаю, что источник этой ошибки: Buffer is read-only: <#BUFFER-NAME>в исходном коде C.

Таким образом, решение этой проблемы было бы настроить исходный код и построить emacs локально, закомментировав эту конкретную строку .

Для справки вот фрагмент кода, который выдает эту ошибку:

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;

... и закомментирование этой xsignalстроки должно помочь.


Предлагаемый подход

Существует гораздо более простой способ предотвратить это раздражение на время работы в буфере только для чтения. Вы можете временно НЕ делать его доступным только для чтения.

  • Выполнение M-x read-only-mode(ограниченное по умолчанию C-x C-q) переключает любой буфер между режимом только для чтения и редактируемым режимом.

Так что, если вы получаете много этих ошибок, просто сделайте буфер временно редактируемым, нажав C-x C-q.


Предупреждение: в будущем взлом источника C может стать основным источником путаницы. Так что я бы не стал этого делать.

Каушал Моди
источник
1
Насколько я могу судить, это (defun barf-if-buffer-read-only () nil)имеет тот же эффект, что и комментирование xsignal1вызова и перестройка Emacs. :-)
Константин
@Constantine TIL, что мы можем переопределить функции C в elisp. Спасибо!
Каушал Моди
Что касается изменения вещей с помощью elisp: это напоминает мне этот старый вопрос о nil: emacs.stackexchange.com/questions/2935/how-can-i-bring-back-nil
Константин