有没有一种方法可以禁用“缓冲区为只读”警告?


9

我发现此警告不是特别有用,并且不会分散注意力,因为它会在回声区域中暂时隐藏当前文本。似乎也没有必要,因为无论如何我都会注意到我无法在只读区域中写入。有没有办法禁用它?

Answers:


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值会影响所有错误,而不仅仅是“缓冲区只读”错误?我无法确切地知道所有这些更改将对源代码产生什么影响。
Kaushal Modi

1
是的,会的。这就是我(when ...)在代码段中包含表单的原因:通过这种方式,我们不在乎的信号将传递到默认处理程序并被buffer-read-only忽略。
君士坦丁

好的,我完全错过了打给的电话command-error-default-function
Kaushal Modi

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,我们可以在elisp中覆盖C函数。谢谢!
Kaushal Modi

关于使用elisp进行修改:这使我想起了一个关于以下问题的老问题nilemacs.stackexchange.com/questions/2935/how-can-i-bring-back-nil
Constantine
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.