バッファを削除するとは、Emacsに当該バッファの名前を忘れさせ、 それが使っていた場所を他の目的に使えるようにすることです。
削除されたバッファを表すバッファオブジェクトは、
それを指すものが存在する限り存在し続けますが、
それをカレントバッファにしたり表示できないように特別な印が付いています。
削除されたバッファの識別子は残っているので、
異なる2つのバッファを削除しても、
eq
に関する限りそれらは区別できるのです。
カレントバッファやウィンドウに表示しているバッファを削除すると、 そのかわりにEmacsは別のバッファを選択したり表示します。 つまり、バッファを削除すると一般にはカレントバッファが 替わりうることを意味します。 したがって、バッファを削除するときには、 (削除するバッファがカレントバッファではないことがわかっていない限り) カレントバッファを替える可能性についてあらかじめ注意しておく必要があります。 See Current Buffer。
複数の間接バッファの基底バッファであるバッファを削除すると、 間接バッファも自動的に削除されます。
削除されたバッファのbuffer-name
はnil
です。
これを使えばバッファが削除されているかどうか調べられます。
(defun buffer-killed-p (buffer) "Return t if BUFFER is killed." (not (buffer-name buffer)))
この関数はバッファbuffer-or-nameを削除し、 当該バッファが使用していたすべてのメモリを他の目的に使えるように解放したり、 オペレーティングシステムに返すために解放する。 この関数は
nil
を返す。当該バッファを
process-buffer
としているすべてのプロセスに シグナルSIGHUP
を送る。 このシグナルは、通常、プロセスを終了させる。 (SIGHUP
の基本的な意味は、接続回線が切断されたである。) see Deleting Processes。当該バッファがファイルを訪問していて、かつ、未保存の変更があれば、
kill-buffer
は当該バッファを削除するまえにユーザーに確認をとる。 確認をとらないようにするには、kill-buffer
を呼び出すまえに バッファの変更フラグをクリアしておく。 see Buffer Modification。削除済みのバッファを削除してもなんの効果もない。
(kill-buffer "foo.unchanged") ⇒ nil (kill-buffer "foo.changed") ---------- Buffer: Minibuffer ---------- Buffer foo.changed modified; kill anyway? (yes or no) yes ---------- Buffer: Minibuffer ---------- ⇒ nil
未保存の変更を確認したあとで、
kill-buffer
は、 リストkill-buffer-query-functions
の関数を現れる順に 引数なしで呼び出す。 これらの関数が呼び出されるときには、 削除対象のバッファがカレントバッファである。 これらの関数でさまざまな非標準的な理由から ユーザーの確認をとることが目的である。 いずれかがnil
を返すと、kill-buffer
はバッファを削除しない。
これは、
kill-buffer
が問い合わせをすべて完了し バッファを実際に削除する直前に実行されるノーマルフックである。 フック関数を実行するときには、削除対象のバッファがカレントバッファである。 see Hooks。