Буфер только для записи?

Я хотел бы подражать тому, как большинство консолей работают в буфере, есть ли способ сделать это? Т.е. разрешить только добавление текста в буфер, но не удаление?

Возможно, я мог бы отключить или посоветовать некоторые встроенные функции, которые удаляют символы, но я боюсь, что это не очень масштабируемое решение... Я мог пропустить некоторые.

2 ответа

Решение

Как уже упоминалось, вы можете установить текстовое свойство только для чтения. Или проще, вы можете установить 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 не гарантирует 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 свойство текста как он вставлен, см. специальные свойства

Другие вопросы по тегам