検索エンジンから来た人に注意このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。 したがって、一般的な Emacs ユーザーにとっては、
このマニュアルと実機の動作とが符合しない場合があります。
|
Emacsでは、ファイルとファイル・ディレクトリに対し、探索する、新規作成する、 ながめる、保存する、などの作業ができます。本章ではEmacs lispのファイル に関係する関数のうちの大部分のものを説明しますが、section バッファで説明して いるのもあります。また、バックアップや自動セーブに関連する関数は、 section バックアップと自動セーブで説明しています。
ファイル関数の多くは、
引数として一つないしはそれ以上の数のファイル名を取ります。
ファイル名とは、実際には文字列のことです。
これらの関数のほとんどは、expand-file-name
を使ってファイル名を
展開します。これにより相対ファイル名(`../'を含む)を取り扱うように、
`~'を正しく取り扱います。これらの関数は`$HOME'などの環境変数の
置換は行ないません。See section ファイル名を展開する関数。
ファイルをvisitするとは、バッファにファイルを読み込むことを意味します。 visitを一度した後は、バッファがそのファイルを visitしている(visiting)といい、 そのファイルを、バッファにより"visitされているファイル"と呼びます。
ファイルとバッファは二つの異なったものです。 ファイルはコンピュータの中に(消さないかぎりは)ずっと記録されている情報です。 一方バッファは、Emacsの内部的な情報であり、Emacsの編集のセッションが 終ったとき(あるいはバッファをkillしたとき)にはなくなってしまうものです。 通常、バッファはあなたがファイルからコピーした情報を持っています。 このとき、そのバッファはファイルをvisitしているといいます。 バッファ中のコピーに対して、あなたは編集のコマンドを使って編集をします。 そのようなバッファに対しての修正は、ファイルには反映されません。 ですから、その変更点をファイルに反映させるには、バッファを保存(save) しなければなりません。それは変更されたバッファの内容を、ファイルにコピー しなおすことを意味します。
ファイルとバッファには以上のような違いがあるのですが、バッファを意味して いるときにファイルのことを言及してみたり、またこの逆の場合があったりとい うことがあります。実際、 "私はバッファを編集していて、すぐに同じ名前をもつファイルとして保存します" という言い方よりはむしろ、"私はファイルを編集しています"という言い方を します。 人は通常この区別を明示的にする必要はありません。しかし、コンピュータ・ プログラム中でファイル、バッファを扱うときは、この区別を念頭に置くとよい でしょう。
本節では、ファイルをvisitするのに通常使われる関数について説明します。 歴史的な理由により、これらの関数は`visit-'で始まる名前ではなく、 `find-'で始まる名前を持ちます。バッファがvisitしているファイルの名前に アクセスする、あるいは、ファイルの名前から存在するバッファをみつける関数と 変数についてはSee section バッファ・ファイル名。
Lispプログラムで、ファイルの中身は見たいが、変更はしたくない場合、
最も手っ取り早い方法は、一時バッファでinsert-file-contents
を
使うことです。ファイルをvisitする必要はなく、visitする方が時間もかかります。
See section ファイルからの読込み。
find-file
の本体はとても単純で、以下のようになっています。
(switch-to-buffer (find-file-noselect filename))
(section ウィンドウ内でのバッファの表示のswitch-to-buffer
を参照。)
find-file
が対話的に呼ばれたときは、ミニバッファにおいて
filenameの入力を促します。
find-file-noselect
が、
すでに存在するバッファを使用するときは、まず最初に、そのファイルがその
バッファにおいて最後にvisit、あるいは保存されてから、変更がないことを確認
します。変更がある場合には、この関数は、ユーザに対し、その変更前の元の
ファイルを読み込み直すかどうかを尋ねます。ユーザが、この質問に`yes'
と答えた場合、それまでにそのバッファにしたすべての変更は失われます。
もしfind-file-noselect
が、バッファを新規に作成する必要があり、
かつfilenameという名前のファイルが存在しない場合、エコー領域に
`New file'というメッセージを表示し、バッファの内容を空のままにします。
find-file-noselect
関数は、ファイルを読み込んだ後、
after-find-file
を呼び出します(see section visitのためのサブルーチン)。
この関数は、バッファの主モードを設定し、ローカル変数を構文解析し、
今現在visitしているファイルよりも、新しく自動セーブされた
ファイルが存在する場合には警告をユーザに出し、最後に、
find-file-hooks
の中の関数を起動します。
find-file-noselect
関数は、ファイルfilenameをvisitしている
バッファを返値として返します。
(find-file-noselect "/etc/fstab") => #<buffer fstab>
このコマンドが対話的に呼ばれた場合、filenameの入力をユーザに促します。
find-file
と同様、ファイルfilenameをvisit
するバッファを選択しますが、この関数はバッファを読出し専用とします。
関連する関数および変数は、See section 読みだし専用バッファ。
このコマンドが対話的に呼ばれた場合、filenameの入力をユーザに促します。
view-mode-hook
を起動します。See section フック。
view-file
が対話的に呼ばれた場合、filenameの入力をユーザに
促します。
この変数は、正規フックのように動作しますが、しかしこの変数名を変えてしまう のは、おすすめできません。
find-file
ないしはfind-file-noselect
が
存在しないファイルに対して呼ばれたとき、呼び出される関数のリストです。
find-file-noselect
は、ファイルが存在しないことを確認すると、
すぐにこれらの関数を呼び出します。この関数は、リストの要素を、
順に非nil
を返す関数があるまで呼ばれます。buffer-file-name
は、
すでに設定されています。
関数の返値が使用され、その関数すべてが呼び出されないかもしれないので、 これは正規フックではありません。
find-file-noselect
関数は、create-file-buffer
と
after-find-file
関数をサブルーチンとして使います。
それらを直接的に呼び出すことは、時には便利な場合もあります。
注意:
create-file-buffer
は、ファイルとその作成された新しいバッファを
関係づけるものではありません。またバッファの選択も行ないません。
またこの関数は、デフォルトの主モードを使いません。
(create-file-buffer "foo") => #<buffer foo> (create-file-buffer "foo") => #<buffer foo<2>> (create-file-buffer "foo") => #<buffer foo<3>>
この関数は、find-file-noselect
によって使われます。
この関数は、generate-new-buffer
を使います。
(see section バッファの生成)
find-file-noselect
と、
デフォルトの復帰の関数より呼ばれます(see section 復帰)。
ファイル読み込み時に、ファイルは存在しないが、ディレクトリは存在して
エラーを引き起こした場合には、呼び出し側はerrorに非nil
値
をわたすべきです。この場合、after-find-file
は、警告のメッセージを
出します。`(New File)'。より深刻なエラーの場合には、呼び出し側は、
after-find-file
を呼び出すべきではありません。
warnが非nil
の場合、この関数は、自動セーブ・ファイルが存在し、
それがvisitされるファイルより新しく作成されたものならば、警告の
メッセージを出します。
最後に、after-find-file
は、find-file-hooks
中のすべての関数を
呼び出します。
あなたがEmacsでファイルを編集しているときは、実際は、そのファイルをvisit しているバッファに対して作業を行っています。すなわち、そのファイルの中味が バッファにコピーされ、そのコピーに対して編集作業をしているのです。 そのバッファの内容に対する変更は、あなたがバッファを保存(save)するまで 実際のファイルに反映されません。この保存というのは、バッファの内容を ファイルに対してコピーするということです。
save-buffer
は、バックアップ・ファイルの作成に関して責任を持ちます。
通常、backup-optionはnil
であり、ファイルをvisitしてから
最初に保存するときのみ、save-buffer
はバックアップ・ファイルを作成します。
backup-optionにほかの値を与えた場合、
それはほかの状態でバックアップ・ファイルの作成をするよう要求したことに
なります。
save-buffer
関数は、そのバッファが次に
保存されたときに、ファイルのこのバージョンのバックアップをとるように記録します。
nil
である場合には、ファイルをvisitしているすべてのバッファを、
ユーザに確認をせず保存します。
オプションのexiting引数は、非nil
の場合、ファイルをvisit
していないほかのバッファも保存するように、この関数に要求します。
これらの対象となるバッファは、buffer-offer-save
の値として、
非nil
であるローカル値をもつバッファです(これらの対象バッファに対して、
保存するかどうかの質問にyesと答えた場合、ファイル名を
聞かれます)。save-buffers-kill-emacs
関数は、この引数に対して
非nil
の値を渡します。
nil
のとき、そのバッファがファイルを
visitしていない場合でも、Emacs終了時に保存をするような機能を提供します。
この変数は、自動的にすべてのバッファでローカルな変数です。通常、Mail
モード(送信するメールを編集するのに使われます)ではこの変数をt
に
設定します。
set-visited-file-name
、save-buffer
を呼び出して行ないます。
nil
を
返した場合、そのファイルをすでに書込みがされたものとして扱い、
リストの残りの要素は呼び出さず、またファイル書込みのために
通常使われるコードは実行しません。
write-file-hooks
中の関数が非nil
を返した場合、
その関数はバックアップ・ファイルの作成に(もしそれが適切なものならば)
責任を持ちます。これを実行するために、以下のコードを実行してください。
(or buffer-backed-up (backup-buffer))
あなたはbackup-buffer
が返すファイル・モードの値を保存したいかも
しれません。そして、あなたが書き込むファイルに対し、モード・ビットを
設定するために、それを使いたいかもしれません。これはsave-buffer
が
通常行っていることです。
これは正規フックではないのですが、このリストを取り扱うのに
add-hook
とremove-hook
を使うことができます。See section フック。
write-file-hooks
のように働きます。
しかしこれは特定のバッファにローカルなことをさせるためのフックです。
バッファローカルなことをするのにwrite-file-hooks
を使うのは
よい考えではありません。その代わりにこの変数を使ってください。
この変数はつねにバッファローカルなものですので、 主モードを変えても、バッファローカルな値は変わりません。 この変数は、特別な方法で"ファイル"の中味を読み込み、 それに対応する方法でそのデータを保存するためのフックをセットするような パッケージにとって便利です。
write-file-hooks
のように働きます。
しかしこのフックは、ファイルがどういう属性のものかということに関係するフック
に対応させて、ファイルの中身に関係するものとして使われることを意識された
フックです。
このようなフックは、通常主モードが設定を行ない、バッファローカルな
束縛をします。
新しい主モードに変わるときは、つねにこの変数をリセットします。
nil
の場合、save-buffer
は、そのファイルがもつことに
なっていた名前の代わりに一時的な新しい名前で保存し、そしてエラーがないこと
がわかった後に、予定していた名前にそのファイルの名前替えをする、という処理の
間に発生するI/Oエラーからファイルを保護します。
この手続きは、不適切なファイルで、ディスク空間が不足するような場合に
発生する問題点を回避します。
副作用として、バックアップは必ずコピーで実行されます。See section バックアップの手段は名前の変更?それともコピー?。 また同時に、貴重なファイルを保存することは、その保存する ファイルとそのほかの別名の間のハードリンクをつねに壊すことになります。
いくつかのモードは、この変数に対して特定のバッファでローカルに 非nilを設定します。
t
ならば、save-buffer
は保存されるバッファが
そのときに改行で終わってないときは、常にそのファイルの終わりに改行を確認なしに
加えます。
save-buffer
は、もしこの変数の値が非nil
であるが
t
でない場合、改行を加えるような場合が発生するごとに、
ユーザに確認を求めます。
もしその変数の値がnil
ならば、save-buffer
は改行
を全く加えません。nil
がこの変数に対するデフォルトの値ですが、
主モードの中には、特定のバッファでt
を設定するものもあります。
insert-file-contents
関数を使って、ディスクからファイルをコピーし、
バッファのなかにそのファイルを挿入することができます。ユーザレベル・コマンド
insert-file
は、内部で印づけをするため、Lispプログラムの中では
使用してはいけません。
関数insert-file-contents
は、このファイルの内容に対して、
定義されたファイル・フォーマットでチェックを行ないます。
それが適切ならば、ファイルの内容を変換します。
See section ファイル・フォーマットの変換。
またこの関数は、リストafter-insert-file-functions
の関数を
呼び出します。section テキスト属性をファイルへセーブするを参照のこと。
もしvisitが非nil
ならば、この関数はさらに、バッファを修正が
ないものとしてマークし、バッファ中のさまざまなフィールドをセットして、
ファイルfilenameをvisitしているように設定します。これらのフィールドと
しては、バッファのvisitされているファイル名、最後に保存されたときの
ファイルの修正時間などの情報があります。この特徴は、find-file-noselect
が使用し、ほとんどの場合においては、ユーザ自身からは使用すべきではありません。
もしbegとendが非nil
ならば、これらは、挿入されるファイル
の部分を決める整数です。この場合、visitはnil
でなけ
ればなりません。たとえば、
(insert-file-contents filename nil 0 500)
はファイルの最初の500文字を挿入します。
もし引数replaceが非nil
ならば、バッファの内容(実際はアクセス
可能な部分のみ)をファイルの内容で置き換えることを意味します。
これは、単純にバッファの内容を削除し、ファイルの全内容を挿入する、という
方法よりよい方法です。というのはこの関数は、
(1)いくつかのマーカの位置を保存する、
(2)undoリストに入るデータの量が少ない、
という利点があるからです。
もしほかのプログラムがそのファイルを読むことができるように、ほかのプロセスに
ファイル名を渡したいならば、関数file-local-copy
を使用してください。
section ファイル名を"魔力のあるもの"にするを参照のこと。
append-to-file
とwrite-region
関数を使用して、
バッファの内容全部ないしは一部を、直接ディスク上のファイルとして
書き込むことができます。
これらの関数を、現在visitしているファイルに書込みを行なうのに
使用してはいけません。使用した場合、visitのメカニズムに混乱を引き起こす
可能性があります。
nil
を返します。
もしfilenameが、書き込み可能でないファイル、ないしは ファイル作成ができないディレクトリの中の存在しないファイルをさしていた場合、 エラーを発生します。
もしstartが文字列ならば、write-region
はバッファからの
テキストでなく、その文字列自身を書き込み、ないしは追加書き込みします。
もしapeendが非nil
ならば、その指定されたテキストは
(もしあるならば)存在するファイルの内容に追加書き込みされます。
もしvisitがt
ならば、Emacsはバッファとファイルとの間に
関連性を確立します。そのときこのバッファは、そのファイルをvisitしている
ことになります。
この関数はまた、filenameの修正時刻に、カレント・バッファの
最後のファイル修正の時刻をセットします。
そしてそのバッファが修正がないものとして記録します。
この特徴はsave-buffer
が使用しますが、
ユーザはほとんどの場合この特徴を使用すべきではありません。
もしvisitが文字列ならば、これはvisitするファイル名を指定します。
これにより、データをあるファイル(filename)に書き込み、
一方でバッファは、別のファイル(visit)をvisitしているとして
記録することができます。
引数visitはエコー領域メッセージに使用され、またファイル・ロックの
ためも使われます。
visitはbuffer-file-name
に記録されます。
この特徴は、file-precious-flag
を実装するのに使用されます。
ユーザは本当に自分が何をしているのかが知りたいのでなければ、
この特徴は使用してはいけません。
関数write-region
は、buffer-file-format
で指定されている
場合に、適切なファイル・フォーマットにそのデータを変換します。
See section ファイル・フォーマットの変換。
またこの関数は、リストwrite-region-annotate-functions
の関数を
呼び出します。section テキスト属性をファイルへセーブするを参照のこと。
通常、write-region
は、メッセージ`Wrote file filename'を
エコー領域に表示します。
もし、visitがt
あるいはnil
あるいは文字列のどれでも
ないならば、このメッセージの表示はされません。
この特徴は、内部の目的のためで、ユーザがそれについて知る必要が
ないようなファイルを使うプログラムを作成する場合に便利です。
二人のユーザが同時に同じファイルを編集する場合、お互いに干渉してしまう 可能性があります。 Emacsは、ファイルが修正されているときに、 ファイル・ロック(file lock)を記録して、 このような状況が発生するのを回避しようとします。 これによりEmacsは、ほかのEmacsジョブによりロックされているファイルが バッファにvisitされて修正されようとするのを、 その最初の時点で検出することができ、ユーザにどのようにするか確認を求めます。
ファイル・ロックは、NFSのように、複数のマシンがファイル・システムを 共有している場合には正しく機能しません。 おそらく将来にはよりよいファイル・ロック・システムが実装されることでしょう。 ファイル・ロックが機能しないときには、二人のユーザにより、同時に一つの ファイルを修正をすることは可能にはなってしまうのですが、 Emacsはこの場合も、2番目に保存をしようとするユーザに注意を促します。 また、そのファイルがディスク上で変更されている場合に、その元ファイルを visitしているバッファが修正されているのを検出する機構は、 同時編集のケースを発見することができる場合があります。 section 変更時間の比較を参照。
nil
を返します。
このEmacsによってロックされている場合は、t
を返し、
ほかのユーザによってロックされている場合には、そのユーザの名前を返します。
(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'に記述されています。
この節で説明する関数はすべて、ファイル名を表す文字列に対して作用します。 これらの関数の名前はみな単語`file'で始まります。 これらの関数はすべて、実在するファイルあるいはディレクトリについての 情報を返します。 よって、これらの関数に対する引数は、ほかに注釈がなければ、 すべて実在するファイルあるいはディレクトリでなければなりません。
これらの関数は特定の方法でファイル・アクセスのパーミッションを検査します。
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'は、親ディレクトリが存在しないために、 ユーザはそのディレクトリを作ることはできるかもしれませんが、 書き込み可能ではありません。
(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/'の中にあるファイルをどのように読み込もうとしても エラーになります。
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
を使って、二つの数のリストという形式でファイル
の最終修正時刻を得ることができます。
See section ファイルに関するそのほかの情報。
この節は、さまざまな種類のファイルをどのように区別するかについて説明します。 そのファイルとは、ディレクトリ、シンボリック・リンク、通常ファイルです。
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
を返します。
ファイルの実名(truename)は、シンボリック・リンクを なくなるまでたどり、`.', `..'の要素を展開した結果得られる名前です。厳密には、ファイルはただ一つ の実名をもつとはかぎりません。つまり、あるファイルがもつ別個の実名の数は、 そのファイルに対するハード・リンクの数と同じです。しかし実名は、名前の つけ方の多様性を生む原因となるシンボリック・リンクを取り除くので、 便利なものです。
file-truename
は、ファイルfilenameの実名を返します。
これはシンボリック・リンクを、それがなくなるまでたどることにより
得られる名前です。引数は絶対ファイル名でなければなりません。
関連する情報は See section バッファ・ファイル名。
この節では、ファイルの内容以外の詳細な情報を得るための関数について 説明します。この情報とは、アクセス・パーミッションを制御するモード・ビット、 所有者およびグループ番号、名前の数、inode数、サイズ、アクセス時間、 修正時間、などです。
返値として可能な最大値は4095(8進で7777)で、これはすべてのユーザが読込み、 書込み、実行パーミッションがあり、かつ、SUIDビットが他人とグループの 両方にセットされ、かつ、stickyビットがセットされていることを意味します。
(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 section ファイルの名前と属性の変更)
current-time
の値に似た書式です。section 1日の時刻を参照)
t
を返します。それ以外はnil
を返します。
例として、ここに`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
この節で説明する関数は、ファイルに対し、名前の変更、コピー、削除、 リンク、モードの設定を行ないます。
newnameを引数としてもつ関数は、この名前をもつファイルが すでに存在する場合に、引数ok-if-already-existsの値に 依存して、とられる動作が決まります。
nil
の場合は、
file-already-exists
エラーを発生します。
以下でまず最初に、二つのファイル`foo'と`foo3'のリストを例として 挙げます。
% ls -l fo* -rw-rw-rw- 1 rms 29 Aug 18 20:32 foo -rw-rw-rw- 1 rms 24 Aug 18 20:31 foo3
ここで、形式(add-name-to-file "~/lewis/foo" "~/lewis/foo2)
を評価します。再びファイルのリストを示します。これにより`foo'と
`foo2'という二つの名前が表示されます。
(add-name-to-file "~/lewis/foo" "~/lewis/foo2") => nil % ls -l fo* -rw-rw-rw- 2 rms 29 Aug 18 20:32 foo -rw-rw-rw- 2 rms 29 Aug 18 20:32 foo2 -rw-rw-rw- 1 rms 24 Aug 18 20:31 foo3
最後に、次の式を評価します。
(add-name-to-file "~/lewis/foo" "~/lewis/foo3" t)
そしてファイルのリストを再度挙げます。ここでは一つのファイルに対し、 三つの名前があります。すなわち、`foo', `foo2', `foo3'です。 古い`foo3'の内容は失われます。
(add-name-to-file "~/lewis/foo" "~/lewis/foo3") => nil % ls -l fo* -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo2 -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo3
この関数はVMSでは無意味です。VMSでは、一つのファイルが複数の名前を もつことは許されません。
section ファイルに関するそのほかの情報のfile-nlinks
も参照のこと。
filenameがfilename以外の別名をもつ場合、このファイルは、
それらの名前を引き続き持ちます。事実、add-name-to-file
を使って名前
newnameを加え、filenameを消去するというのは、一時的に中間的な
状態をもつことを除けば、名前替えと同じことをしていることになります。
この関数が対話的に呼ばれた場合には、ミニバッファにfilenameと newnameの入力を促します。また、newnameがすでに存在した 場合には確認を求めます。
timeが非nil
の場合、この関数は、新しいファイルに対し、古い
ファイルが持っていたものと同じ最終修正時間を与えます
(これはいくつかのオペレーティングシステムでのみ機能します)。
この関数が対話的に呼び出された場合、ミニバッファに、filenameと newnameの入力を促します。また、newnameがすでに存在する 場合には、確認を求めます。
ファイルが存在しない、ないしは削除可能でない場合には、適切な種類の
file-error
エラーを発生させます(UNIXの場合、ディレクトリが
書き込み可能であれば、ファイルは削除可能です)。
section ディレクトリの作成と削除のdelete-directory
も参照のこと。
この関数は、対話的に呼び出された場合、ミニバッファでfilenameと newnameの入力を促します。またnewnameがすでに存在する場合には、 確認を求めます。
引数modeは整数でなければなりません。modeの下位9ビットのみが 使用されます。
実在するファイルを修正して保存する場合は、ファイルを作成したこととは 解釈されません。この場合はファイルのモードは変化せず、デフォルトの ファイル・プロテクションは使われません。
MS-DOSでは、"実行可能"を表わすようなファイル・モード・ビットはありません。
よってEmacsは、ファイル名が`.com'、`.bat'、`.exe'
で終わる場合に、実行可能であると解釈します。
これは、file-mode
およびfile-attributes
が返す値に反映されます。
ファイルは、一般的には、Emacs内部ではどこでもその名前によって参照されます。 Emacsではファイル名は、文字列で表現されます。ファイルに対して機能する ような関数はすべて、ファイル名を引数に取ることを期待します。
ファイル自身に作用するのに加え、Emacs Lispプログラムは、その名前自体に 作用する必要があるときがあります。つまり、もとのファイル名に関係するような ファイル名を作成するために、名前を分割し、その名前の部分を使うためにです。 本節では、ファイル名をどのように操作するかについて説明します。
この節で説明する関数は、実際のファイルにはアクセスしないので、 実在しないファイルないしはディレクトリを示すようなファイル名 に対しても機能させることができます。
VMSでは、すべてのこれらの関数は、VMSファイル名構文とUNIX構文の両方を 理解します。これは、すべての標準Lispライブラリが、UNIX構文でファイル名を 指定しており、そのコードの変更なしに、VMSで適正に動作させるためです。 MS-DOSでは、これらの関数はUNIX構文と同様に、MS-DOSファイル名構文を理解します。
オペレーティングシステムは、ディレクトリに含まれるファイルをグループ化 します。あるファイルを指定するには、ディレクトリとそのディレクトリ内での ファイル名を指定する必要があります。よってEmacsは、ファイル名を二つの主要な 部分をもつものとして解釈します。それはディレクトリ名(directory name) 部分と、非ディレクトリ(nondirectory)部分 (すなわち そのディレクトリ内部でのファイル名(file name within the directory)) です。どちらかの部分が空であるかもしれません。 これら二つの部分をつなげると、オリジナルのファイル名が再度作り出せます。
Unixでは、ディレクトリ部分とは、ファイル名の最初から最後のスラッシュ までの部分です。非ディレクトリ部分はその残りの部分です。 VMSの構文でのこの規則は複雑です。
いくつかの目的のために、非ディレクトリ部分は、さらに厳密な意味での 名前とバージョン番号(version number)に分割されます。 Unixでは、バックアップ・ファイル のみが名前の中にバージョン番号を持ちます。VMSでは、すべてのファイルが バージョン番号を持ちますが、ファイル名が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"
ディレクトリ名(directory name)は、ディレクトリの名前です。 ディレクトリはファイルの 一種であり、ファイル名を持ちディレクトリ名と関係がありますが、同一のも のではありません(これは、通常のUnixでの用語法では、全く別のものです)。 同じ実体のものに対するこの二つの異なった名前は、構文的な変換によって 関連づけることができます。Unixでは、この変換は単純なものです。 ディレクトリ名はスラッシュで終わます。 一方のディレクトリのファイル名はそのスラッシュがありません。 VMSでは、この関係はより複雑です。
ディレクトリ名と、ディレクトリのファイル名の相違点は、微細な点ですが、 重要です。Emacs変数ないしは関数の引数が、ディレクトリ名として表わされて いる場合には、ディレクトリのファイル名は許されません。
以下の二つの関数は、ディレクトリ名とファイル名の間で変換をします。 これらの関数は、`$HOME'のような環境変数の置き換え、 `~'、`..'の展開、などの特別なことはしません。
(file-name-as-directory "~rms/lewis") => "~rms/lewis/"
(directory-file-name "~lewis/") => "~lewis"
ディレクトリ名の省略形は、通常シンボリック・リンクを介してアクセスされるような ディレクトリに対して有用です。 ユーザはまず最初に、リンク名をディレクトリの"名前"として認識し、 それからディレクトリの"本当の"名前をみつけるのにやっかいなのを 発見するのです。 リンク名を本物の名前に対する省略形として定義すれば、Emacsは代わりに、 この省略形をユーザにみせます。
directory-abbrev-alist
は、ファイル・ディレクトリを表わすために使う
省略形の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
の要素からの省略形を適用し、
ユーザのホーム・ディレクトリを`~'に置換します。
ファイル・システムの中にあるすべてのディレクトリは、ルート・ディレクトリ からはじまる木構造を形成しています。あるファイル名というものは、この木の ルートからはじまるディレクトリ名のすべてを指定できます。この場合、これは 絶対(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
ファイル名の展開(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 "/a1/gnu//usr/local/lib/emacs/etc/MACHINES") => "/usr/local/lib/emacs/etc/MACHINES" (expand-file-name "/a1/gnu/~/foo") => "/xcssun/users/rms/foo"
この両方の場合で`/a1/gnu/'は、絶対ファイル名がそれに続くことに より捨てられます。
expand-file-name
は、環境変数は展開しないことに
注意してください。これをするのはsubstitute-in-file-name
だけです。
(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/@linebreak{'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"
VMSでは、`$'についての置換はされません。よってVMSでは、この関数は、 上に示したような不必要な最初の要素の除去以外の操作は、なにもしません。
プログラムでは、一時的なファイルを作成する必要がある場合があります。 ここでは、そのようなファイルの名前をつくるために通常使われる手法を 説明します。
(make-temp-name (concat "/tmp/" name-of-application))
ここではディレクトリは`/tmp/'を使用します。というのは、これはUnixでは、
一時ファイルを作成するのには標準の場所だからです。
make-temp-name
の仕事は、二人の異なるユーザ、ないしは二つの異なる
ジョブが、同じファイル名を使うのを回避することです。
(make-temp-name "/tmp/foo") => "/tmp/foo021304"
同一のEmacs上で動作する別のライブラリの間で、ファイル名が衝突するのを
避けるために、make-temp-name
を使うEmacs lispプログラムは、すべて自身
のstringをもつべきです。名前の最後に加えられる数字は、別のEmacsの
ジョブで動作する同一のアプリケーションを区別します。
この節ではファイル名を補完するための低レベルのサブルーチンについて 説明します。ほかの補完関数は、section 補完を参照のこと。
引数partial-filenameは、ディレクトリ部分もスラッシュも含まないような ファイル名でなければいけません。もしdirectoryが絶対表記でなければ、 カレント・バッファのデフォルト・ディレクトリがそれに先立ちます。
以下の例では、現在のデフォルト・ディレクトリ`~rms/lewis'に、 `f'で始まる名前のファイルが五つあるものとしています。 `foo'、 `file~'、 `file.c'、 `file.c.~1~'、 `file.c.~2~'です。
(file-name-all-completions "f" "") => ("foo" "file~" "file.c.~2~" "file.c.~1~" "file.c") (file-name-all-completions "fo" "") => ("foo")
一致するものがただ一つで、filenameに完全に一致する場合、
この関数はt
を返します。ディレクトリdirectory中に
filenameで始まるファイルがない場合にはnil
を返します。
以下の例で、現在のデフォルト・ディレクトリに、`f'で始まる五つのファイル があるとします。そのファイルは`foo'、 `file~'、 `file.c'、 `file.c.~1~'、 `file.c.~2~'です。
(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
は、通常このリストにある文字列で終わるような
ファイル名はすべて無視します。
可能な補完候補の最後の部分が、すべてこれらの接尾辞のどれかである場合、
または、すべての補完候補を示すためのバッファが表示される場合は、
無視しません。
典型的な値はこのようなものかもしれません。
completion-ignored-extensions => (".o" ".elc" "~" ".dvi")
ディレクトリは一種のファイルで、さまざまな名前を持ったほかのファイルを 含んでいます。ディレクトリは、ファイル・システムを特徴づけるものの一つです。
Emacsは、ディレクトリ中のファイルの名前を、Lispのリストとしてリスト
アップすることができます。あるいは、ls
シェル・コマンドを使用して、
バッファにその名前を表示することができます。
後者の場合では、ls
コマンドに渡すオプションに応じて、
それぞれのファイルについての情報を選択的に表示することができます。
full-nameが非nil
の場合、この関数はファイルの絶対ファイル名
を返します。そうでない場合、指定のディレクトリに対する相対名を返します。
match-regexpが非nil
の場合、この関数は、その正規表現に
一致する部分を含むようなファイル名のみを返します。それ以外のファイル名はリスト
から外します。
nosortが非nil
の場合、directory-files
は
リストをソートしませんので、特定の順序をつけずにファイル名を返します。
可能なかぎりの最大の処理速度が必要で、ファイルの処理順序が関係ない場合に、
これを使用してください。
ファイル処理の順序がユーザから分かってしまう場合は、あなたがそのファイル
の名前をソートしてやれば、ユーザにとってはおそらく便利でしょう。
(directory-files "~lewis") => ("#foo#" "#foo.el#" "." ".." "dired-mods.el" "files.texi" "files.texi.~1~")
directoryが、読み出すことのできるディレクトリの名前でない場合には、 エラーを発生します。
ls
でフォーマットした
ものです。この関数により、ポイントは挿入されたテキストの後に移動します。
引数fileは、ディレクトリ名か、ワイルドカードを含むような
ファイル仕様であるかもしれません。wildcardが非nil
の場合、
これは、fileをワイルドカードを含むファイル仕様として取り扱う
ことを意味します。
full-directory-pが非nil
の場合、これはfileがディレクトリで、
スイッチが`-d'を含まないということを意味します。そしてこの場合の
リストは、ディレクトリ中のすべての内容を表示すべきです
(ls
の`-d'オプションは、ディレクトリの内容ではなく、
ディレクトリ自身の情報を表示することを意味します)。
この関数は、ディレクトリのリストを作るために、
変数insert-directory-program
で示される名前のプログラムを起動します。
またwildcardが非nil
の場合、ワイルドカードを展開するために、
shell-file-name
で指定されるシェルもまた同様に起動します。
insert-directory
が、あるディレクトリ中の
ファイルのリストをつくるために起動するプログラムです。
Emacs Lispでのたいていのファイル操作関数は、それがディレクトリであるような
ファイルに対して使われた場合は、エラーとなります。
たとえば、delete-file
を使って、ディレクトリを削除することはできません。
ここで説明する特別な関数は、このディレクトリを作成したり削除するために
あります。
delete-file
は、ディレクトリであるようなファイルには機能しません。
この場合には、delete-directory
を使わなければいけません。
そのディレクトリがなんらかのファイルを含んでいる場合には、
delete-directory
はエラーを発生します。
あるファイル名に対し、特別な扱いをさせることができます。 これは、これらのファイル名を魔力のあるもの(magic)にする、と言います。 これには、名前のクラスを定義する正規表現 (このクラスのメンバはその正規表現に一致するようなものすべてです)と、 この一致するファイル名に対して機能するハンドラ、 すなわちすべてのプリミティブな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-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-readable-p
, file-regular-p
, file-symlink-p
,
file-truename
, file-writable-p
,
get-file-buffer
,
insert-directory
,
insert-file-contents
, load
, make-directory
,
make-symbolic-link
, rename-file
, set-file-modes
,
set-visited-file-modtime
, unhandled-file-name-directory
,
verify-visited-file-modtime
, write-region
.
insert-file-contents
に対するハンドラでは、
その関数のvisit引数が非nil
の場合では、
典型的な処理として、
(set-buffer-modified-p nil)
で、
そのバッファの修正のフラグをクリアしてやる必要があります。
またこれは、バッファがロックされている場合には、それをアンロックするという
効果があります。
ハンドラ関数は上の操作のすべてと、おそらく将来加わるほかの操作 とをハンドルしなければいけません。 これらのすべての操作を実装する必要はありません。 ハンドラ関数は、ある操作に対して特別にすべきことがないときは、 プリミティブを再起動してやれば、その操作を"通常のやり方"でハンドル することができます。 ハンドラ関数が関係しないような操作のプリミティブは、つねに再起動すべきです。 以下にこれを行う方法の例を示します。
(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
を使って、これをどうやるかを示しています。
これらの変数は上で示したように注意して正確に使ってください。
複数のハンドラをもつ場合に適切な振る舞いをさせる場合と、
二つのファイル名をもち、そのそれぞれがハンドラをもつような操作の場合に、
この例のような詳細な部分が重要になります。
nil
を返します。引数operationは、ファイルに対して機能
する操作でなければいけません。operationは、その操作が呼ばれたときに、
その最初の引数としてハンドラに渡される値です。この操作を表わす引数は、
inhibit-file-name-operation
との比較を行なうために必要です。
filenameが、Emacsの外のプログラムからは直接は読み書きできない ような"魔法"ファイル名を指している場合、この関数は、通常のファイルに 内容をコピーし、そのファイル名を返します。
filenameが通常のファイル名で魔法ファイル名でない場合、この関数は
なにもせずnil
を返します。
これは、サブプロセスを起動する場合に便利です。すべてのサブプロセスは カレント・ディレクトリとして魔力を持たないディレクトリを持たなければなりません。 この関数を使うのは、この要求にあったよい方法です。
変数format-alist
は、ファイル・フォーマット(file formats)
のリストを定義します。
これは、Emacsバッファ中のデータ(テキストやテキスト属性、場合によると
ほかの情報も)がファイルとなるときに、テキスト的にどのような表現になるかを
記述したものです。
Emacsは、ファイルを読んだり書いたりするときに、適切ならばフォーマット
変換をします。
(name doc-string regexp from-fn to-fn modify mode-fn)
フォーマット定義の各要素の意味は次のようになります。
(position . string)
であるようなリストです。
ここで、positionは、書き込まれるテキストとしての中での相対的な位置を
指定する整数です。また、stringは、その位置に書き加えられる注釈
です。このリストは、to-fnがそれを返すときには、位置の順序で
ソートされていなければなりません。
write-region
が実際にテキストをバッファからファイルに書き込む時、
この関数は、指定された注釈を対応する位置に入れ込みます。
これらをすべて、そのバッファを修正せずに行ないます。
t
を、
注釈のリストを返す場合はnil
をいれてください。
関数insert-file-contents
は、その指定したファイルを読み込んだときに、
自動的にファイル・フォーマットを識別します。
この関数は、そのファイルの始めの部分のテキストをフォーマット定義の
正規表現と比較します。このときに一致部分があった場合には、そのフォーマットの
復号化関数を呼び出します。そして再びすべてのフォーマットをチェックします。
この関数は、ファイル・フォーマットが適用できなくなるまでこれを繰り返します。
find-file-noselect
あるいはこれを呼び出すコマンド
を使ってファイルをvisitするときは、同じように変換を実行します
(というのはこの関数はinsert-file-contents
を呼び出すからです)。
またこの関数は、それが復号化したフォーマットに対応するモード関数を
呼び出します。この関数は、バッファローカルな変数buffer-file-format
に、フォーマット名のリストを記録します。
write-region
を使ってデータをファイルに書き込むとき、
この関数はまず最初に、buffer-file-format
のフォーマット
に対する符号化関数を、そのリスト中の順で呼び出します。
引数formatはフォーマット名のリストです。formatがnil
の場合には、変換はされません。このコマンドが対話的に呼ばれた場合には、
formatに対しては単にRETを入力すれば、
値nil
が割り当てられます。
nil
の場合には、これはそのファイルの
読み込まれる部分を指定することになります。これはinsert-file-contents
と同様です(see section ファイルからの読込み)。
返値はinsert-file-contents
と同様です。すなわち、その絶対ファイル名
と(変換後の)挿入されたデータ長のリストを返します。
引数formatはフォーマット名のリストです。formatがnil
の場合には、変換はされません。このコマンドが対話的に呼ばれた場合には、
formatに対しては単にRETを入力すれば、
値nil
が割り当てられます。
buffer-file-format
と同様、フォーマット名のリストですが、
自動セーブ・ファイルの書き込み時には、buffer-file-format
の
代わりに使われるリストです。
この変数は、すべてのバッファでつねにローカルです。
MS-DOS上のEmacsは、テキストとバイナリ・ファイルを区別して扱います。MS-DOS上
での通常のテキストは、行間で二つの文字シーケンス、
キャリッジ・リターンとラインフィード
(CRLF)を使用するため、この区別は必要です。Emacsは、行間に一つの改行文字
(一つのラインフィード)があることだけを期待しています。Emacsが、MS-DOS上で
テキスト・ファイルを読む、ないしは書くとき、行のセパレータを変換する
必要があります。
これはEmacsが、どのファイルがテキストで、どのファイルがバイナリかを知る必要
があるということを意味しています。
Emacsは、このバイナリ・ファイルかテキスト・ファイルかという決定を
ファイルをvisitしたときに行ない、その決定結果をそのファイルを保存するときに
使うために、変数buffer-file-type
に記録します。
サブプロセスについて関係する特徴については、See section MS-DOSでのサブプロセス。
nil
であり、バイナリの場合はt
です。
nil
を返し、
バイナリ・ファイルの場合はt
を返します。
nil
の場合はテキストを、
t
の場合はバイナリを意味します。
あるいはtypeは、そのどちらかであるかを判断するための関数が格納されます。
typeが関数の場合は、一つの引数(ファイル名)を
取って呼び出されて、t
かnil
を返すべきです。
nil
、
バイナリの場合にはt
であるべきです。
find-file
と同様の機能を持ちますが、そのファイルを名前と無関係に、
テキスト・ファイルとして取り扱います。
find-file
と同様の機能を持ちますが、そのファイルを名前と無関係に、
バイナリ・ファイルとして取り扱います。
Go to the first, previous, next, last section, table of contents.