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 にします。

使い道は

  1. let で一時的に t にするか
  2. setq-local でバッファローカル変数にすることです。

間違っても

(setq inhibit-read-only t)

と設定ファイルには
書かないようにしてください。

この変数は一時的に有効にすることが
本来の意図です。

setq で設定してしまうと、
本来の書き込み禁止が
機能しなくなってしまいます。

setq-local
inhibit-read-only を設定している例は
mylisp-english-reading.el です。

英語を読むために
元のバッファの内容をコピーし、
同じメジャーモードにしていますが、

元のバッファが書き込み禁止だと
改行できなくなってしまいます。

そこで英語読み専用バッファでは
inhibit-read-only
バッファローカルで t にしています。

奥の手ですが、
Emacs Lispプログラマならば
知っておいて損はありません。

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。