@c -*-texinfo-*-
@c This is part of the GNU Emacs Lisp Reference Manual.
@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
@c See the file elisp-jp.texi for copying conditions.
@c 日本語翻訳: 林 宏雄 <hayashi@pdcd.ilab.toshiba.co.jp>
@c 複製の条件はelisp-jp.texiに書いてあります。
@setfilename ../info/buffers-jp
@clear jp-draft
@node Buffers, Windows, Backups and Auto-Saving, Top
@chapter バッファ
@cindex buffer
@cindex バッファ[ばっふぁ]

  @dfn{バッファ(buffer)}は、編集するテキストを格納するLispオブジェクトで
す。通常、バッファは対応づけられたファイルの内容を保持するのに用いられま
すが、ファイルに対応づけられていないバッファもあります。同時に複数のバッ
ファが存在することができますが、常にただ一つのバッファが@dfn{カレント・
バッファ(current buffer)}となります。ほとんどの編集命令はカレント・バッ
ファの内容に対して行なわれます。カレント・バッファを含め、バッファはウィ
ンドウに表示されるかもしれませんし、されないかもしれません。

@menu
* Buffer Basics::       バッファとは何か?
* Current Buffer::      あるバッファをカレント・バッファにする。
			これによりプリミティブがそのバッファの内容に
			アクセスできるようになる。
* Buffer Names::        バッファの名前へのアクセスおよびその変更。
* Buffer File Name::    バッファ・ファイル名は対応づけられている
			ファイルを示す。
* Buffer Modification:: 保存する必要のあるバッファは
			@dfn{変更済み(modified)}となる。
* Modification Time::   対応するファイルが``Emacsの裏''で変更されたことの検出。
* Read Only Buffers::   読みだし専用バッファは変更ができない。
* The Buffer List::     全てのバッファの一覧。
* Creating Buffers::    バッファを生成する関数。
* Killing Buffers::     バッファは明示的に消去するまで存在する。
* Indirect Buffers::    間接バッファは他のバッファとテキストを共有する。
@end menu

@node Buffer Basics, Current Buffer, Buffers, Buffers
@comment  node-name,  next,  previous,  up
@section バッファの基本

@ifinfo
  @dfn{バッファ(buffer)}は、編集するテキストを格納するLispオブジェクトで
す。通常、バッファは対応づけられたファイルの内容を保持するのに用いられま
すが、ファイルに対応づけられていないバッファもあります。同時に複数のバッ
ファが存在することができますが、常にただ一つのバッファが@dfn{カレント・
バッファ(current buffer)}となります。ほとんどの編集命令はカレント・バッ
ファの内容に対して行なわれます。カレント・バッファを含め、バッファはウィ
ンドウに表示されるかもしれませんし、されないかもしれません。
@end ifinfo

@c !!! 訳注 "Buffer in Emacs editing" って何???
  Emacsにおいて編集対象としているバッファは、明確な名前を持った、編集
可能なテキストを保持するオブジェクトです。バッファはLispプログラムの
中では一つの特殊なデータ型です。バッファの内容は拡張可能な文字列と考える
ことができます。バッファの任意の部分のの追加および削除が行なわれます。
@xref{Text}。

  個々のLispバッファ・オブジェクトは多くの情報を持ちます。この情報の
いくつかは変数としてプログラマから直接アクセスされ、その他の情報は特別
な関数によってのみアクセスされます。たとえば、対応づけられたファイル名は
変数によって直接アクセスできますが、ポイントの値はプリミティブ関数によっ
てのみアクセスできます。

  直接アクセスできるバッファ固有の情報は、その値がある特定のバッファで
のみ有効である、@dfn{バッファローカル(buffer-local)}変数に格納されま
す。この特徴により、それぞれのバッファで変数の値を上書きすることが可能
となります。ほとんどの主モードは、この手段を用いて@code{fill-column}
や@code{comment-column}などのような変数を上書きしています。バッファ
ローカル変数とその関連関数の詳細については@ref{Buffer-Local Variables}
を参照してください。

 バッファに対応づけられるファイルに関する関数や変数については、
@ref{Visiting Files}と@ref{Saving Buffers}を参照してください。ウィン
ドウ内のバッファの表示に関する関数や変数については、@ref{Buffers and
Windows}を参照してください。

@defun bufferp object
この関数は、@var{object}がバッファであれば@code{t}を返し、そうでな
ければ@code{nil}を返します。
@end defun

@node Current Buffer, Buffer Names, Buffer Basics, Buffers
@section カレント・バッファ
@cindex selecting a buffer
@cindex changing to another buffer
@cindex current buffer
@cindex バッファの選択[ばっふぁのせんたく]
@cindex 選択、バッファの[せんたく、ばっふぁの]
@cindex バッファの変更[ばっふぁのへんこう]
@cindex 変更、バッファの[へんこう、ばっふぁの]
@cindex カレント・バッファ[カレント・バッファ]

  一般に一回のEmacsセッションの間に多くのバッファが用いられます。常に
