[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacsでは、ファイルやディレクトリを 探したり、作成したり、眺めたり、保存したり、その他のことをできます。 本章では、Emacs Lispのファイル関連の関数のほとんどについて説明しますが、 他の一部は26. バッファで、バックアップや自動保存に関することは 25. バックアップと自動保存で説明します。
ファイル関数の多くは、ファイル名の引数を1つないし複数個取ります。 ファイル名は実際には文字列です。 これらのほとんどの関数では、expand-file-name
を呼び出して ファイル名引数を展開することで`~'や (`../'を含む)相対ファイル名を正しく処理します。 これらの関数は、`$HOME'などの環境変数置換は認識しません。 See 節 24.8.4 ファイル名を展開する関数。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ファイルを訪問するとは、ファイルをバッファに読み込むことです。 いったんこうすると、バッファはそのファイルを 訪問している(visiting)といい、 そのファイルをバッファの『訪問しているファイル』と呼びます。
ファイルとバッファは2つの異なるものです。 ファイルは、コンピュータ内に(読者が削除しない限り)恒久的に 記録されている情報です。 一方、バッファはEmacs内部にある情報であり、 編集セッションを終了する(あるいはバッファを削除する)と消えてしまいます。 通常、バッファにはファイルからコピーした情報があります。 つまり、バッファはそのファイルを訪問しているのです。 読者は、バッファ内のコピーを編集コマンドで修正するのです。 バッファに対するそのような変更では、ファイルは変更しません。 したがって、変更を恒久的なものにするには、 読者はバッファを保存(save)する、つまり、 バッファの変更した内容をファイルにコピーし戻す必要があります。
ファイルとバッファの区別にも関わらず、 バッファを意味してファイルといったり、その逆のいい方をしばしばします。 もちろん、『同じ名前のファイルにただちに保存するつもりでバッファを 編集している』とはいわずに『ファイルを編集している』といいます。 しばしば、人間は明確に区別する必要はありません。 しかし、コンピュータプログラムを扱ううえでは、 区別を心得ておくことがよいのです。
24.1.1 ファイルを訪問する関数 The usual interface functions for visiting. 24.1.2 訪問するためのサブルーティン Lower-level subroutines that they use.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本節では、ファイルを訪問するために通常使う関数について述べます。 歴史的な理由で、これらの関数は`visit-'でなく`find-'という 名前で始まります。 バッファで訪問したファイルの名前を参照するための関数や変数、ならびに、 訪問したファイルの名前で既存バッファを探すための関数や変数については、 See 節 26.4 バッファファイル名。
Lispプログラムにおいて、ファイルの内容を変更せずにその内容を調べたいときには、 もっとも速い方法は一時的なバッファでinsert-file-contents
を 使うことです。 ファイルを訪問する必要はありませんし、それには余計に時間がかかります。 See 節 24.3 ファイルの読み込み。
関数find-file
の本体は非常に簡単で、つぎのとおりである。
(switch-to-buffer (find-file-noselect filename)) |
(27.7 ウィンドウへのバッファの表示のswitch-to-buffer
を参照。)
find-file
が対話的に呼び出されると、 ミニバッファでfilenameを問い合わせる。
find-file-noselect
が既存バッファを使うときには、 ファイルの内容が当該バッファに最後に訪問してから、あるいは、 当該バッファを最後に保存してから変更されたかどうかまず確認する。 ファイルが変更されていれば、この関数は変更されたファイルを 再度読み込むかどうかユーザーに問い合わせる。 ユーザーが`yes'と答えると、バッファ内の変更は破棄される。
省略可能な引数nowarnがnil
であると、 この関数はさまざまな場面で警告/助言メッセージを表示する。 たとえば、バッファを作成する必要があり、かつ、 指定したファイルfilenameがない場合には、 エコー領域にメッセージ`New file'を表示し、バッファは空にしておく。
関数find-file-noselect
は、 ファイルを読み込み終えると通常after-find-file
を呼び出す (see 節 24.1.2 訪問するためのサブルーティン)。 その関数は、バッファのメジャーモードを設定し、ローカル変数を解析し、 訪問したファイルより新しい自動保存ファイルが存在するとユーザーに警告を発し、 find-file-hooks
の関数を実行して処理を終える。
省略可能な引数rawfileがnil
以外であると、 after-find-file
を呼び出さず、 失敗してもfind-file-not-found-hooks
を実行しない。 さらに、rawfileの値がnil
以外であると、 コーディングシステムの変換(see 節 32.10 コーディングシステム)や 書式変換(see 節 24.12 ファイル書式変換)も行わない。
関数find-file-noselect
は、 ファイルfilenameを訪問したバッファを返す。
(find-file-noselect "/etc/fstab") => # |
このコマンドが対話的に呼び出されると、 filenameを問い合わせる。
find-file
のようにファイルfilenameを訪問した バッファを選択するが、当該バッファは読み出し専用となる。 See 節 26.7 読み出し専用バッファ。
このコマンドが対話的に呼び出されると、 filenameを問い合わせる。
view-mode-hook
を実行する。 see 節 22.6 フック。
view-file
が対話的に呼び出されると、 filenameを問い合わせる。
この変数はノーマルフックのように動作するが、 改名すべきではないと考えている。 see 節 22.6 フック。
find-file
やfind-file-noselect
に 存在しないファイルを与えたときに呼び出される関数のリストである。 find-file-noselect
は、ファイルが存在しないことがわかると ただちにこれらの関数を呼び出す。 nil
以外の値が返されるまで、リストに現れる順に呼び出す。 buffer-file-name
は設定済みである。
関数の値を使い、しかも、一部の関数だけを呼び出すので、 これはノーマルフックではない。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
関数find-file-noselect
は、ユーザーのLispコードでも有用な 2つの重要なサブルーティン、create-file-buffer
と after-find-file
を使います。 本節ではそれらの使い方を説明します。
注意:
create-file-buffer
は、 新たなバッファをファイルに対応付けないし、 当該バッファを選択しない。 デフォルトのメジャーモードも使わない。
(create-file-buffer "foo") => # |
この関数はfind-file-noselect
で使われる。 この関数はgenerate-new-buffer
(see 節 26.9 バッファの作成)を使う。
find-file-noselect
や デフォルトの復元処理関数(see 節 25.3 復元)から呼ばれる。
ディレクトリはあるのにファイルが存在しないために ファイルの読み込みがエラーになった場合には、 呼び出し側はerrorの値としてnil
以外を渡すこと。 その場合、after-find-file
は警告`(New File)'を表示する。 より重大なエラーの場合には、after-find-file
を呼び出すべきでない。
warnがnil
以外であると、 自動保存ファイルが存在しそれが訪問したファイルより新しい場合には、 この関数は警告を発する。
after-find-file
が最後に行うことは、 リストfind-file-hooks
内のすべての関数を呼び出すことである。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacsでファイルを編集するときには、 ファイルを訪問したバッファを実際には扱っています。 つまり、ファイルの内容はバッファにコピーされ、 そのコピーを編集しているのです。 バッファを変更しても、当該バッファを保存(save)するまで、 つまり、バッファの内容をファイルへコピーするまでは、 ファイルを変更しません。
save-buffer
は、バックアップの作成に責任がある。 通常、backup-optionはnil
であり、 save-buffer
は、ファイルを訪問してから 最初に保存するときにのみバックアップファイルを作成する。 backup-optionが別の値であると、 別の場面でもバックアップファイルを作成することを指示する。
save-buffer
は、バッファをつぎに保存したときに ファイルの現在の版をバックアップするように印を付ける。
save-buffer
は、保存するまえに無条件に ファイルのまえの版をバックアップする。nil
以外であると、 ユーザーに問い合わせずにファイルを訪問しているバッファをすべて保存する。
省略可能な引数exitingがnil
以外であると、 この関数は、ファイルを訪問していないある種のバッファを保存する機会も与える。 buffer-offer-save
のバッファローカルな値が nil
以外のバッファが対象となる。 (ユーザーがこれらのバッファの1つを保存するように答えると、 ファイル名を指定するように聞いてくる。) 関数save-buffers-kill-emacs
は、 この引数にnil
以外の値を渡す。
set-visited-file-name
(see 節 26.4 バッファファイル名) とsave-buffer
を呼び出して行う。バッファを保存すると、いくつかのフックを実行します。 また、書式変換(see 節 24.12 ファイル書式変換)を行い、 テキスト属性を『注記』(annotations)(see 節 31.19.7 テキスト属性をファイルへ保存する)に 保存することもあります。
nil
以外を返すと、すでにファイルに書き出したとみなして 残りの関数を呼び出さず、ファイルに書き出すための通常のコードも実行しない。
write-file-hooks
の関数がnil
以外を返すときには、 その関数には(必要ならば)バックアップファイルを作成する責任がある。 そのためにはつぎのコードを実行する。
(or buffer-backed-up (backup-buffer)) |
backup-buffer
が返したファイルモードの値を保存しておき、 読者が書くファイルのモードにその値を使いたい場合がある。 save-buffer
は通常そのようにする。
write-file-hooks
のフック関数は、 (必要ならば)データの符号化にも責任がある。 適切なコーディングシステム(see 節 32.10.3 Lispにおけるコーディングシステム)を選び、 符号化(see 節 32.10.7 明示的な符号化と復号化)を行い、 使用したコーディングシステムをlast-coding-system-used
に設定する (see 節 32.10.2 符号化と入出力)。
この変数をバッファローカルにはしないこと。 バッファ固有のフック関数を指定するには、 かわりにwrite-contents-hooks
を使う。
これはノーマルフックではないが、 add-hook
とremove-hook
でリストを扱える。 see 節 22.6 フック。
write-file-hooks
のように働くが、 特定のバッファにバッファローカルにするように意図してあり、 ファイル名に関するフックやバッファ内容を得た方法に関する フックとして使われる。
変数は恒久的にバッファローカルと印が付いているので、 メジャーモードを変更してもバッファローカルな値は変更されない。 これは、『ファイル』の内容を特別な方法で読み込み、 対応した方法でデータを保存するフックを設定するようなパッケージには便利である。
write-file-hooks
のように働くが、 ファイルの場所に関するフックではなく、 ファイルの内容に関するフックであると意図されている。 そのようなフックは、この変数のバッファローカルな束縛として メジャーモードが通常設定する。
この変数に設定すると自動的にバッファローカルになる。 このフックに要素を追加するためにadd-hooks
を使うときには、 引数localにnil
以外を指定しないこと。 この変数はバッファローカルのみであるからである。
nil
以外ならば、 save-buffer
は保存処理中の入出力エラーに備えて対処する。 つまり、目的の名前のファイルにではなく一時的な名前の新規ファイルに書き出し、 エラーがないことを確認してから目的の名前に改名する。 これにより、不正なファイルに起因する問題からディスク容量の不足といった 問題を回避できる。
副作用として、バックアップも必然的にコピーして行う。 see 節 25.1.2 改名によるバックアップかコピーによるバックアップか。 それと同時に、大事な(precious)ファイルとして保存すると、 読者が保存したファイルと別のファイル名とのあいだの ハードリンクをつねに切ってしまう。
特定のバッファではこの変数にnil
以外のバッファローカルな値を 指定するモードもある。
t
であると、save-buffer
は、 保存するバッファが改行で終っていないと黙ってファイルの末尾に改行を追加する。 この変数の値がt
ではないnil
以外であると、 save-buffer
は、必要な場面では 改行を追加するかどうかユーザーに問い合わせる。
この変数の値がnil
であると、save-buffer
は改行を追加しない。 デフォルト値はnil
であるが、特定のバッファではt
に 設定するメジャーモードもある。
関数set-visited-file-name
(see 節 26.4 バッファファイル名)も 参照してください。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
関数insert-file-contents
を使って ディスクからファイルをバッファへコピーできます。 ユーザーレベルのコマンドinsert-file
はマークを設定するので Lispプログラムでは使わないでください。
関数insert-file-contents
は、 ファイルの内容を定義済みのファイルの書式と比較し、 必要ならばファイルの内容を変換する。 see 節 24.12 ファイル書式変換。 リストafter-insert-file-functions
の関数も呼び出す。 31.19.7 テキスト属性をファイルへ保存するを参照。
visitがnil
以外であると、 この関数はバッファを未変更と印を付け、 ファイルfilenameを訪問しているバッファとなるように バッファのさまざまな部分を設定する。 これには、バッファが訪問しているファイルの名前、ファイル更新時刻を含む。 この機能はfind-file-noselect
で使われており、 読者自身が使うことはないであろう。
begとendがnil
以外であると、 それらは挿入すべきファイルの部分を指定する整数であること。 この場合、visitはnil
であること。 たとえば、
(insert-file-contents filename nil 0 500) |
はファイルの最初の500文字を挿入する。
引数replaceがnil
以外であると、 バッファの内容(実際には参照可能な部分のみ)を ファイルの内容で置き換えることを意味する。 これは、単純にバッファの内容を削除してからファイル全体を挿入するより 好ましい。 なぜなら、(1)マーカ位置を保存できる場合がある、 (2)アンドゥリストにほとんどデータを入れない、からである。
replaceとvisitがnil
である限り、 insert-file-contents
で(FIFOや入出力装置などの) 特別なファイルを読むことも可能である。
insert-file-contents
のように動作するが、 書式を変換しない(see 節 24.12 ファイル書式変換)、 文字コードを変換しない(see 節 32.10 コーディングシステム)、 find-file-hooks
を実行しない、自動的に解凍しないなどが異なる。別のプログラムが読めるようにファイル名を別のプロセスに渡すには、 関数file-local-copy
を使います。 24.11 ファイル名を『マジック』にするを参照してください。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
関数append-to-file
やwrite-region
を使って、 バッファの内容やその一部をディスク上のファイルへ直接書き出せます。 訪問しているファイルには、これらの関数で書き出さないでください。 訪問の機構に混乱をきたすことがあります。
nil
を返す。
書き込めないファイルをfilenameに指定したり、 ファイルを作成できないディレクトリ上の存在しないファイルを filenameに指定するとエラーを通知する。
startが文字列であると、 write-region
はバッファのテキストではなく その文字列を書いたり追加する。
appendがnil
以外であると、 指定したテキストを既存ファイル(があれば)の内容に追加する。
confirmがnil
以外であると、 filenameが既存ファイルの名前であると write-region
は確認を求める。
visitがt
であると、 Emacsはバッファとファイルの対応を確立する。 つまり、バッファはそのファイルを訪問していることになる。 さらに、カレントバッファの最終ファイル更新時刻を filenameの更新時刻にし、 バッファには未変更と印を付ける。 この機能はsave-buffer
が使っているが、 読者自身が使うことはないであろう。
visitが文字列であると、訪問するファイルの名前を指定する。 このようにして、データを1つのファイル(filename)に書き出す一方で、 バッファは別のファイル(visit)を訪問していると設定できる。 引数visitはエコー領域のメッセージに使われ、 ファイルのロックにも使われる。 visitはbuffer-file-name
に保存される。 この機能はfile-precious-flag
の実装に使われているが、 読者は、なにをしているか理解できない限り、この機能を使わないこと。
関数write-region
は、書き出すデータを buffer-file-format
で指定される適切なファイル書式に変換する。 see 節 24.12 ファイル書式変換。 さらに、リストwrite-region-annotate-functions
の関数も呼び出す。 31.19.7 テキスト属性をファイルへ保存するを参照。
通常、write-region
はエコー領域にメッセージ `Wrote filename'を表示する。 visitがt
でもnil
でも文字列でもないと、 このメッセージは表示しない。 この機能は、ユーザーが知る必要のない 内部目的にファイルを使うプログラムに有用である。
with-temp-file
は、一時的なバッファをカレントバッファとして フォームbodyを評価する。 そして最後にバッファの内容をファイルfileに書き出す。 終了すると一時的なバッファを削除し、 フォームwith-temp-file
のまえにカレントバッファであったバッファに戻る。 bodyの最後のフォームの値を返す。
throw
やエラーによる異常終了(see 節 9.5 非ローカル脱出)であっても カレントバッファに戻る。
26.2 カレントバッファのwith-temp-buffer
も参照。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
2人のユーザーが同時に同じファイルを編集すると、互いに干渉し合います。 Emacsは、ファイルが変更されるとファイルロック(file lock)を 記録することで、このような状況が発生しないように努めます。 すると、Emacsは別のEmacsがロックしているファイルを訪問した バッファを変更しようとする最初の試みを検出でき、 ユーザーにどうすべきかを問い合わせます。
複数の計算機がファイルシステムを共有している場合には、 ファイルロックには完全な信頼性はありません。 ファイルロックが働かないと、 2人のユーザーが同時に変更する可能性がありますが、 それでも、Emacsは2番目に保存したユーザーに警告できます。 また、ディスク上で変更されたファイルを訪問しているバッファの変更を 検出することで、同時編集のある場面を捕捉できます。 26.6 更新時刻の比較を参照してください。
nil
を返す。 このEmacsプロセスがロックしているときにはt
を返す。 他のEmacsがロックしている場合には、ロックしているユーザーの名前を返す。
(file-locked-p "foo") => nil |
t
であると、ファイルのロックを取得することを意味する。 すると、このユーザーはファイルを編集でき、 別のユーザーother-userはロックを失う。
nil
であると、ロックを無視して とにかくユーザーにファイルの編集を許す。
file-locked
を通知する。 この場合、ユーザーが行おうとしていた変更は行われない。
このエラーのエラーメッセージはつぎのようである。
error--> File is locked: file other-user |
ここで、file
はファイル名であり、 other-userはそのファイルをロックしているユーザー名である。
読者は、関数ask-user-about-lock
を 別の方法で決定する読者独自のものに置き換えてもよい。 通常の定義に対応したコードは`userlock.el'にある。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本節に述べる関数はすべて、ファイル名を表す文字列に作用します。 すべての関数の名前は単語`file'で始まり、 それらの引数は、特に断らないかぎり、 既存のファイルやディレクトリである必要があります。
24.6.1 参照可能性の検査 Is a given file readable? Writable? 24.6.2 ファイルの種類の区別 Is it a directory? A symbolic link? 24.6.3 実名 Eliminating symbolic links from a file name. 24.6.4 ファイルに関する他の情報 How large is it? Any other names? Etc.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
これらの関数は、特別な方法でファイル参照のパーミッションを検査します。
t
を返す。 これは必ずしもファイルを読めることは意味せず、 単にファイルの属性を調べられるだけである。 (UNIXでは、ファイルが存在し、かつ、 それを収めたディレクトリに対する実行パーミッションがあれば、 ファイル自体のパーミッションに関係なくこのようになる。)
ファイルが存在しなかったり、ファイルの属性を探す権限がなければ、 この関数はnil
を返す。
t
を返す。 さもなければnil
を返す。
(file-readable-p "files.texi") => t (file-exists-p "/usr/spool/mqueue") => t (file-readable-p "/usr/spool/mqueue") => nil |
t
を返す。 さもなければnil
を返す。 ファイルがディレクトリである場合、実行パーミッションは、 ディレクトリ内のファイルの存在やその属性を検査でき、 それらのファイルのモードが許せばオープンできることを意味する。t
を返し、さもなければnil
を返す。 ファイルに書き出せるのは、ファイルが存在し書ける場合である。 作成できるのは、ファイルは存在しないが 指定したディレクトリが存在しそのディレクトリに書ける場合である。
以下の3番目の例では、`foo'の親ディレクトリが存在しないので、 たとえディレクトリを作成できるとしても`foo'は書けない。
(file-writable-p "~/foo") => t (file-writable-p "/foo") => nil (file-writable-p "~/no-such-dir/foo") => nil |
t
を返す。 さもなければ(あるいは当該ディレクトリが存在しなければ)nil
を返す。 dirnameの値はディレクトリ名である。
例: つぎの例では、
(file-accessible-directory-p "/foo") => nil |
から、`/foo/'内のファイルを読もうとすると エラーになると推論できる。
nil
を返す。 しかし、オープンに失敗するとstringをエラーメッセージのテキストとした エラーを通知する。t
を返す。t
を返す。 filename1が存在しなければnil
を返す。 filename2が存在しなければt
を返す。
以下の例で、ファイル`aug-19'は19日に書かれ、 ファイル`aug-20'は20日に書かれ、 ファイル`no-file'は存在しないと仮定する。
(file-newer-than-file-p "aug-19" "aug-20") => nil (file-newer-than-file-p "aug-20" "aug-19") => t (file-newer-than-file-p "aug-19" "no-file") => t (file-newer-than-file-p "no-file" "aug-19") => nil |
file-attributes
を使って、 2つの数から成るリストとしてファイルの最終更新時刻を取得できる。 see 節 24.6.4 ファイルに関する他の情報。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本節ではさまざまな種類のファイル、つまり、 ディレクトリ、シンボリックリンク、普通のファイルを区別する方法を 説明します。
file-symlink-p
は当該リンクが指すファイルの名前を返す。 これは、テキストファイル、ディレクトリ、別のシンボリックリンク、 存在しないファイルの名前のいずれかである。
ファイルfilenameがシンボリックリンクでない (あるいは当該ファイルが存在しない)場合、 file-symlink-p
はnil
を返す。
(file-symlink-p "foo") => nil (file-symlink-p "sym-link") => "foo" (file-symlink-p "sym-link2") => "sym-link" (file-symlink-p "/bin") => "/pub/bin" |
t
を返し、 さもなければnil
を返す。
(file-directory-p "~rms") => t (file-directory-p "~rms/lewis/files.texi") => nil (file-directory-p "~rms/lewis/no-such-file") => nil (file-directory-p "$HOME") => nil (file-directory-p (substitute-in-file-name "$HOME")) => t |
t
を返す。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ファイルの実名(truename)とは、 シンボリックリンクをすべて辿り尽くしてから、 要素として現れる`.' や`..' を簡略化して得られる名前です。 厳密にいえば、ファイルが一意の実名を持つ必要はありません。 ファイルの異なる実名の個数は、当該ファイルに対するハードリンクの個数に 等しいのです。 それでも、実名はシンボリックリンクによる名前の変動を取り除くため、 実名は有用です。
file-truename
はファイルfilenameの実名を返す。 これはシンボリックリンクをすべて辿り尽くして得られる名前である。 引数は絶対ファイル名であること。関連情報については、See 節 26.4 バッファファイル名。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本節では、ファイルの内容以外の詳しい情報を得るための関数を説明します。 この情報には、参照パーミッションを制御するモードビット、 所有者とグループの番号、名前の個数、iノード番号、サイズ、 参照時刻と更新時刻が含まれます。
戻り値の最大値は4095(8進数7777)であり、これは、 だれもが読み/書き/実行でき、 所有者とグループの両者にビットSUIDが設定してあり、 スティッキービットも設定されていることを意味する。
(file-modes "~/junk/diffs") => 492 ; 10進整数 (format "%o" 492) => "754" ; 8進数に変換 (set-file-modes "~/junk/diffs" 438) => nil (format "%o" 438) => "666" ; 8進数に変換 % ls -l diffs -rw-rw-rw- 1 lewis 0 3063 Oct 30 16:00 diffs |
nil
を返す。 シンボリックリンクはそれが指すファイルの名前とはみなさないので、 シンボリックリンクはこの関数には効果を持たない。
% ls -l foo* -rw-rw-rw- 2 rms 4 Aug 19 01:27 foo -rw-rw-rw- 2 rms 4 Aug 19 01:27 foo1 (file-nlinks "foo") => 2 (file-nlinks "doesnt-exist") => nil |
nil
を返す。
リストの要素は順につぎのとおりである。
t
、 シンボリックリンクは(それが指す名前の)文字列、 テキストファイルはnil
である。
add-name-to-file
(see 節 24.7 ファイルの名前と属性の変更) を使って作成する。
current-time
の値と同様。 37.5 時刻を参照。)
t
。 さもなければnil
。
(high . low)
の形である。 ただし、lowは下位16ビットである。
たとえば、`files.texi'のファイル属性はつぎのようである。
(file-attributes "files.texi") => (nil 1 2235 75 (8489 20284) (8489 20284) (8489 20285) 14906 "-rw-rw-rw-" nil 129500 -32252) |
この意味はつぎのとおりである。
nil
1
2235
75
(8489 20284)
(8489 20284)
(8489 20285)
14906
"-rw-rw-rw-"
nil
129500
-32252
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本節の関数は、ファイルを改名/コピー/削除/リンクしたり、 ファイルのモードを設定するためのものです。
引数newnameをとる関数では、 newnameで指定したファイルが既存の場合、 関数の動作は引数ok-if-already-existsの値に依存します。
nil
であると、 エラーfile-already-exists
を通知する。
つぎの例では、2つのファイル`foo'と`foo3'がある。
% ls -li fo* 81908 -rw-rw-rw- 1 rms 29 Aug 18 20:32 foo 84302 -rw-rw-rw- 1 rms 24 Aug 18 20:31 foo3 |
add-name-to-file
を呼んでハードリンクを作成し、 ファイル一覧を表示し直す。 1つのファイルに2つの名前`foo'と`foo2'があることがわかる。
(add-name-to-file "foo" "foo2") => nil % ls -li fo* 81908 -rw-rw-rw- 2 rms 29 Aug 18 20:32 foo 81908 -rw-rw-rw- 2 rms 29 Aug 18 20:32 foo2 84302 -rw-rw-rw- 1 rms 24 Aug 18 20:31 foo3 |
最後につぎの式を評価し
(add-name-to-file "foo" "foo3" t) |
ファイル一覧を表示し直す。 今度は、1つのファイルに3つの名前`foo'、`foo2'、`foo3'がある。 古い`foo3'の内容は失われている。
(add-name-to-file "foo1" "foo3") => nil % ls -li fo* 81908 -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo 81908 -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo2 81908 -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo3 |
1つのファイルに複数の名前を許さないオペレーティングシステムでは、 この関数は意味がない。
24.6.4 ファイルに関する他の情報のfile-nlinks
も参照。
filenameにfilename以外の名前があれば、 それらの名前は存在し続ける。 実際、add-name-to-file
で名前newnameを追加してから filenameを削除すると、一時的な中間状態があることを除けば、 改名と同じ効果がある。
対話的に呼び出されると、この関数は ミニバッファでfilenameとnewnameを聞く。 また、newnameが既存であると確認を求める。
timeがnil
以外であると、 この関数は新たなファイルに古いファイルと同じ最終更新時刻を与える。 (これは特定のオペレーティングシステムでのみ動作する。) 時刻設定でエラーがあると、copy-file
は エラーfile-date-error
を通知する。
対話的に呼び出されると、この関数は ミニバッファでoldnameとnewnameを聞く。 また、newnameが既存であると確認を求める。
ファイルが存在しなかったり削除できないと、 エラーfile-error
の適切な種類が通知される。 (UNIXでは、ファイルを収めたディレクトリに書けると 当該ファイルは削除可能である。)
24.10 ディレクトリの作成と削除のdelete-directory
も参照。
対話的に呼び出されると、この関数は ミニバッファでfilenameとnewnameを聞く。 また、newnameが既存であると確認を求める。
引数modeは整数であること。 ほとんどのシステムでは、modeの下位9ビットのみが意味を持つ。
既存ファイルの変更を保存することはファイルの作成とはみなさないため、 ファイルのモードは変わらず、デフォルトのファイルモードを使わない。
MS-DOSでは、『実行可能』ファイルモードビットのようなものはありません。 そのためEmacsは、`.com'、`.bat'、`.exe'のいずれかで 終る名前のファイルを実行可能であるとみなします。 これは、file-modes
やfile-attributes
が返す値に反映されます。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
他の場面と同様にEmacsでは、一般にファイルはその名前で参照します。 Emacsではファイル名は文字列で表します。 ファイルを操作する関数はすべてファイル名引数を仮定します。
ファイル自体の操作に加えて、Emacs Lispプログラムは ファイルの名前そのものを操作する必要があります。 つまり、ファイル名を分解したり、関連するファイル名を作成するために その一部を使います。 本節ではファイル名を操作する方法を説明します。
本節の関数は実際にはファイルを参照しませんから、 既存のファイルやディレクトリを表さないファイル名を操作できます。
VMSでは、これらの関数はすべて、VMSのファイル名構文と UNIXの構文の両方を理解します。 つまり、標準LispライブラリはUNIX構文でファイル名を指定でき、 変更せずにVMS上で正しく動作します。 MS-DOSやMS-Windowsでは、これらの関数は、 UNIX構文に加えてMS-DOSやMS-Windowsのファイル名構文を理解します。
24.8.1 ファイル名の構成要素 The directory part of a file name, and the rest. 24.8.2 ディレクトリ名 A directory's name as a directory is different from its name as a file. 24.8.3 ファイルの絶対名と相対名 Some file names are relative to a current directory. 24.8.4 ファイル名を展開する関数 Converting relative file names to absolute ones. 24.8.5 一意なファイル名の生成 Generating names for temporary files. 24.8.6 ファイル名の補完 Finding the completions for a given file name. 24.8.7 標準ファイル名 If your package uses a fixed file name, how to handle various operating systems simply.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
オペレーティングシステムは、一連のファイルをディレクトリにまとめます。 ファイルを指定するには、ディレクトリと当該ディレクトリ内のファイルの名前を 指定する必要があります。 そのためEmacsは、ファイル名には2つの部分、 ディレクトリ名(directory name)部分と 非ディレクトリ名(nondirectory name)部分 (つまりディレクトリ内のファイル名)があるとみなします。 どちらかの部分は空でもかまいません。 これらの2つの部分を連結するともとのファイル名になります。
UNIXでは、ディレクトリ部分は最後のスラッシュまでを含んだ部分であり、 非ディレクトリ部分は残りの部分です。 VMSの構文規則は複雑です。
ある種の目的のために、非ディレクトリ部分をさらに 名前だけの部分と版番号(version number)に分けます。 UNIXでは、バックアップファイルだけにそれらの名前に版番号があります。 VMSでは各ファイルに版番号がありますが、 ほとんどの場合、Emacsで実際に使うファイル名では版番号を省略します。 そのため、Emacsで版番号が見えるのは多くの場合ディレクトリ一覧です。
nil
)を返す。 UNIXでは、この関数はスラッシュで終る文字列を返す。 VMSでは、`:'、`]'、`>'のいずれかで終る文字列を返す。
(file-name-directory "lewis/foo") ; UNIXの例 => "lewis/" (file-name-directory "foo") ; UNIXの例 => nil (file-name-directory "[X]FOO.TMP") ; VMSの例 => "[X]" |
(file-name-nondirectory "lewis/foo") => "foo" (file-name-nondirectory "foo") => "foo" ;; つぎの例はVMSでのみ正確である (file-name-nondirectory "[X]FOO.TMP") => "FOO.TMP" |
(file-name-sans-versions "~rms/foo.~1~") => "~rms/foo" (file-name-sans-versions "~rms/foo~") => "~rms/foo" (file-name-sans-versions "~rms/foo") => "~rms/foo" ;; つぎの例はVMSでのみ正確である (file-name-sans-versions "foo;23") => "foo" |
(file-name-sans-extension "foo.lose.c") => "foo.lose" (file-name-sans-extension "big.hack/foo") => "big.hack/foo" |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ディレクトリ名(directory name)とはディレクトリの名前です。 ディレクトリはファイルの一種であり、ファイル名を持ちますが、 それはディレクトリ名に関連付けられますが同一ではありません。 (これはUNIXの通常の用語と同じではない。) 同じものに対するこれらの異なる2つの名前は、構文の変換で関連付けます。 UNIXではこれは簡単であり、ディレクトリ名はスラッシュで終りますが、 ファイルとしてのディレクトリの名前にはスラッシュはありません。 VMSでは、関係はより複雑です。
ディレクトリ名とそのファイルとしての名前との違いはわずかですが重大です。 Emacsの変数や関数引数がディレクトリ名と記述されているときには、 ディレクトリのファイルとしての名前は受け付けません。
つぎの2つの関数はディレクトリ名とファイルとしての名前を相互に変換します。 これらは、`$HOME'などの環境変数置換や `~'や`..'などの構造にはなにも特別なことはしません。
(file-name-as-directory "~rms/lewis") => "~rms/lewis/" |
(directory-file-name "~lewis/") => "~lewis" |
シンボリックリンクを介して通常参照されるディレクトリには ディレクトリ名の省略形が有用です。 ユーザーはリンクの名前をディレクトリの『名前』としばしばみなし、 ディレクトリの『本当の』名前を見るのをわずらわしく思うことがあります。 リンク名を『本当の』名前の省略形と定義しておくと、 Emacsはユーザーに省略形を表示します。
directory-abbrev-alist
は、 ディレクトリに使う省略形の連想リストを保持する。 各要素は(from . to)
の形であり、 ディレクトリ名にfromが現れるとこれをtoに置き換えることを指示する。 文字列fromは実際には正規表現であり、つねに`^'で始まること。 関数abbreviate-file-name
がこれらの置換を行う。
ファイル`site-init.el'でこの変数に設定し、 読者のサイトに適した省略形を記述できる。
ファイルシステム`/home/fsf'などをシンボリック名`/fsf'で通常参照する システムの例をつぎに示す。
(("^/home/fsf" . "/fsf") ("^/home/gp" . "/gp") ("^/home/gd" . "/gd")) |
ディレクトリ名をその省略形に変換するには、つぎの関数を使います。
directory-abbrev-alist
の省略形を引数に適用し、 ユーザーのホームディレクトリを`~'に置き換える。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ファイルシステム内のすべてのディレクトリは、 ルートディレクトリから始まる木を形作ります。 ファイル名では、木のルートから始まるすべてのディレクトリ名を指定できて、 これを絶対(absolute)ファイル名と呼びます。 あるいは、デフォルトディレクトリを基準に 木の中でのファイルの位置を指定することもでき、 これを相対(relative)ファイル名と呼びます。 UNIXでは、絶対ファイル名はスラッシュかティルダ(`~')で始まり、 相対ファイル名はそれらでは始まりません。 VMSでの規則は複雑です。
t
を返し、 さもなければnil
を返す。 VMS上では、この関数はUNIXの構文とVMSの構文の両方を理解する。
(file-name-absolute-p "~rms/foo") => t (file-name-absolute-p "rms/foo") => nil (file-name-absolute-p "/user/rms/foo") => t |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ファイル名の展開(expansion)とは、 相対ファイル名を絶対ファイル名に変換することです。 これはデフォルトディレクトリを基準に行うので、 展開すべきファイル名に加えて、デフォルトディレクトリの名前も 指定する必要があります。 また、展開では、`./'や`name/../'のような冗長部分を 取り除いてファイル名を単純にします。
default-directory
の値を使う。 たとえばつぎのとおり。
(expand-file-name "foo") => "/xcssun/users/rms/lewis/foo" (expand-file-name "../foo") => "/xcssun/users/rms/foo" (expand-file-name "foo" "/usr/spool/") => "/usr/spool/foo" (expand-file-name "$HOME/foo") => "/xcssun/users/rms/lewis/$HOME/foo" |
`.'や`..'を含むファイル名は、それらの正則な形に単純化する。
(expand-file-name "bar/../foo") => "/xcssun/users/rms/lewis/foo" |
expand-file-name
は環境変数を展開しないことに注意。 substitute-in-file-name
だけがそれを行う。
絶対ファイル名が装置名で始まるシステムもある。 そのようなシステムでは、directoryとfilenameが 2つの異なる装置名で始まると、 filenameに等価なdirectoryを基準にした相対名はない。 そのような場合、file-relative-name
は 絶対名の形でfilenameを返す。
(file-relative-name "/foo/bar" "/foo/") => "bar" (file-relative-name "/foo/bar" "/hack/") => "/foo/bar" |
expand-file-name
は、その第2引数がnil
であると デフォルトディレクトリを使う。
UNIXでは、この値はつねにスラッシュで終る文字列である。
default-directory => "/user/lewis/manual/" |
環境変数名は、`$'に続く(下線を含む)英数字の列である。 `$'のつぎの文字が`{'であると、 対応する`}'までが変数名である。
ここでは、環境変数HOME
はユーザーのホームディレクトリ名 `/xcssun/users/rms'を保持していると仮定する。
(substitute-in-file-name "$HOME/foo") => "/xcssun/users/rms/foo" |
置換後、`/'のつぎに`~'か`/'が現れると、 `/'までの部分をすべて取り除く。
(substitute-in-file-name "bar/~/foo") => "~/foo" (substitute-in-file-name "/usr/local/$HOME/foo") => "/xcssun/users/rms/foo" ;; `/usr/local/' has been discarded. |
VMSでは、`$'による置換は行わないため、 この関数は冗長部分を取り除く以外にはなにも行わない。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
一時的なファイルに書く必要があるプログラムもあります。 そのようなファイル向けの名前を作る通常の方法はつぎのとおりです。
(make-temp-name (expand-file-name name-of-application temporary-file-directory)) |
make-temp-name
の仕事は、 異なる2人のユーザーや異なる2つのジョブがまったく同じファイル名を 使わないようにすることです。 この例では、変数temporary-file-directory
を使って 一時的なファイルを置く場所を決めています。 すべてのEmacs Lispプログラムでは、 すべての一時的なファイル向けのディレクトリを指定する 一意な方法をユーザーに提供するために、 この目的にはtemporary-file-directory
を使うべきです。
(make-temp-name "/tmp/foo") => "/tmp/foo232J6v" |
同じEmacsで動作している異なるライブラリのあいだで衝突しないように、 make-temp-name
を使う各Lispプログラムでは、 独自のstringを使うべきである。 stringの末尾に付加される数は、 異なるEmacsジョブで動いている同じアプリケーションを区別する。 文字を余計に追加することで、1つのEmacsジョブであっても 異なる名前の個数を非常に多くできる。
expand-file-name
の第2引数に使うと、 そのようにできる。
デフォルト値は、読者のオペレーティングシステムにおいて 合理的な方法で決定される。 GNUとUNIXシステムでは、環境変数TMP
やTMPDIR
を基にする。
読者が一時的なファイル名を選ぶためにmake-temp-name
を 使わない場合であっても、 一時的なファイル名を置くディレクトリを決めるために この変数を使うべきである。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本節では、ファイル名の補完向けの低レベルのサブルーティンについて述べます。 他の補完関数については、19.5 補完を参照してください。
引数partial-filenameは、ディレクトリ部分やスラッシュを いっさい含まないファイル名であること。 directoryが絶対名でないと、 カレントバッファのデフォルトディレクトリをdirectoryのまえに補う。
つぎの例で、カレントデフォルトディレクトリは`~rms/lewis'であり、 `f'で始まる名前のファイルは、 `foo'、`file~'、`file.c'、`file.c.~1~'、 `file.c.~2~'の5つであると仮定する。
(file-name-all-completions "f" "") => ("foo" "file~" "file.c.~2~" "file.c.~1~" "file.c") (file-name-all-completions "fo" "") => ("foo") |
filenameで始まるものがたった1つであり完全に一致すると、 この関数はt
を返す。 ディレクトリdirectoryにfilenameで始まる名前がないと nil
を返す。
つぎの例で、カレントデフォルトディレクトリには `f'で始まる名前のファイルは、 `foo'、`file~'、`file.c'、`file.c.~1~'、 `file.c.~2~'の5つであると仮定する。
(file-name-completion "fi" "") => "file" (file-name-completion "file.c.~1" "") => "file.c.~1~" (file-name-completion "file.c.~1~" "") => t (file-name-completion "file.c.~3" "") => nil |
file-name-completion
は、このリスト内のいずれかの文字列で終る 名前のファイルを通常無視する。 補完候補すべてがこれらの接頭辞の1つで終る場合や、 補完候補すべてを含んだバッファが表示されている場合には無視しない。
典型的な値はつぎのとおりである。
completion-ignored-extensions => (".o" ".elc" "~" ".dvi") |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Lispプログラムで使われるほとんどのファイル名は、 ユーザーが入力したものです。 しかし、Lispプログラムでは、 特定目的の標準ファイル名を指定する必要がある場合があります。 典型的には、各ユーザーごとのカスタマイズ情報を保持するものです。 たとえば、省略形の定義は(デフォルトでは) ファイル`~/.abbrev_defs'に保存されます。 パッケージcompletion
は、 補完情報をファイル`~/.completions'に保存します。 これらは、Emacsで特定目的に使われる多くの標準ファイル名のうちの2つです。
さまざまなのオペレーティングシステムには、 正しいファイル名やユーザーのプロフィールデータに使うファイル名に 独自の慣習があります。 標準ファイル名を使用するファイルを読み込むLispプログラムでは、 各システムごとに当該システムに適したファイル名を使うべきです。 関数convert-standard-filename
は、これを簡単にします。
Lispプログラムにおいて標準ファイル名を指定する推奨方法は、 GNUとUNIXシステムの慣習に従った名前を選ぶことです。 つまり、ピリオドで始まる非ディレクトリ部分を選び、 それを直接使うかわりにconvert-standard-filename
に渡します。 パッケージcompletion
からの例をつぎに示します。
(defvar save-completions-file-name (convert-standard-filename "~/.completions") "*The file name to save completions to.") |
GNUとUNIXシステム、および、他のいくつかのシステムでは、 convert-standard-filename
は引数を未変更で返します。 別のシステムでは、システムの慣習に従うように名前を変更します。
たとえば、MS-DOSではこの関数は、先頭の`.'を`_'に、 `.'がどこにもなければ名前の途中の`_'を`.'に、 8文字目のうしろに`.'がなければ`.'を挿入し、 `.'以降の3文字よりうしろを切り詰めるなどを行います。 (これ以外にも変更する。) したがって、`.abbrev_defs'は`_abbrev.def'となり、 `.completions'は`_complet.ion'となります。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ディレクトリは、さまざまな名前で入れた別のファイルを 収めているファイルの一種です。 ディレクトリは、ファイルシステムの機能です。
Emacsは、ディレクトリ内のファイル名をLispのリストとして一覧にしたり、 シェルコマンドls
を使ってバッファに名前を表示できます。 後者の場合、コマンドls
に渡したオプションに応じて、 各ファイルに関する情報も表示できます。
full-nameがnil
以外であると、 関数はファイルの絶対ファイル名を返す。 さもなければ、指定したディレクトリに対する相対名を返す。
match-regexpがnil
以外であると、 この関数は正規表現match-regexpに一致するファイル名のみを返す。 つまり、他の名前のファイルはリストから除かれる。
nosortがnil
以外であると、 directory-files
はリストをソートしないので、 ファイル名の順番に規則はない。 処理速度を最大にしてファイルの処理順序に拘らないならば、これを用いる。 処理順序がユーザーに見える場合には、 ソートしたほうがユーザーは幸せであろう。
(directory-files "~lewis") => ("#foo#" "#foo.el#" "." ".." "dired-mods.el" "files.texi" "files.texi.~1~") |
directoryが読めないディレクトリの名前であるとエラーを通知する。
ls
にswitchesを渡して表示した ディレクトリfileの一覧を(カレントバッファに)挿入する。 ポイントは挿入したテキストのうしろに置かれる。
引数fileは、ディレクトリ名であるか ワイルドカードを含んだファイル指定である。 wildcardがnil
以外であると、 fileをワイルドカードを含むファイル指定として扱う。
full-directory-pがnil
以外であると、 ディレクトリ一覧はディレクトリの全内容を表すと仮定することを意味する。 fileがディレクトリでありswitchesに`-d'を含まない場合には、 t
を指定すべきである。 (ls
のオプション`-d'は、 ディレクトリの内容ではなく、ファイルとしてのディレクトリ自身を 表示することを意味する。)
この関数は、変数insert-directory-program
で指定される 名前のディレクトリ表示プログラムを実行して動作する。 wildcardがnil
以外であると、 ワイルドカードを展開するためにshell-file-name
で指定される シェルを実行する。
insert-directory
で ディレクトリ一覧を生成するために実行するプログラムである。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacs Lispのほとんどのファイル操作関数は、 ディレクトリであるファイルに使うとエラーになります。 たとえば、delete-file
ではディレクトリを削除できません。 これらの特別な関数はディレクトリを作成したり削除するためのものです。
delete-file
は、ディレクトリであるファイルには使えない。 ディレクトリにはdelete-directory
を使う必要がある。 ディレクトリ内にファイルがあると、delete-directory
は エラーを通知する。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
特定のファイル名を特別に扱うことができます。 これをそれらの名前をマジック(magic)にするといいます。 この機能の主な用途はリモートファイル名 (see 節 `リモートファイル' in
マジックファイル名の種類を定義するには、 名前のクラス(正規表現に一致するものすべて)を定義する正規表現と、 それに一致するファイルに対する Emacsの基本ファイル操作を実装するハンドラを指定する必要があります。
変数file-name-handler-alist
は、 ハンドラと当該ハンドラの適用を決定する正規表現からなるリストを保持します。 各要素の形はつぎのとおりです。
(regexp . handler) |
Emacsのすべてのファイル操作基本関数とファイル名変換基本関数は、 指定された名前をfile-name-handler-alist
に対して検査します。 ファイル名がregexpに一致すると、 基本関数はhandlerを呼び出して当該ファイルを処理します。
handlerに与える最初の引数は基本関数の名前です。 残りの引数は当該操作に渡されるべき引数です。 (それらの引数の最初のものは典型的にはファイル名自身である。) たとえば、つぎのようにした場合、
(file-exists-p filename) |
filenameにハンドラhandlerがあると、 handlerはつぎのように呼び出されます。
(funcall handler 'file-exists-p filename) |
つぎは、マジックファイル名のハンドラが処理すべき操作です。
add-name-to-file
、copy-file
、delete-directory
、 delete-file
、 diff-latest-backup-file
、 directory-file-name
、 directory-files
、 dired-call-process
、 dired-compress-file
、dired-uncache
、 expand-file-name
、 file-accessible-directory-p
、
file-attributes
、 file-directory-p
、 file-executable-p
、file-exists-p
、
file-local-copy
、 file-modes
、file-name-all-completions
,
file-name-as-directory
、 file-name-completion
、 file-name-directory
、 file-name-nondirectory
、 file-name-sans-versions
、file-newer-than-file-p
、 file-ownership-preserved-p
、 file-readable-p
、file-regular-p
、file-symlink-p
、 file-truename
、file-writable-p
、 find-backup-file-name
、 get-file-buffer
、
insert-directory
、 insert-file-contents
、 load
, make-directory
、 make-symbolic-link
、rename-file
、set-file-modes
、 set-visited-file-modtime
、shell-command
、
unhandled-file-name-directory
、 vc-registered
、 verify-visited-file-modtime
、
write-region
。
insert-file-contents
に対するハンドラは、 引数visitがnil
以外であるときには (set-buffer-modified-p nil)
を使って バッファの変更フラグをクリアする必要が典型的にはあります。
ハンドラ関数は、上のすべての操作、ならびに、 将来追加されるものを扱える必要があります。 これらの操作すべてをハンドラ自身で実装する必要はありません。 特定の操作について特別なことを行う必要がなければ、 『通常どおりに』操作を処理するために基本関数を再起動できます。 ハンドラが認識できない操作については、 基本関数を再起動するべきです。 1つの方法はつぎのとおりです。
(defun my-file-handler (operation &rest args) ;; まず、特別に扱う必要がある操作かどうか検査する (cond ((eq operation 'insert-file-contents) ...) ((eq operation 'write-region) ...) ... ;; 知らない操作を扱う (t (let ((inhibit-file-name-handlers (cons 'my-file-handler (and (eq inhibit-file-name-operation operation) inhibit-file-name-handlers))) (inhibit-file-name-operation operation)) (apply operation args))))) |
ハンドラ関数で、指定された操作についてはEmacsの通常の基本関数を呼び出すと 決定したときには、基本関数から同じハンドラが再度呼ばれて 無限再帰になることを防ぐ必要があります。 上の例は、変数inhibit-file-name-handlers
と inhibit-file-name-operation
を使ってこれを行う方法を示すものです。 それらを上に示したとおりに使うように注意してください。 複数のハンドラがあったり、 2つのファイルを扱う操作において各ファイルにハンドラがある場合には、 この詳細は重要です。
nil
を返す。 引数operationは、ファイルに対して適用する操作であること。 つまり、ハンドラを呼び出すときに第1引数として渡される値。 当該操作はinhibit-file-name-operation
と比較する必要がある。filenameが、 Emacsの外側のプログラムからは直接読んだり書けないマジックファイル名であると、 この関数は普通のファイルにコピーしてそのファイルの名前を返す。
filenameが普通のファイル名でマジックでなければ、 この関数はなにもせずにnil
を返す。
これは実行中のサブプロセスに有用である。 各サブプロセスには、カレントディレクトリとしてマジックでないディレクトリが 必要であり、この関数はそれを扱うのによい方法である。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
変数format-alist
は、 Emacsバッファ内のデータ(テキスト、テキスト属性、その他の情報)を ファイル内でテキスト表現する方法を記述した ファイル書式(file format)のリストを定義します。 Emacsはファイルを読み書きするときに必要ならば書式変換を行います。
(name doc-string regexp from-fn to-fn modify mode-fn) |
書式定義の各要素の意味はつぎのとおりです。
シェルコマンドは文字列で表現し、 Emacsは変換を行うために当該コマンドをフィルタとして実行する。
from-fnが関数であると、 バッファの変換すべき部分を指定するbeginとendの2つの引数で 呼ばれる。 当該関数はその場で編集してテキストを変換すること。 これによりテキストの長さが変わる可能性があるので、 from-fnは変更部分の末尾位置を返すこと。
from-fnの責任の1つは、 ファイルの先頭がregexpで始まらないように保証することである。 さもないと、再度呼び出される可能性がある。
to-fnが文字列であるとそれはシェルコマンドであり、 Emacsは変換を行うために当該コマンドをフィルタとして実行する。
to-fnが関数であると、 バッファの変換すべき部分を指定するbeginとendの2つの引数で 呼ばれる。 変換を行うには2つの方法がある。
(position . string)
の形の要素から成り、 positionは書き出すべきテキスト内での相対位置を指定する整数、 stringはそこに追加すべき注記である。 to-fnがリストを返すときには、 リストはpositionの順にソートしてあること。
write-region
がバッファからファイルへ実際に書き出すとき、 指定された注記を対応する位置に埋め込む。 これらすべては、バッファを変更せずに行われる。
t
、 注記のリストを返す場合にはnil
である。
関数insert-file-contents
は、指定されたファイルを読み込むときに ファイル書式を自動的に認識します。 ファイルの先頭のテキストを書式定義の正規表現に対して検査して、 一致がみつかれば当該書式の復号化関数を呼び出します。 そして、既知の書式について再度調べ直します。 適用できる書式がなくなるまで検査し続けます。
関数find-file-noselect
やこれを使うコマンドでファイルを訪問すると、 (insert-file-contents
を呼び出すので)同様に変換を行います。 さらに、この関数は、復号した各書式についてモード関数を呼び出します。 バッファローカルな変数buffer-file-format
に 書式名のリストを保存します。
write-region
がデータをファイルに書き出すときには、まず、 buffer-file-format
で指定された書式の符号化関数を リストに現れる順に呼び出します。
引数formatは、書式名のリストである。 formatがnil
であると、変換を行わない。 対話的に呼び出した場合、 formatにnil
を指定するにはRETのみを打つ。
nil
以外であると、 それらは、insert-file-contents
(see 節 24.3 ファイルの読み込み)と同様に、 読み込むべきファイルの部分を指定する。
戻り値は、insert-file-contents
が返す値に似ており、 絶対ファイル名と挿入データの(変換後の)長さのリストである。
引数formatは、書式名のリストである。 formatがnil
であると、変換を行わない。 対話的に呼び出した場合、 formatにnil
を指定するにはRETのみを打つ。
buffer-file-format
の値のように、書式名のリストであるが、 buffer-file-format
のかわりに 自動保存ファイルを書くために使われる。 この変数は、すべてのバッファにおいてつねにバッファローカルである。[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |