[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

26. バッファ

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Buffers"
"elisp/バッファ"へのコメント(無し)

バッファ(buffer)は、編集するテキストを収めている Lispオブジェクトです。 バッファは、訪問しているファイルのテキストを保持するために使われますが、 ファイルを訪問していないバッファもあります。 一度に複数のバッファが存在してかまいませんが、 ある時点ではたった1つのバッファがカレントバッファ (current buffer)として区別されます。 ほとんどの編集コマンドは、カレントバッファの内容に作用します。 カレントバッファを含む各バッファは、ウィンドウに表示されることも されないこともあります。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

26.1 バッファの基本

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Buffer%20Basics"
"elisp/バッファの基本"へのコメント(無し)

バッファ(buffer)は、編集するテキストを収めている Lispオブジェクトです。 バッファは、訪問しているファイルのテキストを保持するために使われますが、 ファイルを訪問していないバッファもあります。 一度に複数のバッファが存在してかまいませんが、 ある時点ではたった1つのバッファがカレントバッファ (current buffer)として区別されます。 ほとんどの編集コマンドは、カレントバッファの内容に作用します。 カレントバッファを含む各バッファは、ウィンドウに表示されることも されないこともあります。

Emacsの編集においてバッファとは、 異なる名前を持ち編集可能なテキストを保持するオブジェクトです。 バッファは、Lispプログラムには特別なデータ型として見えます。 バッファの内容は拡張可能な文字列であると考えることができます。 つまり、バッファのどの部分ででも挿入や削除を行えるのです。 See 節 31. テキスト

Lispのバッファオブジェクトには、さまざまな情報が含まれています。 変数を介してプログラマが直接参照できる情報もあれば、 特別目的の関数のみを介して参照できる情報もあります。 たとえば、訪問しているファイルの名前は、変数を介して直接参照できますが、 ポイントの値は基本関数を介してのみ参照できます。

直接参照可能なバッファに固有の情報は、 バッファローカル(buffer-local)な変数束縛、 つまり、特定のバッファでのみ有効な変数に保持されています。 この機能により、各バッファでは特定の変数の値を優先できます。 ほとんどのメジャーモードでは、このようにして、 fill-columncomment-columnなどの変数を優先させます。 バッファローカルな変数とそれらに関する関数について詳しくは、 10.10 バッファローカルな変数を参照してください。

バッファで訪問しているファイルに関する関数や変数については、 24.1 ファイルの訪問24.2 バッファの保存を参照してください。 ウィンドウにバッファを表示することに関する関数や変数については、 27.6 バッファとウィンドウを参照してください。

Function: bufferp object
この関数は、objectがバッファであればtを返し、 さもなければnilを返す。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

26.2 カレントバッファ

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Current%20Buffer"
"elisp/カレントバッファ"へのコメント(無し)

一般に、Emacsセッションには多くのバッファがあります。 いつの時点でも、それらの1つをカレントバッファ (current buffer)として区別します。 バッファ内のテキストを検査したり変更する基本関数は 暗黙のうちにカレントバッファに作用するため、 ほとんどの編集はカレントバッファに対して行われます (see 節 31. テキスト)。 通常、スクリーン上で選択されたウィンドウに表示されているバッファが カレントバッファですが、つねにそうとは限りません。 Lispプログラムでは、スクリーン上の表示は変えずに、 任意のバッファの内容を操作するために 一時的に当該バッファをカレントバッファにできます。

Lispプログラムでカレントバッファを指定するには、 set-bufferを呼び出します。 新たに指定し直すまで指定したバッファがカレントバッファであり続けます。

編集コマンドがエディタコマンドループへ戻ると、 コマンドループは、混乱を避けるために、選択されているウィンドウに 表示されているバッファをカレントバッファとします。 つまり、Emacsがコマンドを読むときにカーソルがあるバッファが コマンドが適用されるバッファです。 (See 節 20. コマンドループ。) したがって、set-bufferは、 ユーザーが編集できるように別のバッファへ切り替える方法にはなりません。 これには、27.7 ウィンドウへのバッファの表示で述べている関数を使う必要があります。

しかし、別のカレントバッファに替えるLisp関数では、 コマンドループがカレントバッファを あとで戻すということに依存してはいけません。 Emacs Lispで書かれた編集コマンドは、コマンドループに加えて 別のプログラムからも呼ばれます。 サブルーティンがカレントバッファを替えないほうが (それがサブルーティンの目的でなければ)、 呼び出し側にとっては便利です。 したがって、関数の実行が終るともとのカレントバッファに戻す フォームsave-current-buffersave-excursion(see 節 29.3 エクスカージョン)の内側で、 普通はset-bufferを使います。 例として、(説明文字列を簡略にして)コマンドappend-to-buffer のコードを示します。

 
(defun append-to-buffer (buffer start end)
  "Append to specified buffer the text of the region.
..."
  (interactive "BAppend to buffer: \nr")
  (let ((oldbuf (current-buffer)))
    (save-current-buffer
      (set-buffer (get-buffer-create buffer))
      (insert-buffer-substring oldbuf start end))))

この関数では、ローカル変数を束縛してカレントバッファを記録し、 save-current-bufferでそれがカレントバッファに戻るようにしています。 つぎに、set-bufferで指定したバッファをカレントバッファにします。 最後に、insert-buffer-substringでもとのカレントバッファから 指定された(いまはカレント)バッファに文字列をコピーします。

内容を付加したバッファがどれかのウィンドウに表示されていると、 つぎに表示を更新したときに変更されたテキストが表示されます。 それ以外では、スクリーン上でただちには変更を見ることはできません。 コマンドの実行中にはバッファが一時的にカレントバッファになりますが、 それによりそのバッファが表示されるわけではありません。

バッファローカルな束縛を持つ変数を(letや関数の引数で) ローカルに束縛する場合には、ローカルな束縛の有効範囲の開始時と終了時には、 同じバッファが必ずカレントバッファであるようにします。 さもないと、あるバッファでは変数を束縛し、 別のバッファではその束縛を解除してしまうことがあります。 これには2つの方法があります。 単純な場合には、束縛の有効範囲内で カレントバッファが替わらないを確認します。 さもなければ、save-current-buffersave-excursionを使って、 始めにカレントバッファであったバッファが、 変数束縛が解除されるときにはつねにカレントバッファであるようにします。

set-bufferでもとのカレントバッファに戻すのでは信頼性がありません。 正しくないバッファがカレントバッファであるときに 中断が起きると戻せないからです。 してはいけないことをつぎに示します。

 
(let (buffer-read-only
      (obuf (current-buffer)))
  (set-buffer ...)
  ...
  (set-buffer obuf))

つぎのようにsave-current-bufferを使えば、 通常の評価に加えて、中断、エラー、throwも扱えます。

 
(let (buffer-read-only)
  (save-current-buffer
    (set-buffer ...)
    ...))

Function: current-buffer
この関数はカレントバッファを返す。

 
(current-buffer)
     => #

Function: set-buffer buffer-or-name
この関数は、buffer-or-nameをカレントバッファにする。 この関数は現在選択されているウィンドウやその他のウィンドウに 当該バッファを表示しないので、ユーザーが当該バッファを見られるとは限らない。 しかし、Lispプログラムはいずれにしても当該バッファを操作できる。

この関数はbuffer-or-nameで指定されるバッファを返す。 buffer-or-nameが既存のバッファを指定しなければ、エラーを通知する。

Special Form: save-current-buffer body...
マクロsave-current-bufferは、 カレントバッファの識別子を保存し、フォームbodyを評価し、 最後にもとのカレントバッファに戻す。 戻り値は、bodyの最後のフォームの値である。 throwやエラー(see 節 9.5 非ローカル脱出)による異常終了であっても カレントバッファは戻される。

save-current-bufferから抜けるときに、 もとのカレントバッファとして使われていたバッファが削除されていると、 もちろん、カレントバッファにはならない。 そのかわりに、抜けるまえにカレントバッファであったバッファが カレントバッファであり続ける。

Macro: with-current-buffer buffer body...
マクロwith-current-bufferは、 カレントバッファの識別子を保存し、 bufferをカレントバッファにし、フォームbodyを評価し、 最後にもとのカレントバッファに戻す。 戻り値は、bodyの最後のフォームの値である。 throwやエラー(see 節 9.5 非ローカル脱出)による異常終了であっても カレントバッファは戻される。

Macro: with-temp-buffer body...
マクロwith-temp-bufferは、 一時的なバッファをカレントバッファとして フォームbodyを評価する。 カレントバッファの識別子を保存し、 一時的なバッファを作成してそれをカレントバッファにし、 フォームbodyを評価し、 最後にもとのカレントバッファに戻すとともに一時的なバッファを削除する。

戻り値は、bodyの最後のフォームの値である。 最後のフォームとして(buffer-string)を使えば、 一時的なバッファの内容を返せる。

throwやエラー(see 節 9.5 非ローカル脱出)による異常終了であっても カレントバッファは戻される。

24.4 ファイルへの書き出しwith-temp-fileも参照してください。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

26.3 バッファ名

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Buffer%20Names"
"elisp/バッファ名"へのコメント(無し)

各バッファには、文字列で一意な名前があります。 バッファに作用するほとんどの関数は、 引数としてバッファかバッファ名を受け付けます。 buffer-or-nameという名前の引数はこの種のものであり、 当該引数が文字列でもバッファでもないとエラーを通知します。 bufferという名前の引数は 実際のバッファオブジェクトである必要があり、名前ではだめです。

短命で一般にはユーザーが関心を示さないバッファの名前は空白で始まり、 コマンドlist-buffersbuffer-menuはそれらを表示しません。 さらに、空白で始まる名前のバッファでは、 アンドゥ情報の記録も最初は禁止してあります。 31.9 アンドゥを参照してください。

Function: buffer-name &optional buffer
この関数は、bufferの名前を文字列で返す。 bufferを指定しないと、デフォルトはカレントバッファである。

buffer-namenilを返す場合、 bufferが削除されたことを意味する。 see 節 26.10 バッファの削除

 
(buffer-name)
     => "buffers.texi"

(setq foo (get-buffer "temp"))
     => #
(kill-buffer foo)
     => nil
(buffer-name foo)
     => nil
foo
     => #

コマンド: rename-buffer newname &optional unique
この関数は、カレントバッファをnewnameと改名する。 newnameが文字列でなかったり、 当該名のバッファがすでに存在していると、エラーを通知する。 関数はnewnameを返す。

通常、newnameがすでに使われていると、 rename-bufferはエラーを通知する。 しかし、uniquenil以外であると、 newnameを未使用な名前に修正する。 対話的に呼び出した場合、数値前置引数を指定すると uniquenil以外になる。

このコマンドの1つの用途は、 バッファ`*shell*'を別の名前に改名して、 同じ`*shell*'という名前で別のシェルを作れるようにすることである。

Function: get-buffer buffer-or-name
この関数は、buffer-or-nameで指定したバッファを返す。 buffer-or-nameが文字列であり、 そのような名前のバッファが存在しなければnilを返す。 buffer-or-nameがバッファであればそれ自身を返す。 (これは有用ではないので、普通、引数は名前である。) 例を示す。

 
(setq b (get-buffer "lewis"))
     => #
(get-buffer b)
     => #
(get-buffer "Frazzle-nots")
     => nil

26.9 バッファの作成の関数get-buffer-createも参照。

Function: generate-new-buffer-name starting-name
この関数は、新たなバッファ向けの一意な名前を返すが、バッファは作成しない。 名前はstarting-nameで始まり、 `<...>'で囲った数を追加することで、 どのバッファでも現在使っていない名前を作成する。

26.9 バッファの作成の関連する関数generate-new-bufferを参照。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

26.4 バッファファイル名

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Buffer%20File%20Name"
"elisp/バッファファイル名"へのコメント(無し)

バッファファイル名(buffer file name)とは、 当該バッファで訪問しているファイルの名前です。 バッファでファイルを訪問していないときには、 バッファファイル名はnilです。 ほとんどの場面で、バッファ名は バッファファイル名の非ディレクトリ部分と同じですが、 バッファファイル名とバッファ名は別のものであり個別に設定できます。 See 節 24.1 ファイルの訪問

Function: buffer-file-name &optional buffer
この関数は、bufferで訪問しているファイルの 絶対ファイル名を返す。 bufferがファイルを訪問していなければ、 buffer-file-namenilを返す。 bufferを指定しないと、 デフォルトはカレントバッファである。

 
(buffer-file-name (other-buffer))
     => "/usr/user/lewis/manual/files.texi"

Variable: buffer-file-name
このバッファローカルな変数は、 カレントバッファで訪問しているファイルの名前を保持する。 あるいは、ファイルを訪問していなければnilである。 これは恒久的にバッファローカルであり、 kill-local-variablesに影響されない。

 
buffer-file-name
     => "/usr/user/lewis/manual/buffers.texi"

他のさまざまなことを行わずにこの変数の値だけを変更することは危険である。 通常、set-visited-file-name(下記参照)を使うほうがよい。 バッファ名を変更するなどの重要でないことも行うが、 Emacsを混乱させないように本質的なことも行うからである。

Variable: buffer-file-truename
このバッファローカルな変数は、 カレントバッファで訪問しているファイルの実名を保持する。 あるいは、ファイルを訪問していなければnilである。 これは恒久的にバッファローカルであり、 kill-local-variablesに影響されない。 see 節 24.6.3 実名

Variable: buffer-file-number
このバッファローカルな変数は、 カレントバッファで訪問しているファイルの ファイル番号とディレクトリ装置番号を保持する。 あるいは、ファイルを訪問していなければnilである。 これは恒久的にバッファローカルであり、 kill-local-variablesに影響されない。

この値は、通常、(filenum devnum)の形のリストである。 この数の対により、システム上のすべての参照可能なファイルを一意に識別できる。 これらについてより詳しくは、 24.6.4 ファイルに関する他の情報の関数file-attributesを参照。

Function: get-file-buffer filename
この関数は、ファイルfilenameを訪問しているバッファを返す。 そのようなバッファが存在しなければnilを返す。 引数filenameは文字列であり、 展開(see 節 24.8.4 ファイル名を展開する関数)してから すべてのバッファの訪問しているファイル名と比較する。

 
(get-file-buffer "buffers.texi")
    => #

稀れな状況では、複数のバッファが同じ名前のファイルを訪問している場合がある。 そのような場合、この関数はバッファリストで最初にみつかったバッファを返す。

コマンド: set-visited-file-name filename &optional no-query along-with-file
filenameが空でない文字列であると、 この関数はカレントバッファで訪問しているファイルの名前を filenameに変える。 (ファイルを訪問していないバッファでは、 当該バッファに訪問しているファイル名を指定する。) バッファをつぎに保存すると、指定した新たなファイルに保存される。 このコマンドは、バッファに変更済みと印を付ける。 変更まえの訪問しているファイルの内容とバッファ内容が一致していたとしても (Emacsにとっては) バッファ内容はfilenameの内容と一致しないからである。

filenamenilだったり空文字列であると、 『ファイルを訪問していない』ことにする。 この場合、set-visited-file-nameは、 当該バッファではファイルを訪問していないと印を付ける。

通常、この関数は、指定したファイルが既存の場合には ユーザーに確認をとる。 no-querynil以外であると、確認をとらない。

along-with-filenil以外であると、 それ以前に訪問していたファイルはfilenameと改名してあると仮定する。

関数set-visited-file-nameを対話的に呼び出すと、 ミニバッファでfilenameを問い合わせる。

Variable: list-buffers-directory
このバッファローカルな変数は、 訪問しているファイル名を持たないバッファに対して、 バッファ一覧において訪問しているファイル名を表示する部分に 表示する文字列を指定する。 diredのバッファはこの変数を使う。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

26.5 バッファの変更

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Buffer%20Modification"
"elisp/バッファの変更"へのコメント(無し)

Emacsは、各バッファごとに当該バッファのテキストを変更したかどうかを 記録する変更フラグ(modified flag)と呼ばれるフラグを保持しています。 バッファの内容が変わるたびにこのフラグはtに設定され、 保存するたびにnilに設定されます。 つまり、このフラグは未保存の変更があるかどうかを表します。 このフラグの値は通常モード行(see 節 22.3.2 モード行に使われる変数)に表示され、 保存(see 節 24.2 バッファの保存)と 自動保存(see 節 25.2 自動保存)を制御します。

このフラグを明示的に設定するLispプログラムもあります。 たとえば、関数set-visited-file-nameはこのフラグをtに設定します。 ファイルを訪問してから変更していなくても、 バッファのテキストが新たな訪問しているファイルとは一致しないからです。

バッファの内容を変更する関数については31. テキストに述べてあります。

Function: buffer-modified-p &optional buffer
この関数は、最後にファイルから読み込んだり保存してから バッファbufferが変更されていればtを返し、 さもなければnilを返す。 bufferを指定しないとカレントバッファを調べる。

Function: set-buffer-modified-p flag
この関数は、flagnil以外であれば カレントバッファは変更されていると印を付け、 nilならば未変更であると印を付ける。

この関数を呼び出した別の効果として、 カレントバッファのモード行を無条件に再表示する。 実際、関数force-mode-line-updateはつぎのようにしている。

 
(set-buffer-modified-p (buffer-modified-p))

コマンド: not-modified
このコマンドは、カレントバッファを未変更であり 保存する必要がないと印を付ける。 前置引数を指定すると、バッファに変更されていると印を付け、 以降の適当な場面で保存される。

エコー領域にメッセージを表示するので、 プログラムからこの関数を使わないこと。 かわりにset-buffer-modified-pを使う(上記)。

Function: buffer-modified-tick &optional buffer
この関数は、bufferの変更回数を返す。 変更回数はバッファを変更するたびに増やされる。 buffernilであると(あるいは省略すると)、 カレントバッファを使う。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

26.6 更新時刻の比較

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Modification%20Time"
"elisp/更新時刻の比較"へのコメント(無し)

ファイルを訪問してそのバッファで変更したとします。 そのあいだに、ディスク上の当該ファイル自身も変更されたとします。 ここでバッファを保存すると、ファイルの変更内容を上書きしてしまいます。 たしかにこれを望む場合もあるでしょうが、 普通は重要な情報を失うことになります。 そのため、Emacsは、ファイルに保存するまえに、 以下に述べる関数を用いてファイルの更新時刻を検査します。

Function: verify-visited-file-modtime buffer
この関数は、bufferに記録してある 訪問しているファイルの更新時刻と、 オペレーティングシステムが記録している ファイルの実際の更新時刻を比較する。 Emacsが当該ファイルを訪問したり保存してから 他のプロセスが当該ファイルに書いていない限り、 2つの時刻は同じはずである。

実際の更新時刻とEmacsに記録している更新時刻が同じならばtを返し、 さもなければnilを返す。

Function: clear-visited-file-modtime
この関数は、カレントバッファで訪問しているファイルの 最終更新時刻の記録を破棄する。 その結果、つぎにこのバッファを保存しようとしても、 ファイルの更新時刻のと不一致を報告しない。

この関数は、set-visited-file-nameや 変更されたファイルを上書きしないためのテストを行わない例外的な場面で 呼び出される。

Function: visited-file-modtime
この関数は、 バッファに記録されているファイルの最終更新時刻を (high . low)の形のリストで返す。 (これはfile-attributesが時刻を返すために使う形と同じである。 24.6.4 ファイルに関する他の情報を参照。)

Function: set-visited-file-modtime &optional time
この関数は、timenil以外であるときには、 バッファに記録してあるファイルの最終更新時刻を timeで指定された時刻にする。 さもなければ、訪問しているファイルの最終更新時刻にする。

timenilでないときには、 (high . low)(high low)の形であること。 いずれの場合も、2つの整数は時刻の16ビットを保持する。

この関数は、ファイルから普通に読み込んだのではないバッファや ファイル自体が明確な理由で変更された場合に有用である。

Function: ask-user-about-supersession-threat filename
この関数は、ファイルfilenameを訪問している廃れたバッファを 変更しようとしたときにどのように処理すべきかをユーザーに問い合わせる ために用いる。 廃れたバッファ(obsolete buffer)とは、 未変更のバッファではあるが、対応するディスク上のファイルが バッファの最終更新時刻よりも新しいものである。 つまり、別のプログラムが当該ファイルを変更した可能性があることを意味する。

ユーザーの応答に依存して、関数は正常に戻る。 その場合、バッファは変更できる。 あるいは、データ(filename)を付けて エラーfile-supersessionを通知する。 その場合、バッファの変更は許されない。

この関数は、適切な場面でEmacsが自動的に呼び出す。 これを再定義することでEmacsをカスタマイズできるようにしている。 標準定義についてはファイル`userlock.el'を参照。

24.5 ファイルロックのファイルロック機構も参照。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

26.7 読み出し専用バッファ

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Read%20Only%20Buffers"
"elisp/読み出し専用バッファ"へのコメント(無し)

バッファが読み出し専用(read-only)であると、 スクロールしたりナロイングしてその内容を眺めることはできますが、 その内容は変更できません。

読み出し専用バッファは、2種類の場面で使われます。

Variable: buffer-read-only
このバッファローカルな変数は、 バッファが読み出し専用であるかどうかを指定する。 この変数がnil以外であると、バッファは読み出し専用である。

Variable: inhibit-read-only
この変数がnil以外であると、 読み出し専用バッファや読み出し専用文字を変更できる。 バッファ内の読み出し専用文字とは (テキスト属性やオーバレイ属性の) 属性read-onlynil以外の文字である。 テキスト属性について詳しくは、see 節 31.19.4 特別な意味を持つ属性。 重ね合わせとそれらの属性について詳しくは、see 節 38.8 オーバレイ

inhibit-read-onlytであると、 すべての文字の属性read-onlyは効果を失う。 inhibit-read-onlyがリストであると、 文字の属性read-onlyが(eqで比較して) リストのメンバであると効果を失う。

コマンド: toggle-read-only
このコマンドは、カレントバッファが読み出し専用かどうかを変更する。 対話的な使用を意図しており、プログラムからは使わないこと。 プログラムの任意の箇所で、読み出し専用フラグを オンにしたいかオフにしたいかを読者は知っているはずであり、 そうすれば、読者はbuffer-read-onlytnilの正しい値に明示的に設定できる。

Function: barf-if-buffer-read-only
この関数は、カレントバッファが読み出し専用であると エラーbuffer-read-onlyを通知する。 カレントバッファが読み出し専用であるときに エラーを通知する別の方法については、see 節 20.3 対話的呼び出し



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

26.8 バッファリスト

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=The%20Buffer%20List"
"elisp/バッファリスト"へのコメント(無し)

バッファリスト(buffer list)は、 すべてのバッファのリストです。 バッファを作成すると当該バッファはこのリストに追加され、 削除するとこのリストから取り除かれます。 リスト内のバッファの順序は、各バッファが選択されているウィンドウに どの程度最近に表示されたかを主な基準にしています。 バッファが選択されるとリストの先頭に移動し、 隠されると(下記のbury-bufferを参照)末尾に移動します。 other-bufferをはじめとするいくつかの関数が、この順序を使います。 ユーザーに表示するバッファ一覧もこの順序を反映しています。

Emacs基本バッファリストに加えて、 各フレームには独自のバッファリストがあります。 そのリストでは、 当該フレームでもっとも最近に選択されたバッファから順に 当該フレームで選択されたバッファが先にきます。 (この順番は、フレームのフレームパラメータbuffer-listに入っている。 28.3.3 ウィンドウフレームのパラメータを参照。) 当該フレームで選択されたことがないバッファは、 Emacs基本バッファリストでの順にうしろに続きます。

Function: buffer-list &optional frame
この関数は、空白で始まる名前のバッファを含めて、 すべてのバッファを含んだバッファリストを返す。 要素は実際にバッファであり、それらの名前ではない。

frameがフレームであると、 この関数はフレームframeのバッファリストを返す。 framenilであるとEmacs基本バッファリストを使う。

 
(buffer-list)
     => (#
         # #
         # #)

;; ミニバッファの名前は空白で始まることに注意
(mapcar (function buffer-name) (buffer-list))
    => ("buffers.texi" " *Minibuf-1*" 
        "buffer.c" "*Help*" "TAGS")

buffer-listが返すリストはbuffer-listが構築したものであり、 Emacsの内部データ構造ではなく、 それを変更してもバッファの順序には影響しません。 フレーム独立なバッファリスト内のバッファ順序を変更するには、 つぎのような簡単な方法があります。

 
(defun reorder-buffer-list (new-list)
  (while new-list
    (bury-buffer (car new-list))
    (setq new-list (cdr new-list))))

この方法を使えば、どんな順序でもリストに指定でき、 しかも、バッファを失ったり正しくないバッファを 追加してしまう危険はありません。

フレームのバッファリストの順序や値を変更するには、 modify-frame-parameters(see 節 28.3.1 フレームパラメータの参照)で、 フレームのフレームパラメータbuffer-listに設定します。

Function: other-buffer &optional buffer visible-ok frame
この関数は、バッファリストからbuffer以外の最初のバッファを返す。 通常、当該バッファは、bufferを除いて (frameか現在選択されているフレームで) もっとも最近に選択されたバッファである。 空白で始まる名前のバッファは完全に除外する。

bufferを指定しないと(あるいはバッファでないと)、 other-bufferは、選択されているフレームのバッファリストの中から 可視フレームのどのウィンドウにも表示されていない最初のバッファを返す。

framenil以外のパラメータbuffer-predicateがあると、 other-bufferは当該述語を使って どのバッファを考慮に入れるかを決定する。 各バッファについて当該述語を1回呼び出し、 その値がnilであると当該バッファを無視する。 see 節 28.3.3 ウィンドウフレームのパラメータ

visible-oknilであると、 other-bufferは可視フレームのいずれかのウィンドウに 表示されているバッファを可能な限り返さないようにする。 visible-oknil以外であると、 バッファが表示されているかどうかは関係ない。

適当なバッファが存在しない場合には、 バッファ`*scratch*'を(必要ならば作成して)返す。

コマンド: bury-buffer &optional buffer-or-name
この関数は、バッファリストの他のバッファの順序は変えずに buffer-or-nameを末尾に置く。 この結果、当該バッファは、other-bufferが返す候補としては もっとも可能性が低くなる。

bury-bufferは、 Emacsのフレーム独立なバッファリストに加えて、 各フレームのパラメータbuffer-listも操作する。 したがって、指定したバッファは、 (buffer-list frame)(buffer-list nil)の いずれの値でも最後になる。

buffer-or-namenilであるか省略すると、 カレントバッファを最後尾に置くことを意味する。 さらに、当該バッファが選択されているウィンドウに表示されていると、 そのウィンドウでは(other-bufferで得られる) 別のバッファに切り替わる。 当該バッファが別のウィンドウにも表示されている場合、 その表示は替わらない。

すべてのウィンドウに表示している特定のバッファを置き換えるには、 replace-buffer-in-windowsを使う。 see 節 27.6 バッファとウィンドウ



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

26.9 バッファの作成

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Creating%20Buffers"
"elisp/バッファの作成"へのコメント(無し)

本節では、バッファを作成するための2つの基本関数を説明します。 get-buffer-createは、指定した名前のバッファが 存在しなければバッファを作成します。 generate-new-bufferは、つねに新たなバッファを作成し、 それに一意な名前を与えます。

バッファを作成するために読者が使える他の関数には、 with-output-to-temp-buffer(see 節 38.7 一時的な表示)、 create-file-buffer(see 節 24.1 ファイルの訪問)があります。 サブプロセスを開始してもバッファを作ります(see 節 36. プロセス)。

Function: get-buffer-create name
この関数は、nameという名前のバッファを返す。 その名前のバッファが存在すれば、当該バッファを返す。 さもなければ、新たなバッファを作成する。 バッファはカレントバッファにはならない。 この関数は、どのバッファがカレントバッファであるかは変更しない。

nameが文字列でないとエラーを通知する。

 
(get-buffer-create "foo")
     => #

新たなバッファのメジャーモードは基本(fundamental)モードに設定される。 変数default-major-modeは、より高いレベルで処理される。 see 節 22.1.3 メジャーモードの選択方法

Function: generate-new-buffer name
この関数は、新たに作成した空のバッファを返すが、 それをカレントバッファにはしない。 nameという名前のバッファが存在しなければ、 新たなバッファの名前はnameである。 その名前が使われている場合には、 この関数は、nを整数として`<n>'の形の接尾辞を nameに付加する。 nを2から始めて順に使える名前を探す。

nameが文字列でないとエラーを通知する。

 
(generate-new-buffer "bar")
     => #
(generate-new-buffer "bar")
     => #>
(generate-new-buffer "bar")
     => #>

新たなバッファのメジャーモードは基本(fundamental)モードに設定される。 変数default-major-modeは、より高いレベルで処理される。 see 節 22.1.3 メジャーモードの選択方法

26.3 バッファ名の関連する関数generate-new-buffer-nameを参照。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

26.10 バッファの削除

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Killing%20Buffers"
"elisp/バッファの削除"へのコメント(無し)

バッファを削除するとは、Emacsに当該バッファの名前を忘れさせ、 それが使っていた場所を他の目的に使えるようにすることです。

削除されたバッファを表すバッファオブジェクトは、 それを指すものが存在する限り存在し続けますが、 それをカレントバッファにしたり表示できないように特別な印が付いています。 削除されたバッファの識別子は残っているので、 異なる2つのバッファを削除しても、 eqに関する限りそれらは区別できるのです。

カレントバッファやウィンドウに表示しているバッファを削除すると、 そのかわりにEmacsは別のバッファを選択したり表示します。 つまり、バッファを削除すると一般にはカレントバッファが 替わりうることを意味します。 したがって、バッファを削除するときには、 (削除するバッファがカレントバッファではないことがわかっていない限り) カレントバッファを替える可能性についてあらかじめ注意しておく必要があります。 See 節 26.2 カレントバッファ

複数の間接バッファの基底バッファであるバッファを削除すると、 間接バッファも自動的に削除されます。

削除されたバッファのbuffer-namenilです。 これを使えばバッファが削除されているかどうか調べられます。

 
(defun buffer-killed-p (buffer)
  "Return t if BUFFER is killed."
  (not (buffer-name buffer)))

コマンド: kill-buffer buffer-or-name
この関数はバッファbuffer-or-nameを削除し、 当該バッファが使用していたすべてのメモリを他の目的に使えるように解放したり、 オペレーティングシステムに返すために解放する。 この関数はnilを返す。

当該バッファをprocess-bufferとしているすべてのプロセスに シグナルSIGHUPを送る。 このシグナルは、通常、プロセスを終了させる。 (SIGHUPの基本的な意味は、接続回線が切断されたである。) see 節 36.5 プロセスの削除。

当該バッファがファイルを訪問していて、かつ、未保存の変更があれば、 kill-bufferは当該バッファを削除するまえにユーザーに確認をとる。 確認をとらないようにするには、kill-bufferを呼び出すまえに バッファの変更フラグをクリアしておく。 see 節 26.5 バッファの変更

削除済みのバッファを削除してもなんの効果もない。

 
(kill-buffer "foo.unchanged")
     => nil
(kill-buffer "foo.changed")

---------- Buffer: Minibuffer ----------
Buffer foo.changed modified; kill anyway? (yes or no) yes
---------- Buffer: Minibuffer ----------

     => nil

Variable: kill-buffer-query-functions
未保存の変更を確認したあとで、kill-bufferは、 リストkill-buffer-query-functionsの関数を現れる順に 引数なしで呼び出す。 これらの関数が呼び出されるときには、 削除対象のバッファがカレントバッファである。 これらの関数でさまざまな非標準的な理由から ユーザーの確認をとることが目的である。 いずれかがnilを返すと、kill-bufferはバッファを削除しない。

Variable: kill-buffer-hook
これは、kill-bufferが問い合わせをすべて完了し バッファを実際に削除する直前に実行されるノーマルフックである。 フック関数を実行するときには、削除対象のバッファがカレントバッファである。 see 節 22.6 フック

Variable: buffer-offer-save
この変数が特定のバッファでnil以外であると、 save-buffers-kill-emacssave-some-buffersに対して ファイルを訪問しているバッファと同様に 当該バッファを保存する機会を与えるように指示する。 変数buffer-offer-saveに 設定すると自動的にバッファローカルになる。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

26.11 間接バッファ

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Indirect%20Buffers"
"elisp/間接バッファ"へのコメント(無し)

間接バッファ(indirect buffer)は、 間接バッファの基底バッファ(base buffer)と呼ばれる 他のバッファのテキストを共有します。 ある意味で、バッファにおいて ファイルのシンボリックリンクに相当するものです。 基底バッファそのものは間接バッファであってはなりません。

間接バッファのテキストは、その基底バッファのテキストとつねに同一です。 どれかを編集して変更すると、別のものでただちに見えます。 これには、文字そのものに加えてテキスト属性も含みます。

しかし、それ以外に関しては、間接バッファと その基底バッファは完全に別のものです。 別の名前を持ち、ポイントの値も別であり、異なったナロイングをでき、 (いずれかのバッファでテキストを挿入したり削除すると マーカと重ね合わせは再配置されるが)マーカやオーバレイも異なり、 異なるメジャーモードを持ち、バッファローカルな変数も異なります。

間接バッファはファイルを訪問できませんが、その基底バッファでは訪問できます。 間接バッファを保存しようとすると、実際にはその基底バッファを保存します。

間接バッファを削除しても、その基底バッファには影響ありません。 基底バッファを削除すると、その間接バッファを実質的には削除することになり、 間接バッファをカレントバッファにはけっしてできなくなります。

コマンド: make-indirect-buffer base-buffer name
base-bufferを基底バッファとするnameという名前の 間接バッファを作成する。 引数base-bufferは、バッファか文字列である。 base-bufferが間接バッファであると、 その基底バッファを新たなバッファの基底バッファとして用いる。

Function: buffer-base-buffer buffer
この関数はbufferの基底バッファを返す。 bufferが間接バッファでなければ、値はnilである。 さもなければ、値は間接バッファではない別のバッファである。


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]