その中の一つが@dfn{カレント・バッファ(current buffer)}となります。バッ
ファ内のテキストを調べたり変更するプリミティブのほとんどが、暗黙に
(implicitに)カレント・バッファに対して処理を行うため、このカレント・
バッファ内でほとんどの編集が行なわれます(@pxref{Text})。通常は、選択され
たウィンドウ内のスクリーンに表示されたバッファがカレント・バッファです
が、そうでない場合もあります。Lispプログラムは、あるバッファの内容に
対する処理を行うために、スクリーンに表示されているものを変更することな
く、そのバッファを一時的にカレント・バッファとすることができます。

  Lispプログラムでは、@code{set-buffer}を呼ぶことによりカレント・バッファ
を選択します。選択されたバッファは、新たなバッファが選択されるまでカレン
トのままでいます。

@c ! editor command loop編集コマンド・ループ
  編集命令が編集コマンド・ループ(editor command loop)に戻るとき、混乱を
避けるために、コマンド・ループは選択されたウィンドウに表示されているバッ
ファをカレント・バッファにします。つまりEmacsが命令を読み込んだときにカー
ソルがあったバッファがその命令の適用されるバッファとなります
(@xref{Command Loop})。したがって@code{set-buffer}は、ユーザが他のバッファ
を編集する目的でバッファを変更するための手段ではありません。この目的のた
めには@ref{Displaying Buffers}に説明されている関数を使わねばなりません。

  しかし、カレント・バッファを変更するLisp関数は、それを元に戻す作業をコ
マンド・ループに頼るべきではありません。Emacs Lispで書かれた編集命令は、
コマンド・ループからのほかに、他のプログラムからも呼ばれます。呼ぶ側にとっ
ては、サブルーチンがカレント・バッファを変更しない方が便利です(もちろん、
それが目的である関数は別です)。したがって通常は、終了したときにカレント・
バッファを元に戻す関数である@code{save-excursion}の中で@code{set-buffer}
を使用すべきです(@pxref{Excursions})。例として、命令
@code{append-to-buffer}のコードを要約した説明文字列をつけて示します。

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

@noindent
この関数は、ローカル変数をカレント・バッファに束縛し、
@code{save-excursion}がポイント、マーク、もとのバッファをそれぞれ記録し
ます。次に@code{set-buffer}が別のバッファをカレント・バッファにします。
最後に、@code{insert-buffer-substring}が、もとのカレント・バッファから新た
なカレント・バッファへ文字列をコピーします。

  文字列が追加されたバッファがウィンドウ内に表示されている場合は、次
の画面の書き換えを行うときにテキストの変更が表示されるようになります。表
示されていない場合は、画面からはすぐには変更を見ることができません。つま
りそのバッファは、コマンドの実行中は一時的にカレントになりますが、表示さ
れるわけではありません。

  バッファローカルである変数を(@code{let}もしくは関数の引数によっ
て)ローカル束縛するときは、ローカル束縛するスコープの最初と最後で、同じ
バッファがカレントであるようにしてください。そうしなければ、その変数をあ
るバッファで束縛した後、別のバッファ内で束縛をとく(unbind)ことになります。
変数のスコープの最初と最後とで同じバッファをカレントであるようにするのに、
2とおりの方法があります。簡単なものは、その束縛のスコープ中でカレント・
バッファを変更しないことです。もう一つは、変数の束縛をとくときに、最初に
カレントであったバッファを再度カレントにすることを保証する
@code{save-excursion}を用いることです。

  @code{set-buffer}を用いてカレント・バッファを戻すのは危険です。戻りた
いバッファではないバッファがカレントである状態でとりやめ(quit)が起きたと
きに、@code{set-buffer}が呼ばれないからです。次の例はやっては@emph{いけ
ない}例です。

@example
@group
(let (buffer-read-only
      (obuf (current-buffer)))
  (set-buffer @dots{})
  @dots{}
  (set-buffer obuf))
@end group
@end example

@noindent
次に示すように@code{save-excursion}を用いると、通常の動作はもとより、と
りやめ(quit)、エラー、@code{throw}も正しくハンドルされます。

@example
@group
(let (buffer-read-only)
  (save-excursion
    (set-buffer @dots{})
    @dots{}))
@end group
@end example

@defun current-buffer
この関数はカレント・バッファを返します。

@example
@group
(current-buffer)
     @result{} #<buffer buffers.texi>
@end group
@end example
@end defun

@defun set-buffer buffer-or-name
この関数は@var{buffer-or-name}をカレント・バッファにします。現在選択され
ているウィンドウにも他のウィンドウにも新たなバッファを表示しません。した
がって、ユーザは必ずしもカレント・バッファを見ることができません。しかし
Lispプログラムは、どのような場合でもそのバッファに対して処理をすることが
できます。

この関数は@var{buffer-or-name}で識別されるバッファを返します。
@var{buffer-or-name}によって既存のバッファのうちの一つを特定できない場
合はエラーとなります。
@end defun

@node Buffer Names, Buffer File Name, Current Buffer, Buffers
@section バッファの名前
@cindex buffer names
@cindex バッファの名前[ばっふぁのなまえ]
@cindex 名前、バッファの[なまえ、ばっふぁの]

  個々のバッファは一意な名前を文字列として持ちます。バッファに対して処理
を行う多くの関数は、バッファもしくはバッファの名前を引数として受けつけま
す。@var{buffer-or-name}と呼ばれる引数がこの種のもので、もし文字列もしく
はバッファのいずれでもない場合はエラーとなります。@var{buffer}と呼ばれる
引数は、名前ではなくバッファ・オブジェクトでなければなりません。

  短期的に用いられ、通常はユーザが興味を持たないようなバッファは空白文字
