我想模仿大多数控制台在缓冲区中的工作方式,有什么办法吗?即只允许将文本附加到缓冲区,但不能删除?
可能我可以禁用或建议一些删除字符的内置功能,但恐怕这不是一个非常可扩展的解决方案......我可能会错过一些。
我想模仿大多数控制台在缓冲区中的工作方式,有什么办法吗?即只允许将文本附加到缓冲区,但不能删除?
可能我可以禁用或建议一些删除字符的内置功能,但恐怕这不是一个非常可扩展的解决方案......我可能会错过一些。
如前所述,您可以设置只读文本属性。或者更简单地说,您可以设置buffer-read-only
变量,然后编写一些覆盖它的命令。例如(保证 100% 未测试的代码提前):
(defun append-only-s-i-c ()
(let ((inhibit-read-only (eobp)))
(call-interactively 'self-insert-command)))
(defvar append-only-mode-map
(let ((map (make-sparse-keymap)))
(define-key map [remap self-insert-command] 'append-only-s-i-c)
map))
(define-derived-mode append-only-mode nil "Append-Only"
"Here's the doc."
(set (make-local-variable 'buffer-read-only) t))
正如这个例子所展示的,文本的只读性可以被命令覆盖,所以即使是read-only
文本属性也不能保证 100% 的文本永远不会被修改,但是相当少的命令会覆盖只读信息,因此在实践中它不应该是一个严重的问题。
before-change-functions
如果修改发生在 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))
我相信您想在read-only
插入文本时设置该属性,请参阅特殊属性