ほとんどのコンソールがバッファーでどのように機能するかを模倣したいのですが、それを行う方法はありますか?つまり、バッファへのテキストの追加のみを許可し、削除は許可しませんか?
おそらく、文字を削除するいくつかの組み込み関数を無効にするかアドバイスすることができますが、これはあまりスケーラブルなソリューションではないのではないかと思います...いくつかを見逃す可能性があります。
ほとんどのコンソールがバッファーでどのように機能するかを模倣したいのですが、それを行う方法はありますか?つまり、バッファへのテキストの追加のみを許可し、削除は許可しませんか?
おそらく、文字を削除するいくつかの組み込み関数を無効にするかアドバイスすることができますが、これはあまりスケーラブルなソリューションではないのではないかと思います...いくつかを見逃す可能性があります。
前述のように、読み取り専用のテキストプロパティを設定できます。または、もっと簡単に、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
挿入時にテキストにプロパティを設定したいと思います。特別なプロパティを参照してください