で始まる名前を持ちます。こうすることによって、@code{list-buffers}命令と
@code{buffer-menu}命令の対象とはならなくなります。さらに、空白文字で始ま
る名前のバッファは、最初にundo情報の記録が禁止されます。@ref{Undo}を参照
してください。

@defun buffer-name &optional buffer
この関数は、@var{buffer}の名前を文字列として返します。@var{buffer}が
与えられなかった場合は、カレント・バッファの名前を返します。

@code{buffer-name}が@code{nil}を返した場合は、@var{buffer}が
すでにkillされていることを意味します。@xref{Killing Buffers}。

@example
@group
(buffer-name)
     @result{} "buffers.texi"
@end group

@group
(setq foo (get-buffer "temp"))
     @result{} #<buffer temp>
@end group
@group
(kill-buffer foo)
     @result{} nil
@end group
@group
(buffer-name foo)
     @result{} nil
@end group
@group
foo
     @result{} #<killed buffer>
@end group
@end example
@end defun

@deffn Command rename-buffer newname &optional unique
この関数はカレント・バッファの名前を@var{newname}に変更します。
@var{newname}が文字列でなかったり、その名前のバッファがすでに存在する場
合はエラーとなります。この関数は@code{newname}を返します。

@c Emacs 19 feature
通常、@var{newname}がすでに使われている場合は、@code{rename-buffer}はエ
ラーとなります。しかし@var{unique}が@code{nil}でない場合は、関数
@code{generate-new-buffer}を用いて、@var{newname}を使われていない名前に
変更します。対話的に用いる場合は、数値前置引数によって@var{unique}を
@code{nil}でない値とします。

この命令の使い方の一つとして、@samp{*shell*}バッファを別の名前にするとい
うものがあります。こうすることにより@samp{*shell*}という名前の第2のシェ
ル・バッファを作ることが可能となります。@footnote{訳注: @kbd{M-x shell}
は、すでに@samp{*shell*}という名前のバッファがあったときは、新たに別のバッ
ファを作ろうとしません。ここに書かれているような操作をすることにより、同
時に複数の@samp{*shell*}バッファを作ることが可能となります。}
@end deffn

@defun get-buffer buffer-or-name
この関数は、@var{buffer-or-name}で指定されるバッファを返します。
@var{buffer-or-name}が文字列であり、その名前のバッファが存在しない場合
は値は@code{nil}となります。@var{buffer-or-name}がバッファの場
合は、それをそのまま返します(これはあまり役に立たないため、通常は名
前が引数となります)。たとえば

@example
@group
(setq b (get-buffer "lewis"))
     @result{} #<buffer lewis>
@end group
@group
(get-buffer b)
     @result{} #<buffer lewis>
@end group
@group
(get-buffer "Frazzle-nots")
     @result{} nil
@end group
@end example

@ref{Creating Buffers}の関数@code{get-buffer-create}も参照してくださ
い。
@end defun

@c Emacs 19 feature
@defun generate-new-buffer-name starting-name
この関数は、新しいバッファのためのユニークな名前を返します。ただしバッファ
は作りません。新しい名前は、@var{starting-name}で始まり、@samp{<@dots{}>}
の内側に数字をいれた文字列を加えた、現在どのバッファにも使われていない名
前です。

@ref{Creating Buffers}の関連する関数@code{generate-new-buffer}を参照
してください。
@end defun

@node Buffer File Name, Buffer Modification, Buffer Names, Buffers
@section バッファ・ファイル名
@cindex visited file
@cindex buffer file name
@cindex file name of buffer
@cindex 対応づけられたファイル[たいおうづけられたふぁいる]
@cindex ファイル、対応づけられた[ふぁいる、たいおうづけられた]
@cindex バッファ・ファイル名[ばっふぁふぁいるめい]
@cindex バッファのファイル名[ばっふぁのふぁいるめい]
@cindex ファイル名、バッファの[ふぁいるめい、ばっふぁの]

  @dfn{バッファ・ファイル名(buffer file name)}は、バッファに対応づけられたファイルの名前で
す。バッファがファイルに対応づけられていない場合は、そのバッファ・ファイ
ル名は@code{nil}となります。ほとんどの場合、バッファ名は、バッファ・ファ
イル名のディレクトリ部分を取り除いたものと同じですが、バッファ・ファイル
名とバッファ名は区別され、独立に設定することができます。@xref{Visiting
Files}。

@defun buffer-file-name &optional buffer
この関数は、@var{buffer}が対応づけられているファイルの絶対ファイル名
(absolute file name)を返します。@var{buffer}がファイルに対応づけられ
ていない場合は、@code{buffer-file-name}は@code{nil}を返します。
@var{buffer}が与えられないときは、カレント・バッファがデフォルトとなりま
す。

@example
@group
(buffer-file-name (other-buffer))
     @result{} "/usr/user/lewis/manual/files.texi"
@end group
@end example
@end defun

@defvar buffer-file-name
このバッファローカルな変数は、カレント・バッファに対応づけられたファイ
ルの名前を持ちます。ファイルに対応づけられていない場合は@code{nil}を持ち
ます。常時ローカル変数であり@code{kill-local-variables}の影響を受けませ
ん。

@example
@group
buffer-file-name
     @result{} "/usr/user/lewis/manual/buffers.texi"
@end group
@end example

ほかのいろいろな手続きを踏まずにこの変数の値を変更することは危険です。
@file{files.el}の@code{set-visited-file-name}の定義を参考にしてくださ
い。バッファ名の変更など、そこで行なわれていることのいくつかは厳密には必
要ではありませんが、そのほかはEmacsを混乱させないために必要なことです。
@end defvar

@defvar buffer-file-truename
このバッファローカルな変数はカレント・バッファに対応づけられたファイル
の真の名前(truename)を持ちます。ファイルに対応づけられていない場
合は@code{nil}を持ちます。常にローカル変数であり
@code{kill-local-variables}の影響を受けません。@xref{Truenames}。
@end defvar

@c !!!
@c 19.28まではあるようですが... 19.29をinstallしないとダメかな?
@defvar buffer-file-number
このバッファローカルな変数は、カレント・バッファに対応づけられたファイ
ルのファイル番号@footnote{訳注: Unixファイル・システムではiノード番号。}
とディレクトリ・デバイス番号を持ちます。あるいはファイルに対応づけられて
いない場合は@code{nil}を持ちます。常時ローカル変数であり
@code{kill-local-variables}の影響を受けません。@xref{Truenames}。

この変数の値は通常@code{(@var{filenum} @var{devnum})}の形式のリストで
す。この数字の組によって、システムでアクセス可能な全てのファイル中から
そのファイルを一意に特定することができます。これらのより詳しい情報は、
@ref{File Attributes}の関数@code{file-attributes}を参照ください。
@end defvar

@defun get-file-buffer filename
この関数は、ファイル@var{filename}に対応づけられたバッファを返します。も
しそのようなバッファがない場合は@code{nil}を返します。引数@var{filename}
(文字列でなければなりません)は展開されたあと(@pxref{File Name
Expansion})全てのバッファに対応づけられたファイル名と比較されます。

@example
@group
(get-file-buffer "buffers.texi")
    @result{} #<buffer buffers.texi>
@end group
@end example

特殊な状況では、同じファイル名に複数のバッファが対応づけられていること
がありえます。このような場合、この関数はバッファ・リストの中の最初のも
のを返します。
@end defun

@deffn Command set-visited-file-name filename
@var{filename}が空文字列でない場合は、この関数はカレント・バッファ
に対応づけられているファイルを@var{filename}に変更します(バッファ
がファイルに対応づけられていない場合は、バッファにファイルを対応づけます)。
@emph{次に}バッファが保存されるとき、それは新たに指定されたファイルに
保存されます。バッファの内容が以前対応づけられていたファイルの内容と一
致していたとしても、@var{filename}の内容と一致しない(少なくともEmacs
にはわからない)ので、この命令はバッファに変更済みの印をつけます。

@var{filename}が@code{nil}もしくは空文字列である場合は、``対応づけられた
ファイルがない'' ことを表わします。この場合は
@code{set-visited-file-name}はバッファに対応するファイルがないと印をつけ
ます。

@c Wordy to avoid overfull hbox.  --rjc 16mar92
@code{set-visited-file-name}が対話的に呼ばれた場合はミニバッファで
@var{filename}の入力を促します。

@c Overfull対策
@c @ref{Buffer Modification}の@code{clear-visited-file-modtime}と
@ref{Buffer Modification}の中の@code{clear-visited-file-modtime}と
@code{verify-visited-file-modtime}を参照してください。
@end deffn

@defvar list-buffers-directory
このバッファローカル変数は、対応づけられたファイル名を持たないバッファ
が、バッファ一覧表にファイル名の代わりに表示する文字列を記録します。
Diredバッファはこの変数を使用します。
@end defvar

@node Buffer Modification, Modification Time, Buffer File Name, Buffers
@section バッファの変更
@cindex buffer modification
@cindex modification flag (of buffer)
@cindex バッファの変更[ばっふぁのへんこう]
@cindex 変更、バッファの[へんこう、ばっふぁの]
@cindex バッファの変更フラグ[ばっふぁのへんこうふらぐ]
@cindex 変更フラグ、バッファの[へんこうふらぐ、ばっふぁの]

  Emacsは、それぞれのバッファごとにそのバッファのテキストを変更したか否か
を記録するために、@dfn{変更フラグ(modified flag)}と呼ばれるフラグを管理します。この
フラグはバッファの内容を変更したときに@code{t}となり、バッファを保存
(保存)したときに@code{nil}となります。したがってこのフラグは、保存
されていない変更があるか否かを示します。このフラグの値は通常モード・ラ
インに表示され(@pxref{Mode Line Variables})、ファイルの保存や
(@pxref{Saving Buffers})自動保存(auto-saving)の(@pxref{Auto-Saving})
制御をします。

  いくつかのlispプログラムはこのフラグを明示的に設定します。たとえば
関数@code{set-visited-file-name}は、フラグを@code{t}とします。これ
はテキストが以前対応づけられていたファイルから変更されてはいませんが、新
たに対応づけられたファイルとは一致していないためです。

 バッファの内容を変更する関数については@ref{Text}に記述されています。

