Emacs 只写缓冲区?

Emacs 只写缓冲区?,emacs,elisp,advising-functions,defadvice,Emacs,Elisp,Advising Functions,Defadvice,我想模仿大多数控制台在缓冲区中的工作方式,有什么方法可以做到这一点吗?也就是说,只允许向缓冲区添加文本,而不允许删除 也许我可以禁用或建议一些删除字符的内置函数,但恐怕这不是一个非常可扩展的解决方案。。。我可能会错过一些。我相信您希望在插入文本时设置文本的只读属性,请参见前面提到的,您可以设置只读文本属性。或者更简单地说,您可以设置buffer read only变量,然后编写一些命令来覆盖它。例如(保证100%未经测试的代码): 如本例所示,文本的只读性可以由命令覆盖,因此即使是只读文本属性也

我想模仿大多数控制台在缓冲区中的工作方式,有什么方法可以做到这一点吗?也就是说,只允许向缓冲区添加文本,而不允许删除


也许我可以禁用或建议一些删除字符的内置函数,但恐怕这不是一个非常可扩展的解决方案。。。我可能会错过一些。

我相信您希望在插入文本时设置文本的
只读属性,请参见前面提到的,您可以设置只读文本属性。或者更简单地说,您可以设置
buffer read only
变量,然后编写一些命令来覆盖它。例如(保证100%未经测试的代码):

如本例所示,文本的只读性可以由命令覆盖,因此即使是
只读
文本属性也不能保证100%的文本永远不会被修改,但是很少有命令覆盖只读信息,因此在实践中这应该不是一个严重的问题

另一种方法是在更改函数之前使用
,如果修改发生在EOB之前,则从中发出错误信号。可能是更好的方法:

(defun append-only-b-c-f (beg end)
  (if (< beg (point-max)) (error "Can't modify text: append-only!")))

(define-derived-mode append-only-mode nil "Append-Only"
  "Here's the doc."
  (add-hook 'before-change-functions #'append-only-b-c-f nil 'local))
(defun append-only-b-c-f(beg-end)
(如果(
事实上,这是一个问题。FWIW,wid-edit.el使用以下技巧来解决此问题:它们
(添加hook'post command hook'widget add change nil t)
在发出错误信号之前,其中
widget add change
在更改函数之前将函数重新添加到
(defun append-only-b-c-f (beg end)
  (if (< beg (point-max)) (error "Can't modify text: append-only!")))

(define-derived-mode append-only-mode nil "Append-Only"
  "Here's the doc."
  (add-hook 'before-change-functions #'append-only-b-c-f nil 'local))