Emacsを使っていて、
文字入力しようとしたら
Text is read-only
とエラーメッセージが
出たことがありますよね?
これはバッファが
書き込み禁止だからです。
書き込み禁止は
- view-mode
- help-mode
など、バッファに書き込むことを意図しない
メジャーモード・マイナーモードで
設定されます。
バッファ全体において
書き込み禁止にするには
変数 buffer-read-only
を
t
にします。
一方で、
テキストプロパティによって
バッファの一部分のみ
書き込み禁止にもできます。
たとえば twittering-mode
を使って
ツイートするときにポップアップされる
*twittering-edit*バッファです。
Keymap: M-x twittering-edit-post-status: send a tweet C-c C-k: cancel a tweet C-c C-r: toggle a normal tweet and a reply. M-n: next history element M-p: previous history element <f4>: shorten URL at point ---- text above this line is ignored ---- ここから書き込める
このバッファは
Keymapの行から
----の行までは
書き込み禁止になっています。
ですが、特殊な事情で
「書き込み禁止」の意図を
破りたいこともあります。
この場合は
変数 inhibit-read-only
を
t
にします。
使い道は
let
で一時的にt
にするかsetq-local
でバッファローカル変数にすることです。
間違っても
(setq inhibit-read-only t)
と設定ファイルには
書かないようにしてください。
この変数は一時的に有効にすることが
本来の意図です。
setq
で設定してしまうと、
本来の書き込み禁止が
機能しなくなってしまいます。
setq-local
で
inhibit-read-only
を設定している例は
mylisp-english-reading.el です。
英語を読むために
元のバッファの内容をコピーし、
同じメジャーモードにしていますが、
元のバッファが書き込み禁止だと
改行できなくなってしまいます。
そこで英語読み専用バッファでは
inhibit-read-only
を
バッファローカルで t
にしています。
奥の手ですが、
Emacs Lispプログラマならば
知っておいて損はありません。
本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。