@defun buffer-modified-p &optional buffer
この関数は、バッファ@var{buffer}が最後にファイルから読込まれてから、
もしくは保存されてから変更された場合に@code{t}を返し、そうでない場合
に@code{nil}を返します。@var{buffer}が省略された場合はカレント・
バッファが調べられます。
@end defun

@defun set-buffer-modified-p flag
この関数は、@var{flag}が@code{nil}でない場合にカレント・バッファを変更さ
れたものとし、@code{nil}の場合に変更されていないものとします。

この関数をもう一つの効果は、カレント・バッファのモード・ラインを無条件に
再表示することです。現に関数@code{force-mode-line-update}はこの関数を
呼ぶことによって実現されています。

@example
@group
(set-buffer-modified-p (buffer-modified-p))
@end group
@end example
@end defun

@deffn Command not-modified &optional mark-modified
このコマンドは、カレント・バッファが変更されておらず保存する必要がないも
のとします。前置引数が与えられたときはバッファを変更したものとするので、
@kbd{C-x C-s}によってバッファが保存されます。この関数はエコー領域にメッ
セージを表示するため、プログラムの中では使わないでください。かわりに(上
記の) @code{set-buffer-modified-p}を使用してください。
@end deffn

@c Emacs 19 feature
@defun buffer-modified-tick &optional buffer
この関数は、@var{buffer}の変更された回数を返します。これはバッファが変更
されるたびに増加するカウンタです。@var{buffer}が@code{nil} (もしくは省略
された場合)はカレント・バッファが対象となります。
@end defun

@node Modification Time, Read Only Buffers, Buffer Modification, Buffers
@comment  node-name,  next,  previous,  up
@section 変更時間の比較
@cindex comparison of modification time
@cindex modification time, comparison of 
@cindex 変更時間の比較[へんこうじかんのひかく]
@cindex 比較、変更時間の[ひかく、へんこうじかんの]

 ファイルを開き、そのバッファを変更している間にディスク上のファイルが変
更された状況を考えてください。この状態でバッファを保存すると、ファイル
の変更が上書きされてしまいます。場合によってはこれが望ましい場合もあり
ますが、通常は有益な情報が失われてしまいます。したがってEmacsは、ファ
イルを保存する前に、以下に記述される関数を用いてファイルの変更時間を調
べます。

@defun verify-visited-file-modtime buffer
この関数は、対応づけられたファイルの変更時間として@var{buffer}に記録され
た時間と、オペレーティング・システムによって記録されたファイル自体の変
更時間とを比較します。Emacsがファイルを読み込んでから、もしくは保存し
てからほかのプロセスがこのファイルを書き換えないかぎり、この二つの時間は
同じでなければなりません。

この関数は、最後の実際の変更時間とEmacsに記録された変更時間とが等しい
ときには@code{t}を返し、そうでないときには@code{nil}を返します。
@end defun

@defun clear-visited-file-modtime
この関数はカレント・バッファに対応づけられたファイルの最後の変更時間の記
録を消去します。これによって、次にこのバッファを保存するときにファイル
の変更時間の矛盾による警告を受けません。

この関数は@code{set-visited-file-name}の中など、変更されたファイルの上
書きを防ぐための通常行なわれる検査が不要な例外的な場所から呼ばれます。
@end defun

@c Emacs 19 feature
@defun visited-file-modtime
この関数は、バッファに記録されているファイルの最終変更時間を、
@code{(@var{high} . @var{low})}という形式のリストとして返します(これは
@code{file-attributes}が時間の値を返すのに用いる形式と同じものです。
@ref{File Attributes}を参照してください)。
@end defun

@c Emacs 19 feature
@defun set-visited-file-modtime &optional time
この関数は、バッファに記録されているファイルの最終変更時間を、@var{time}
が@code{nil}でない場合は@var{time}で指定された値に、@code{nil}の場合は対
応づけられたファイルの最終変更時間に、それぞれ書き換えます。

@var{time}が@code{nil}でないときは、それは@code{(@var{high}
. @var{low})}もしくは@code{(@var{high} @var{low})}の形式でなければな
りません。いずれの場合も二つの整数値を持ち、それぞれが時間の16ビット
分の値を保持します。

この関数は、バッファが普通にファイルから読まれなかった場合や、ファイル
自身がある正常な理由で変更された場合などに便利です。
@end defun

@defun ask-user-about-supersession-threat filename
@cindex obsolete buffer
@cindex obsoleteバッファ
@cindex 廃止されたバッファ[はいしされたばっふぁ]
@cindex バッファ、廃止された[ばっふぁ、はいしされた]
この関数は、その内容が対応づけられた実際のファイル@var{filename}に一致し
ていない(obsolete)バッファを変更しようとしたときに、どのように処理を継続
するかをユーザに問い合わせるのに用いられます。@dfn{obsoleteバッファ(obsolete buffer)}とは
対応づけられたディスク上のファイルがバッファの最後に保存された時間よりも
新しい、変更されていないバッファのことです。これはたぶん他のプログラムに
よってファイルが変更されたことを意味します。

@kindex file-supersession
この関数は、ユーザの答えによって、正常に終了し、バッファはそのまま変更さ
れるか、データ@code{(@var{filename})}を伴って@code{file-supersession}エ
ラーが通知され、バッファの変更はされないかの、いずれかとなります。

