次: Reading from Files, 前: Visiting Files, 上: Files
Emacsでファイルを編集するときには、 ファイルを訪問したバッファを実際には扱っています。 つまり、ファイルの内容はバッファにコピーされ、 そのコピーを編集しているのです。 バッファを変更しても、当該バッファを保存(save)するまで、 つまり、バッファの内容をファイルへコピーするまでは、 ファイルを変更しません。
この関数は、最後に訪問/保存してからカレントバッファが変更されていれば、 カレントバッファの内容を訪問しているファイルへ保存する。
save-bufferは、バックアップの作成に責任がある。 通常、backup-optionはnilであり、save-bufferは、ファイルを訪問してから 最初に保存するときにのみバックアップファイルを作成する。 backup-optionが別の値であると、 別の場面でもバックアップファイルを作成することを指示する。
- 引数が1つか3つのC-uを反映した4か64であると、 関数
save-bufferは、バッファをつぎに保存したときに ファイルの現在の版をバックアップするように印を付ける。- 引数が2つか3つのC-uを反映した16か64であると、
save-bufferは、保存するまえに無条件に ファイルのまえの版をバックアップする。
このコマンドは、ファイルを訪問している変更されたバッファを保存する。 通常、各バッファについてユーザーに問い合わせる。 しかし、save-silently-pが
nil以外であると、 ユーザーに問い合わせずにファイルを訪問しているバッファをすべて保存する。省略可能な引数exitingが
nil以外であると、 この関数は、ファイルを訪問していないある種のバッファを保存する機会も与える。buffer-offer-saveのバッファローカルな値がnil以外のバッファが対象となる。 (ユーザーがこれらのバッファの1つを保存するように答えると、 ファイル名を指定するように聞いてくる。) 関数save-buffers-kill-emacsは、 この引数にnil以外の値を渡す。
この関数は、カレントバッファをファイルfilenameに保存し、 当該ファイルを訪問しているバッファとし、さらに未変更という印を付ける。 続いて、バッファ名を一意にするために必要ならば`<2>'のような 文字列を付加して、バッファをfilenameに基づいた名前に改名する。 この処理のほとんどは、
set-visited-file-name(see Buffer File Name) とsave-bufferを呼び出して行う。
バッファを保存すると、いくつかのフックを実行します。 また、書式変換(see Format Conversion)を行い、 テキスト属性を『注記』(annotations)(see Saving Properties)に 保存することもあります。
この変数の値は、バッファを訪問しているファイルに書き出すまえに 呼ばれる関数のリストである。 それらの1つが
nil以外を返すと、すでにファイルに書き出したとみなして 残りの関数を呼び出さず、ファイルに書き出すための通常のコードも実行しない。
write-file-hooksの関数がnil以外を返すときには、 その関数には(必要ならば)バックアップファイルを作成する責任がある。 そのためにはつぎのコードを実行する。(or buffer-backed-up (backup-buffer))
backup-bufferが返したファイルモードの値を保存しておき、 読者が書くファイルのモードにその値を使いたい場合がある。save-bufferは通常そのようにする。
write-file-hooksのフック関数は、 (必要ならば)データの符号化にも責任がある。 適切なコーディングシステム(see Lisp and Coding Systems)を選び、 符号化(see Explicit Encoding)を行い、 使用したコーディングシステムをlast-coding-system-usedに設定する (see Encoding and I/O)。この変数をバッファローカルにはしないこと。 バッファ固有のフック関数を指定するには、 かわりに
write-contents-hooksを使う。これはノーマルフックではないが、
add-hookとremove-hookでリストを扱える。 see Hooks。
これは
write-file-hooksのように働くが、 特定のバッファにバッファローカルにするように意図してあり、 ファイル名に関するフックやバッファ内容を得た方法に関する フックとして使われる。変数は恒久的にバッファローカルと印が付いているので、 メジャーモードを変更してもバッファローカルな値は変更されない。 これは、『ファイル』の内容を特別な方法で読み込み、 対応した方法でデータを保存するフックを設定するようなパッケージには便利である。
この変数は
write-file-hooksのように働くが、 ファイルの場所に関するフックではなく、 ファイルの内容に関するフックであると意図されている。 そのようなフックは、この変数のバッファローカルな束縛として メジャーモードが通常設定する。この変数に設定すると自動的にバッファローカルになる。 このフックに要素を追加するために
add-hooksを使うときには、 引数localにnil以外を指定しないこと。 この変数はバッファローカルのみであるからである。
このノーマルフックは、バッファを訪問したファイルに 保存し終えてから実行される。 このフックの用途の1つは高速ロック(fast-lock)モードである。 このフックを使って強調表示情報をキャッシュファイルに保存する。
この変数が
nil以外ならば、save-bufferは保存処理中の入出力エラーに備えて対処する。 つまり、目的の名前のファイルにではなく一時的な名前の新規ファイルに書き出し、 エラーがないことを確認してから目的の名前に改名する。 これにより、不正なファイルに起因する問題からディスク容量の不足といった 問題を回避できる。副作用として、バックアップも必然的にコピーして行う。 see Rename or Copy。 それと同時に、大事な(precious)ファイルとして保存すると、 読者が保存したファイルと別のファイル名とのあいだの ハードリンクをつねに切ってしまう。
特定のバッファではこの変数に
nil以外のバッファローカルな値を 指定するモードもある。
この変数は、改行で終らないファイルを書き出すかどうかを決定する。 この変数の値が
tであると、save-bufferは、 保存するバッファが改行で終っていないと黙ってファイルの末尾に改行を追加する。 この変数の値がtではないnil以外であると、save-bufferは、必要な場面では 改行を追加するかどうかユーザーに問い合わせる。この変数の値が
nilであると、save-bufferは改行を追加しない。 デフォルト値はnilであるが、特定のバッファではtに 設定するメジャーモードもある。
関数set-visited-file-name(see Buffer File Name)も
参照してください。