我正在 Emacs 中工作,然后突然, slime-repl sbcl 说文本是只读的。嗯,这很好,因为现在我无法在其中输入任何内容。我该如何解决这个问题?
“缓冲区是只读的”可以通过
C-x C-q
解决,但正如 Drew 和 phils 所说,Emacs Lisp 手册 > elisp.info > 文本 > 文本属性 > 特殊属性
Since changing properties counts as modifying the buffer, it is not
possible to remove a `read-only' property unless you know the
special trick: bind `inhibit-read-only' to a non-`nil' value and
then remove the property. *Note Read Only Buffers::.
从而擦除整个缓冲区:
M-: (let ((inhibit-read-only t)) (erase-buffer)) RET
或删除所有属性:
(let ((inhibit-read-only t)) (set-text-properties (point-min) (point-max) ()))
我无法提供任何见解来解释为什么您最终会得到不需要的只读文本属性,但我偶尔会遇到类似的情况,因此发现以下命令很有用。
选择有问题的区域(或 C-xh 表示整个缓冲区),然后运行 M-x
set-region-writeable
以删除只读文本属性。
(defun set-region-writeable (begin end)
"Removes the read-only text property from the marked region."
;; See http://stackoverflow.com/questions/7410125
(interactive "r")
(let ((modified (buffer-modified-p))
(inhibit-read-only t))
(remove-text-properties begin end '(read-only t))
(set-buffer-modified-p modified)))
出现此类消息的可能原因是:您正在尝试通过 REPL 提示打印某些内容,例如
CL-US|ER> (+ 1 2)
。 SLIME 缓冲区中的文本是只读的。注意>
后面的空格,它是提示的部分。
尝试输入
C-c M-o RET
(它将清除控制台并添加新行),我遇到了与您类似的问题,并已修复它。
我通过首先打开两个框架解决了这个问题,一个打开了 .lisp 文件,另一个打开了 slime-repl。
在包含 .lisp 文件的框架中,我在一行代码上应用了 C-c C-j(例如 (+ 1 2))。
这会将代码行复制到 slime-repl 并对其进行评估。
这也以某种方式解决了“文本只读”问题。
问:我怎么不小心得到了一个读写缓冲区,其中有几行是只读的?答:通过
(insert-buffer "*Occur*")
问:我是如何使用技术含量低但易于记忆的解决方案来解决这个问题的?答:
C-x C-v
,运行命令find-alternate-file
。是的,我只是编写了该文件,然后再次从磁盘重新打开它。所有这些奇怪的属性都会在这个过程中得到净化。
您可以通过以下操作更改只读模式:
M-x
-> toggle-read-only
-> RET
(换句话说,按 Enter)