只写缓冲区?

时间:2012-11-14 18:58:48

标签: emacs elisp advising-functions defadvice

我想模仿大多数控制台在缓冲区中工作的方式,有没有办法做到这一点?即只允许将文本附加到缓冲区,但不能删除?

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

2 个答案:

答案 0 :(得分:4)

如上所述,您可以设置只读text-property。或者更简单地说,您可以设置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 text-property也不能保证100%文本永远不会被修改,但是相当少的命令会覆盖只读信息,因此在实践中它不应该是一个严重的问题。

如果修改发生在EOB之前,另一种方法是使用before-change-functions并从那里发出错误信号。可能是一个更好的方法:

(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))

答案 1 :(得分:2)

我认为您希望在插入文本时设置read-only属性,请参阅special properties