buffer-name 関数はバッファの 名前
を返します。バッファ 自体 を取得するには、別の関数である current-buffer 関数が必要です。コード内でこの関数を使用すると、バッファ自体が得られます。
名前と、その名前が指し示す対象や実体は、互いに異なるものです。あなたはあなた自身の名前ではありません。あなたは、他者が名前で呼ぶ「人」なのです。もしジョージと話したいと伝え、誰かが
‘G’、‘e’、‘o’、‘r’、‘g’、‘e’
という文字が書かれたカードを差し出してきたとしたら、面白がるかもしれませんが、満足することはないでしょう。あなたが話したいのは名前ではなく、その名前が指し示す人物なのです。バッファも同様です。スクラッチバッファの名前は
*scratch*
ですが、その名前がバッファそのものではありません。バッファ自体を取得するには、current-buffer のような関数を使用する必要があります。
ただし、少々厄介な点があります。ここで行うように、式の中で current-buffer
を単独で評価した場合、表示されるのはバッファの内容を含まない、バッファ名の表示形式となります。Emacs
がこのような仕様になっているのには2つの理由があります。一つは、バッファが数千行に及ぶことがあり、便利に表示するには長すぎるためです。もう一つは、別のバッファが同じ内容でありながら異なる名前を持っている場合があり、それらを区別することが重要だからです。
関数を含む式は以下の通りです。
(current-buffer)
EmacsのInfoでこの式を通常通り評価すると、エコーエリアに#<buffer *info*>が表示されます。この特殊な書式は、単に名前を返すのではなく、バッファそのものを返すことを示しています。
ちなみに、プログラムに数値や記号を入力することはできますが、バッファの出力結果に対してはそれはできません。バッファ自体を取得する唯一の方法は、current-bufferのような関数を使うことです。
関連する機能に other-buffer
があります。これは、現在開いているバッファ以外で、直近に選択されたバッファを返すものであり、その名前を文字列として出力するものではありません。最近
*scratch* バッファとの切り替えを繰り返した場合、other-buffer はそのバッファを返します。
この式を評価することで、確認できます:
(other-buffer)
エコー領域に #<buffer *scratch*> が表示されるか、あるいは直近で切り替えてきた別のバッファ名が表示されるはずです6。