(Emacs)文本是否为只读?

(Emacs)文本是否为只读?,emacs,lisp,sbcl,slime,Emacs,Lisp,Sbcl,Slime,所以我在emacs工作,突然,slime repl sbcl说文本是只读的。那太好了,因为现在我不能在里面输入任何东西。如何修复?键盘快捷键C-x C-q是只读模式的默认绑定,可以使用该快捷键启用或禁用。使用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

所以我在emacs工作,突然,slime repl sbcl说文本是只读的。那太好了,因为现在我不能在里面输入任何东西。如何修复?

键盘快捷键C-x C-q是只读模式的默认绑定,可以使用该快捷键启用或禁用。使用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只读模式RET

您可以通过执行以下操作来更改只读模式:M-x->toggle read only->RET换言之,按enter键。出现此消息的可能原因可能是:您正试图通过REPL提示符打印某些内容,例如CL-US | ER>+12。SLIME缓冲区中的此文本是只读的。请注意>后面的空格,它是提示的一部分。

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

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

从带有.lisp文件的框架中,我在一行代码上应用了C-C-j,例如+1 2

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


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

我无法解释为什么会出现不需要的只读文本属性,但我偶尔会遇到类似情况,因此发现以下命令很有用

为整个缓冲区选择有问题的区域或C-xh,然后运行M-x set region WRITABLE以删除只读文本属性

取消设置区域可写开始结束 从标记区域中删除只读文本属性。 ;; 看见http://stackoverflow.com/questions/7410125 交互式r 设修改缓冲区-modified-p 禁止只读 删除文本属性开始结束只读t set-buffer-modified-p modified
试着键入C-C M-o RET它将清除控制台并添加新行,我遇到了一个与您类似的问题,并对此进行了修复。

C-x C-q是如何启用或禁用只读模式的。然而,我还不愿意把它作为一个答案发布,因为你可能更想知道是什么导致了这种行为,而我对你提到的库并不熟悉。@lawlist我想说,继续吧,并建议它作为一个答案,关于如何禁用缓冲区中的只读。OP总是可以搜索更多,以找出为什么缓冲区突然变为只读。这是一个单独的问题,至少在这里提供更多的信息来回答之前。如果它说文本是只读的而不是缓冲区,那么可能有一个只读的文本属性在起作用?@Drew buffer is read only与text is read only有很大的不同。C-x C-q命令将缓冲区切换为只读,而似乎没有任何内容更改文本为只读,这是因为我的手指按错了键,我不知道我按的是哪个键。现在我必须重新启动SLIME并丢掉我的工作是的,如果它说文本是只读的,这意味着错误文本是只读的,那么此时的文本具有只读文本属性。Elisp手册node中说:由于更改属性被视为修改缓冲区,因此不可能删除只读属性,除非您知道特殊技巧:将禁止只读绑定到非nil值,然后删除该属性*注意只读缓冲区。这是唯一一个理解它不是只读缓冲区的答案,因此C-x C-q根本不能解决问题。这是新emacs用户的真正答案,上面的devon正在运行命令:eval expression。它的默认键定义是M-:通常是转义冒号。运行eval expression后,它会提示您输入lisp表达式或将其粘贴到迷你缓冲区中,然后点击“我更喜欢这个答案”,而不是这个线程上最流行的答案。这真的很容易打开我的暂存缓冲区,粘贴在这段代码中,评估它,然后切换回有问题的缓冲区。然后标记区域,然后M-x set-region-writable。有关此函数的稍微改进版本,请参阅。