この関数は、Emacsによって適切なときに自動的に呼ばれます。この関数を再定
義することによってEmacsをカスタマイズすることができるように用意されてい
ます。標準的な定義としてはファイル@file{userlock.el}を参照してください。

@ref{File Locks}のファイル・ロック機構も参照してください。
@end defun

@node Read Only Buffers, The Buffer List, Modification Time, Buffers
@section 読みだし専用バッファ
@cindex read-only buffer
@cindex buffer, read-only
@cindex 読みだし専用バッファ[よみだしせんようばっふぁ]
@cindex バッファ、読みだし専用[ばっふぁ、よみだしせんよう]

 バッファが@dfn{読みだし専用(read-only)}である場合は、その内容を変更
することはできませんが、スクロールしたりナローイングを行うことによって、
その見え方を変更することは可能です。

  読みだし専用バッファは2種類の状況で用いられます。

@itemize @bullet
@item
書き換え禁止ファイルに対応づけられたバッファは、通常読みだし専用となります。

これは、そのファイルに保存する目的でバッファを編集することが無駄である、
もしくは望ましくはないことをユーザに示すことが目的です。これらにもかか
わらずバッファ・テキストを変更したいユーザは、@kbd{C-x C-q}によって読
みだし専用フラグを解除することで変更を行うことができます。

@item
DiredやRmailなどのモードのように、通常の編集コマンドで内容を変更すること
がたぶん誤りであるような場合に、バッファを読みだし専用とします。

これらのモードの特別なコマンドは、バッファのテキストを変更するときに、
@code{buffer-read-only}を(@code{let}を用いて) @code{nil}とするか、
@code{inhibit-read-only}を@code{t}とします。
@end itemize

@defvar buffer-read-only
このバッファローカル変数は、バッファが読みだし専用であるか否かを指定し
ます。この変数が@code{nil}でないときはそのバッファは読みだし専用です。
@end defvar

@defvar inhibit-read-only
この変数が@code{nil}でないときは、読みだし専用バッファや読みだし専用文字
も変更することが可能です。読みだし専用文字とは、@code{nil}でない@code{読
みだし専用}属性(テキスト属性とオーバレイ属性のいずれか)をもつ文字です。
テキスト特性についての詳細は@xref{Special Properties}。オーバレイやその
属性についての詳細は@xref{Overlays}。

@code{inhibit-read-only}が@code{t}の場合は、全ての@code{読みだし専
用}文字属性は効果がありません。@code{inhibit-read-only}がリストの場合
は、@code{読みだし専用}文字属性がリストのメンバである場合に(@code{eq}
で比較が行なわれます)その効果がなくなります。
@end defvar

@deffn Command toggle-read-only
このコマンドは、カレント・バッファが読みだし専用であるか否かを変更します。
対話的に用いるためのものなので、プログラムの中では使用しないでください。
プログラム内では、読みだし専用フラグを設定したいのか解除したいのかは判っ
ているはずなので、明示的に@code{buffer-read-only}を@code{t}か@code{nil}
の適切な値に設定することができます。
@end deffn

@defun barf-if-buffer-read-only
この関数は、カレント・バッファが読みだし専用である場合に
@code{buffer-read-only}エラーを通知します。カレント・バッファが読みだし
専用であるときにエラーを通知するもう一つの方法として、@xref{Interactive
Call}。
@end defun

@node The Buffer List, Creating Buffers, Read Only Buffers, Buffers
@section バッファ・リスト
@cindex buffer list
@cindex バッファ・リスト[ばっふぁりすと]

  @dfn{バッファ・リスト(buffer list)}は、全ての使用可能なバッファのリス
トです。バッファを生成するとこのリストに加えられ、バッファをkillするとこ
のリストから削除されます。リスト内のバッファの順序は、基本的には選択され
ているウィンドウに最近表示されたものほど先頭に近くなっています。バッファ
は、選択されるとこのリストの先頭に移動し、関数@code{bury-buffer}によって
リストの末尾に移動します。いくつかの関数、特に@code{other-buffer}は、こ
の順序を使用します。ユーザに表示されるバッファのリストもこの順序となりま
す。

@defun buffer-list
この関数は、名前がスペースで始まるバッファも含む全てのバッファのリストを
返します。各要素はバッファそのものであって、名前ではありません。

