问题 (Emacs)文字是只读的吗?


所以我在emacs工作,突然间,slime-repl sbcl说文本是只读的。那很好,因为现在我不能输入任何东西。我该如何解决?


13095
2017-07-04 00:17


起源

C-x C-q 是如何启用或禁用只读模式。然而,我不太愿意将其作为答案发布,因为您可能更有兴趣知道可能导致该行为的原因并且我对您提到的库不熟悉。 - lawlist
@lawlist我会说继续并建议它作为答案,至于 如何禁用只读 在缓冲区。 OP总是可以搜索更多,以找出缓冲区突然变为只读的原因。这是一个单独的问题(至少在这里提供了更多信息来回答它)。 - Drew
如果它说“text”是只读的(而不是“缓冲区”),那么可能有一个 read-only 文字属性有效吗? - phils
@Drew“Buffer is read only”与“text is read-only”有很大不同。该 C-x C-q 命令切换“缓冲区是只读的”而没有任何东西似乎改变“文本是只读的”,我进入,因为我的手指按错了键(我不知道我击中了哪个键)。现在我必须重新启动SLIME并丢失我的工作。 :( - Throwaway Account 3 Million
是的,如果它说“文本是只读的”(这意味着错误 text-read-only)然后点上的文本上有一个只读文本属性。 Elisp手册,节点 Special Properties,这说:“由于更改属性计为修改缓冲区,因此无法删除 read-only 属性,除非你知道特殊技巧:绑定 inhibit-read-only 到非nil 值然后删除属性。 *注意只读缓冲区。“ - Drew


答案:


“缓冲区是只读的”可以通过治愈 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) ()))

10
2018-06-18 04:16



这是唯一能够理解它不是只读缓冲区的答案,因此C-x C-q根本无法解决问题。 - JaviMerino
这才是真正的答案 - Geradlus_RU
对于新的emacs用户,上面的devon正在运行命令:eval-expression。它的默认键定义是M- :(通常为escape-colon)。运行eval-expression后,它会提示您输入(或粘贴)lisp表达式到迷你缓冲区并点击<return> - AAAfarmclub


这种消息的可能原因可能是:例如,您正在尝试通过REPL提示打印某些内容 CL-US|ER> (+ 1 2)。 SLIME缓冲区中的此文本是只读的。注意后面的空格 >,这是提示的一部分。


3
2017-07-04 11:46





我无法提供任何见解 为什么 你最终得到了不受欢迎的只读文本属性,但我偶尔遇到类似的情况,因此找到以下命令很有用。

选择有问题的区域(或 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)))

1
2018-03-16 08:41





键盘快捷键 C-x C-q 是默认绑定 read-only-mode,可以使用该快捷方式启用或禁用。用它来描述键盘快捷键序列 C-h k C-x C-q 产生以下缓冲区打印输出:

C-x C-q runs the command read-only-mode, which is an interactive
compiled Lisp function in `simple.el'.

It is bound to C-x C-q.

(read-only-mode &optional ARG)

Change whether the current buffer is read-only.
With prefix argument ARG, make the buffer read-only if ARG is
positive, otherwise make it writable.  If buffer is read-only
and `view-read-only' is non-nil, enter view mode.

Do not call this from a Lisp program unless you really intend to
do the same thing as the C-x C-q command, including
possibly enabling or disabling View mode.  Also, note that this
command works by setting the variable `buffer-read-only', which
does not affect read-only regions caused by text properties.  To
ignore read-only status in a Lisp program (whether due to text
properties or buffer state), bind `inhibit-read-only' temporarily
to a non-nil value.

因此,调用该选项的另一种方法是使用: M-x read-only-mode RET


0
2017-07-04 03:04





您可以通过执行以下操作来更改只读模式: M-x  - > toggle-read-only  - > RET (换句话说按回车键)


0
2017-07-04 11:07





我通过首先打开两个帧来解决这个问题,一个打开了.lisp文件,另一个打开了slime-repl。

从带有.lisp文件的帧开始,我在一行代码上应用了C-c C-j(例如(+ 1 2))。

这会将代码行复制到slime-repl并对其进行评估。

这也以某种方式解决了“文本只读”问题。


0
2018-03-16 07:02





尝试输入 C-c M-o RET (它将清除控制台并添加一个新行),我遇到了类似于你的问题,并修复了它。


0
2017-10-14 22:25