次: , 前: Visiting Files, 上: Files


24.2 バッファの保存

Emacsでファイルを編集するときには、 ファイルを訪問したバッファを実際には扱っています。 つまり、ファイルの内容はバッファにコピーされ、 そのコピーを編集しているのです。 バッファを変更しても、当該バッファを保存(save)するまで、 つまり、バッファの内容をファイルへコピーするまでは、 ファイルを変更しません。

— コマンド: save-buffer &optional backup-option

この関数は、最後に訪問/保存してからカレントバッファが変更されていれば、 カレントバッファの内容を訪問しているファイルへ保存する。

save-bufferは、バックアップの作成に責任がある。 通常、backup-optionnilであり、 save-bufferは、ファイルを訪問してから 最初に保存するときにのみバックアップファイルを作成する。 backup-optionが別の値であると、 別の場面でもバックアップファイルを作成することを指示する。

— コマンド: save-some-buffers &optional save-silently-p exiting

このコマンドは、ファイルを訪問している変更されたバッファを保存する。 通常、各バッファについてユーザーに問い合わせる。 しかし、save-silently-pnil以外であると、 ユーザーに問い合わせずにファイルを訪問しているバッファをすべて保存する。

省略可能な引数exitingnil以外であると、 この関数は、ファイルを訪問していないある種のバッファを保存する機会も与える。 buffer-offer-saveのバッファローカルな値が nil以外のバッファが対象となる。 (ユーザーがこれらのバッファの1つを保存するように答えると、 ファイル名を指定するように聞いてくる。) 関数save-buffers-kill-emacsは、 この引数にnil以外の値を渡す。

— コマンド: write-file filename

この関数は、カレントバッファをファイルfilenameに保存し、 当該ファイルを訪問しているバッファとし、さらに未変更という印を付ける。 続いて、バッファ名を一意にするために必要ならば`<2>'のような 文字列を付加して、バッファをfilenameに基づいた名前に改名する。 この処理のほとんどは、set-visited-file-name(see Buffer File Name) とsave-bufferを呼び出して行う。

バッファを保存すると、いくつかのフックを実行します。 また、書式変換(see Format Conversion)を行い、 テキスト属性を『注記』(annotations)(see Saving Properties)に 保存することもあります。

— 変数: write-file-hooks

この変数の値は、バッファを訪問しているファイルに書き出すまえに 呼ばれる関数のリストである。 それらの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-hookremove-hookでリストを扱える。 see Hooks

— 変数: local-write-file-hooks

これはwrite-file-hooksのように働くが、 特定のバッファにバッファローカルにするように意図してあり、 ファイル名に関するフックやバッファ内容を得た方法に関する フックとして使われる。

変数は恒久的にバッファローカルと印が付いているので、 メジャーモードを変更してもバッファローカルな値は変更されない。 これは、『ファイル』の内容を特別な方法で読み込み、 対応した方法でデータを保存するフックを設定するようなパッケージには便利である。

— 変数: write-contents-hooks

この変数はwrite-file-hooksのように働くが、 ファイルの場所に関するフックではなく、 ファイルの内容に関するフックであると意図されている。 そのようなフックは、この変数のバッファローカルな束縛として メジャーモードが通常設定する。

この変数に設定すると自動的にバッファローカルになる。 このフックに要素を追加するためにadd-hooksを使うときには、 引数localnil以外を指定しないこと。 この変数はバッファローカルのみであるからである。

— 変数: after-save-hook

このノーマルフックは、バッファを訪問したファイルに 保存し終えてから実行される。 このフックの用途の1つは高速ロック(fast-lock)モードである。 このフックを使って強調表示情報をキャッシュファイルに保存する。

— 変数: file-precious-flag

この変数がnil以外ならば、 save-bufferは保存処理中の入出力エラーに備えて対処する。 つまり、目的の名前のファイルにではなく一時的な名前の新規ファイルに書き出し、 エラーがないことを確認してから目的の名前に改名する。 これにより、不正なファイルに起因する問題からディスク容量の不足といった 問題を回避できる。

副作用として、バックアップも必然的にコピーして行う。 see Rename or Copy。 それと同時に、大事な(precious)ファイルとして保存すると、 読者が保存したファイルと別のファイル名とのあいだの ハードリンクをつねに切ってしまう。

特定のバッファではこの変数にnil以外のバッファローカルな値を 指定するモードもある。

— ユーザオプション: require-final-newline

この変数は、改行で終らないファイルを書き出すかどうかを決定する。 この変数の値がtであると、save-bufferは、 保存するバッファが改行で終っていないと黙ってファイルの末尾に改行を追加する。 この変数の値がtではないnil以外であると、 save-bufferは、必要な場面では 改行を追加するかどうかユーザーに問い合わせる。

この変数の値がnilであると、save-bufferは改行を追加しない。 デフォルト値はnilであるが、特定のバッファではtに 設定するメジャーモードもある。

関数set-visited-file-name(see Buffer File Name)も 参照してください。