@example
@group
(buffer-list)
     @result{} (#<buffer buffers.texi>
         #<buffer  *Minibuf-1*> #<buffer buffer.c>
         #<buffer *Help*> #<buffer TAGS>)
@end group

@group
;; @r{minibufferの名前がスペースで始まることに注意!}
(mapcar (function buffer-name) (buffer-list))
    @result{} ("buffers.texi" " *Minibuf-1*" 
        "buffer.c" "*Help*" "TAGS")
@end group
@end example

このリストは、Emacs内部で使われているリストのコピーです。これを変更して
もバッファの順序には影響を与えません。
@end defun

@defun other-buffer &optional buffer visible-ok
この関数は、バッファ・リストの中で@var{buffer}以外の最初のバッファを返し
ます。通常は選択されているウィンドウに@var{buffer}を除いて最近表示さ
れたバッファです。スペースで始まる名前のバッファは除外されます。

@var{buffer}が省略された場合は(もしくはそれがバッファではなかったら)、
@code{other-buffer}は、現在表示されているフレーム内のどのウィンドウにも
表示されていない、バッファ・リスト内で最初のバッファを返します。

選択されたフレームが@code{nil}以外の@code{buffer-predicate}パラメータを
持っている場合は、関数@code{other-buffer}は、この述語(predicate)を用いて
バッファを選択します。それぞれのバッファごとにこの述語を呼び、その値が
@code{nil}であればそのバッファは無視されます。@xref{X Frame Parameters}。

@c Emacs 19 feature
@var{visible-ok}が@code{nil}であれば、ほかにバッファがあるかぎり、
@code{other-buffer}は現在表示されているフレーム内の全てのウィンドウに表
示されているものを除外します。@var{visible-ok}が@code{nil}でなければ、
バッファが表示されているか否かは関係なくなります。

適切なバッファがない場合は、バッファ@samp{*scratch*}が(必要であれば
生成され)返されます。
@end defun

@deffn Command bury-buffer &optional buffer-or-name
この関数は、@var{buffer-or-name}を他のバッファのリスト内の順序を変えるこ
となく、バッファ・リストの最後にします。したがってこのバッファは、
@code{other-buffer}が返すバッファとして最も優先度の低いものになります。

@var{buffer-or-name}が@code{nil}もしくは省略された場合は、カレント・バッ
ファが対象となります。さらに、カレント・バッファが選択されたウィンドウに
表示されている場合は、選択されたウィンドウの(@code{other-buffer}によって
選択される)他のバッファが表示されます。しかし他のウィンドウに表示されて
いる場合は、そこに表示されたままとなります。

全てのウィンドウ内に表示されているあるバッファを置き換えたい場合は、
@code{replace-buffer-in-windows}を使用してください。@xref{Buffers and
Windows}。
@end deffn

@node Creating Buffers, Killing Buffers, The Buffer List, Buffers
@section バッファの生成
@cindex creating buffers
@cindex buffers, creating
@cindex バッファの生成[ばっふぁのせいせい]
@cindex 生成、バッファの[せいせい、ばっふぁの]

  この節ではバッファを生成する2種類のプリミティブについて説明します。
@code{get-buffer-create}は指定された名前のバッファが存在してない場合に
バッファを生成します。@code{generate-new-buffer}は常に新しいバッファを
生成し、それにユニークな名前を与えます。

 バッファを生成する関数として、ほかに@code{with-output-to-temp-buffer}
(@pxref{Temporary Displays})と@code{create-file-buffer}
(@pxref{Visiting Files})とがあります。またサブプロセスの起動によっても
バッファを生成することができます。

@defun get-buffer-create name
この関数は、@var{name}という名前のバッファを返します。その名前のバッ
ファがすでに存在していれば、そのバッファを返します。そうでなければ新しいバッ
ファを生成します。そのバッファはカレント・バッファとはなりません。つまり
この関数はカレント・バッファを変更しません。

@var{name}が文字列でない場合は、エラーが通知されます。

@example
@group
(get-buffer-create "foo")
     @result{} #<buffer foo>
@end group
@end example

新たなバッファの主モードはFundamentalモードとなります。変数
@code{default-major-mode}はもっと上位の階層で処理されます。
@xref{Auto Major Mode}。
@end defun

@defun generate-new-buffer name
この関数は、新たに生成した空のバッファを返します。しかしそのバッファはカ
レント・バッファとはなりません。@var{name}という名前のバッファがすでに存
在しない場合は、それが新しいバッファの名前となります。その名前が使
用されている場合は、この関数は@var{name}の後ろに@samp{<@var{n}>}
(@var{n}は整数)という形式の接尾辞を加えます。この関数は、使用できる整数
を、2から順に調べて決定します。

@var{name}が文字列でない場合はエラーが通知されます。

@example
@group
(generate-new-buffer "bar")
     @result{} #<buffer bar>
@end group
@group
(generate-new-buffer "bar")
     @result{} #<buffer bar<2>>
@end group
@group
(generate-new-buffer "bar")
     @result{} #<buffer bar<3>>
@end group
@end example

新たなバッファの主モードはFundamentalモードとなります。変数
@code{default-major-mode}はもっと上位の階層で処理されます。@xref{Auto
Major Mode}。

関連する関数として@ref{Buffer Names}の@code{generate-new-buffer-name}
を参照してください。
@end defun

@node Killing Buffers, Indirect Buffers, Creating Buffers, Buffers
@section バッファの消去
@cindex killing buffers
@cindex buffers, killing
@cindex バッファのkill[ばっふぁのkill]
@cindex kill、バッファの[kill、ばっふぁの]
@cindex キル、バッファの[きる、ばっふぁの]
@cindex 消去、バッファの[しょうきょ、ばっふぁの]

  @dfn{バッファの消去(killing a buffer)}によって、Emacsからその名前が忘れ去られ、その
テキスト空間がほかの目的に使用できるようになります。

  消去されたバッファのバッファ・オブジェクトは、それが参照される間は存
在し続けますが、それをカレント・バッファにしたり表示したりはできないよ
うに特別な印がつけられます。しかし消去されたバッファもその独自性は持ち
続けます。よって二つのバッファが消去されたとしても@code{eq}によって
区別することができます。

  消去されたバッファがカレント・バッファであったりウィンドウに表示されて
いた場合は、Emacsは自動的に他のバッファを選択あるいは表示します。これは
バッファの消去が一般にカレント・バッファを変更することを意味します。した
がって、バッファを消去するときは(消去するバッファがカレント・バッファで
ないことが分かっているのでないかぎり)、カレント・バッファが変更される場
合にしなければならない予防措置を取らなければなりません。@xref{Current
Buffer}。

  一つもしくは複数の間接バッファの元バッファ(base buffer)を消去する場合
は、その間接バッファも全て自動的に消去されます。

  消去されたバッファの@code{buffer-name}は@code{nil}となります。こ
の性質をバッファが消去されたか否かを調べるのに用いることができます。

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

@deffn Command kill-buffer buffer-or-name
この関数は、バッファ@var{buffer-or-name}を消去します。そしてその全てのメ
モリを他の目的に使用するため、もしくはオペレーティング・システムに返すた
めに開放します。この関数は@code{nil}を返します。

関数@code{process-buffer}がこのバッファを返す全てのプロセスに、
@code{SIGHUP}シグナルが送られます。これにより通常そのプロセスは終了し
ます(@code{SIGHUP}は元は電話回線が遮断されたときに通知されるものでし
た)。@xref{Deleting Processes}。

バッファが、あるファイルに対応づけられていて、保存されていない変更がある
場合は、@code{kill-buffer}はバッファが消去されるまえにユーザに確認を行な
います。この確認は対話的に呼ばれなかったときにも行なわれます。確認の要求
が起きないようにするためは、@code{kill-buffer}を呼ぶ前に、変更フラグを解
除してください。@xref{Buffer Modification}。

すでに消去されているバッファを消去しても無視されるだけです。

@smallexample
(kill-buffer "foo.unchanged")
     @result{} nil
(kill-buffer "foo.changed")

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

     @result{} nil
@end smallexample
@end deffn

@defvar kill-buffer-query-functions
保存されていない変更の確認のあと、@code{kill-buffer}はリスト
@code{kill-buffer-query-functions}の中の関数を、その順序で引数なしで呼び
ます。その呼出しの際には、消去されようとしているバッファがカレント・バッ
ファになっています。これらの関数は、いくつかの非標準的な理由のためにユー
ザに確認を求めるために使用されます。もしそのいずれかが@code{nil}を返した
場合は、@code{kill-buffer}はバッファを消去しません。
@end defvar

@defvar kill-buffer-hook
これは、全ての問い合わせのあと、バッファを実際に消去する直前に
@code{kill-buffer}によって実行される通常のフックです。フック関数が実行さ
れるときは、消去されるバッファがカレントとなります。@xref{Hooks}。
@end defvar

@defvar buffer-offer-save
この変数があるバッファで@code{nil}でない場合は、
@code{save-buffers-kill-emacs}と@code{save-some-buffers}は、通常ファ
イルに対応づけられたバッファを保存しようとするのと同じように、そのバッ
ファを保存します。変数@code{buffer-offer-save}は、何らかの理由で設定
されたときに自動的にバッファローカルとなります。@xref{Buffer-Local
Variables}。
@end defvar

@node Indirect Buffers,  , Killing Buffers, Buffers
@section 間接バッファ
@cindex indirect buffers
@cindex base buffer
@cindex 間接バッファ[かんせつばっふぁ]
@cindex 元バッファ[もとばっふぁ]

  @dfn{間接バッファ(indirect buffer)}は、間接バッファの@dfn{元バッファ
(base buffer)}と呼ばれる他のバッファのテキストを共有します。いくつかの
点でファイルでのシンボリック・リンクに類似します。元バッファ自身がその
間接バッファであってはなりません。

  間接バッファのテキストは、常に元バッファのものと同一です。いずれかを
編集することによる変化は、直ちにもう一方でも表示されます。文字と同様に
テキスト属性も含みます。

  しかし、他の全ての点で間接バッファとその元バッファとは完全に別のものです。
名前も、ポイントの値も、ナローイングも、マーカやオーバレイも(ただし、い
ずれかのバッファでのテキストの追加や削除は、両方のバッファのマーカとオー
バレイを更新しますが)、主モードも、ローカル変数も、全て異なります。

  主バッファはファイルに対応づけられますが、間接バッファはファイルに対
応づけられません。間接バッファを保存しようとすると、実際には主バッ
ファが保存されます。

  間接バッファを消去しても、主バッファにはなんの影響もありません。主バッ
ファの消去は実質的にその間接バッファを消去するため、その間接バッファが
2度とカレント・バッファとなることはありません。

@deffn Command make-indirect-buffer base-buffer name
これは名前が@var{name}で主バッファが@var{base-buffer}である間接バッ
ファを生成します。引数@var{base-buffer}はバッファもしくは文字列です。

@var{base-buffer}が間接バッファである場合は、その主バッファが新たなバッ
ファの主バッファになります。
@end deffn

@defun buffer-base-buffer buffer
この関数は@var{buffer}の主バッファを返します。@var{buffer}が間接バッファ
でない場合は、値は@code{nil}となります。間接バッファである場合の値は、間
接バッファではない他のバッファとなります。
@end defun


