Next: , Previous: , Up: Practicing Evaluation   [Contents][Index]


2.1 Buffer Names

ファイルとバッファーとの違いを示してくれるのが、buffer-namebuffer-file-nameという2つの関数です。(buffer-name)という式を評価すると、バッファーの名前がエコーエリアに表示されます。(buffer-file-name)を評価すれば、そのバッファーが参照するファイルの名前がエコーエリアに表示されます。(buffer-name)がリターンする名前は、通常ならそのバッファーが参照しているファイルの名前と同じですが、(buffer-file-name)がリターンする名前はそのファイルのフルパス名です。

ファイルとバッファーは2つの異なるエンティティです。ファイルとは(削除しないかぎり)コンピューターに永続的に記録される情報であり、その一方でバッファーとはEmacs内部の情報であって、その編集セッションの終了時(あるいはバッファーをkillしたとき)には消え去ってしまうでしょう。バッファーには通常ならファイルからコピーした情報が含まれています。わたしたちはこのことを、バッファーがそのファイルをvisit(訪問)していると表現しています。あなたが作業や変更を行うのはこのコピーです。バッファーを変更しても、バッファーを保存しなければファイルは変更されません。バッファーの保存時にはそのバッファーがファイルにコピーされるので、永続的に保存されることになります。

GNU Emacs内部のInfoでこれを読んでいる場合には以下のそれぞれの式の後にカーソルを配置してC-x C-eをタイプすることによって評価できます。

(buffer-name)

(buffer-file-name)

わたしがInfoでこれを行った際には、(buffer-name)を評価してリターンされた値は"*info*"(buffer-file-name)を評価してリターンされた値はnilでした。

一方この文書の記述中には(buffer-name)の評価によって"introduction.texinfo"(buffer-file-name)の評価によって"/gnu/work/intro/introduction.texinfo"という値がリターンされました。

前者はバッファー名、後者がファイル名です。Infoでのバッファー名は"*info*"です。Infoは何のファイルも指し示していないので、(buffer-file-name)を評価した結果はnilです。シンボルnilは“nothing(何もない)”に相当するラテン語の単語が由来です。この場合だと、バッファーは何のファイルにも関連付けられていないということを意味しています(Lispにおいてnilは“false(偽)”を表すためにも使用されており、空のリスト()と同義です)。

記述中のわたしのバッファーの名前は"introduction.texinfo"、そのバッファーが指し示すファイル名が"/gnu/work/intro/introduction.texinfo"です。

(この式の中にあるカッコはbuffer-namebuffer-file-nameを関数として扱うようLispインタープリターに伝えるためのものです。これらのカッコがなければインタープリターはこれらのシンボルを変数として評価しようと試みるでしょう。Variablesを参照してください。)

ファイルとバッファーは別物であるにも関わらず、バッファーという意味でファイル、あるいは逆の意味でファイルをバッファーと呼ぶ人たちを、あなたは頻繁に目にすることになるでしょう。たしかにほとんどの人たちは“すぐにファイルに保存するつもりのバッファーを編集している”ではなく、“ファイルを編集している”と言います。その人たちの意図するところは、ほとんど常に明解です。しかしコンピューターは人間のようにスマートではないので、コンピュータープログラムを扱う際には、これらの区別の重要性を念頭に置いておくことが大事です。

ちなみに“バッファー(buffer)”とは、クッションという衝突の際の衝撃を弱める単語に由来する用語です。コンピューター創成期において、ファイルとコンピューターの中央演算処理装置(CPU)との間のやり取りにたいするクッションとしての役目を果たしていたのがバッファーです。ファイルを保持する磁気ドラムや磁気テープと中央演算処理装置は、互いにまったく異なる独自のスピードで突発的に動作する器機でした。これらが効果的に動作することを可能にしたのがバッファーです。バッファーが一時的な保管場所という仲介者から作業が行われる場所へと成長を遂げるのは必然でした。これは小さな港が巨大都市へと変遷していくことに似ています。かつて港とは船に貨物を積み込む前に一時的に保管する倉庫の場所に過ぎませんでしたが、その後それ自体がビジネスとカルチャーの中心地となっていったのです。

すべてのバッファーがファイルに関連付けられている訳ではありません。たとえば*scratch*は何のファイルもvisitしておらず、*Help*バッファーも同様です。

昔は~/.emacsファイルなし、ファイル名の指定もなしでemacsコマンド単独でEmacsセッションを開始した際には、*scratch*バッファーを表示してEmacsが起動していました。現在ではスプラッシュスクリーンスクリーンを目にすることになるでしょう。このスプラッシュスクリーンで提案されるいずれかのコマンドにしたがう、あるいはファイルをvisitしたりqでスプラッシュスクリーンを閉じて*scratch*バッファーへと至ることもできるのです。

*scratch*バッファーに切り替えたら(buffer-name)とタイプしてから、その後ろにカーソルを配置してC-x C-eとタイプして式を評価してください。名前"*scratch*"がリターンされてエコーエリアに表示されるでしょう。このバッファーの名前は"*scratch*"です。*scratch*バッファーで(buffer-file-name)とタイプして評価するとnilがエコーエリアに表示されます。これはInfoで(buffer-file-name)を評価した場合と同じです。

ちなみに*scratch*バッファーにいる場合に、式からリターンされた値をエコーエリアではなく*scratch*バッファーそのものにプリントされるようにしたければ、C-x C-eではなくC-u C-x C-eとタイプしてください。これによりリターンされた値がその式の後にプリントされます。バッファーの見た目は以下のようになるでしょう:

(buffer-name)"*scratch*"

Infoは読み取り専用でバッファー内容の変更はできないので、これを行うことはできません。しかし変更可能なバッファーにたいしてはこれを行うことができるので、コードや(この本のような)ドキュメントを記述する際には、この機能は非常に役に立ちます。

This page has generated for branch:work/add_lispintr, commit:65845cf60c073f2f3182d1d07483530e9bbe1d96 to check Japanese translation.