Next: , Previous: , Up: ファイルの処理   [Contents][Index]


19.2 ファイルのvisit(訪問)

C-x C-f

ファイルをvisitします(find-file)。

C-x C-r

変更を許さない閲覧用として、ファイルをvisitします(find-file-read-only)。

C-x C-v

最後にvisitしたファイルとは異なるファイルを、かわりにvisitします(find-alternate-file)。

C-x 4 f

別のウィンドウでファイルをvisitします(find-file-other-window)。選択されたウィンドウに表示されているものは変更しません。

C-x 5 f

新しいフレームでファイルをvisitします(find-file-other-frame)。選択されたフレームに表示されているものは変更しません。

M-x find-file-literally

内容を変換せずにファイルをvisitします。

ファイルをVisiting(訪問)するとは、そのファイル内容をEmacsのバッファーに読み込むことを意味するので、それを編集することができます。Emacsはvisitするファイルごとに、新しいバッファーを作成します。

ファイルをvisitするには、C-x C-f (find-file)とタイプして、visitしたいファイルの名前をミニバッファーで入力します。ミニバッファーでは、C-gをタイプして、コマンドを中止することができます。ミニバッファーでのファイル名の入力についての詳細は、ファイルの名前を参照してください。

ファイルは存在するが、システムが読み込みを許さない場合、エコーエリアにエラーメッセージが表示されます(GNUおよびUnixシステムでは、‘su’や‘sudo’のような方法を使用して、そのようなファイルをvisitできるかもしれない。リモートファイルを参照されたい。) それ以外の場合、スクリーンに新しいテキストが表示され、モードラインバッファー名が表示されることで、C-x C-fが成功したことを知ることができます。通常Emacsは、ファイル名からディレクトリー名を省いて、バッファー名を作ります。たとえば/usr/rms/emacs.texという名前のファイルは、バッファー名‘emacs.tex’となります。その名前のバッファーがすでにある場合、Emacsは一意な名前を作ります。通常の方法はディレクトリー名にもとづく接尾辞の追加です(たとえば‘<rms>’、‘<tmp>’など)が、違う方法を選択することもできます。バッファー名を一意にするを参照してください。

新しいファイルを作成するには、同じコマンドC-x C-fを使ってvisitするだけです。Emacsはエコーエリアに‘(New file)’と表示しますが、他の点では既存の空のファイルをvisitしたのと同じく振る舞います。

ファイルをvisitした後で編集コマンドにより行われた変更は、Emacsのバッファーに反映されます。バッファーを保存(save)するまでは、visitしているファイルに影響はありません。バッファーが保存されていない変更を含むとき、そのバッファーが変更されている(modified)といいます。これはバッファーを保存しなければ、その変更が失われることを意味します。モードラインの左余白の近くに2つのアスタリスクが表示され、バッファーが変更されていることを示します。

すでにEmacsがvisitしているファイルをvisitした場合、C-x C-fは他のコピーを作らず既存のバッファーに切り替えます。切り替えを行う前に、最後にvisitまたは保存した後にファイルが変更されているか確認します。もしファイルが変更されているとき、Emacsはそれの再読み込みを提案します。

large-file-warning-threshold (デフォルトは10000000で、これは約10MB)より大きなファイルのvisitを試みると、Emacsは最初に確認を求めます。yを応えることによりファイルのvisitを続けて、lではファイルをリテラル(以下参照)にvisitします。 巨大なファイルではリテラルにファイルをvisitすることにより、種々の潜在的に高価な機能がオフに切り替えられるので、操作や編集が高速化されます。しかしEmacsは、Emacsバッファーの最大サイズ(Emacsが割り当てられるメモリー量の制限と、Emacsが扱える整数により制限されます)を超えるバッファーは、visitできないことに注意してください。この場合、Emacsは最大バッファーサイズを超えた旨を知らせるエラーメッセージを表示します。

tree-sitterパースライブラリーを使うメジャーモード(メジャーモードを参照)をもつようなファイルのvisitを試みる場合に、そのファイルのサイズ(バイト)が変数treesit-max-buffer-sizeの値より大きければEmacsが警告を表示します。デフォルト値は64ビットのEmacsでは40MB、32ビットのEmacsでは15MBです。これはそのような巨大なバッファーでtree-sitterにもとづくメジャーモードをアクティブにせず、Emacsがメモリー不足に陥る危険を回避するためです。tree-sitterの典型的なパーサーは、解析するテキストのおよそ10倍のメモリーを必要とするからです。

ファイル名にシェル形式のワイルドカード文字が含まれている場合、Emacsはそれにマッチするすべてのファイルをvisitします。(大文字小文字を区別しないファイルシステムでは、Emacsは大文字小文字に関係なくワイルドカードをマッチします)。ワイルドカードには‘?’、‘*’および‘[…]’シーケンスが含まれます。ミニバッファーでワイルドカード‘?’をファイル名に入力するには、C-q ?とタイプする必要があります。ワイルドカード文字を実際に名前に含むファイルをvisitする方法についての情報は、ファイル名のクォートを参照してください。find-file-wildcardsをカスタマイズして、ワイルドカード機能を無効にすることができます。

あるバッファーでvisit済みだが外部から変更されたファイルをvisitしようとすると、Emacsは通常はディスク上のファイルを再読み込みするかどうか尋ねます。ただしquery-about-changed-filenilにセットすると、Emacsは問い合わせを行わずかわりに変更前のバッファー内容を表示して、ファイルからバッファーをリバートする方法をエコーエリアのメッセージで示します。

無意識に間違ったファイル名をタイプして違うファイルをvisitした場合、C-x C-v (find-alternate-file)で実際に望むファイルをvisitできます。C-x C-vC-x C-fと似ていますが、これは現在のバッファーをkillします(変更されている場合は最初に保存するか確認を求めます)。C-x C-vがvisitするファイルの名前を読み取るときは、ミニバッファーにデフォルトのファイル名全体を挿入して、ポイントをディレクトリー名の後に置きます。これは名前を少し間違えた場合などに便利です。

実際はディレクトリーであるファイルをvisitしたとき、EmacsはEmacsのディレクトリーブラウザーのDiredを呼び出します。Dired (ディレクトリーエディター)を参照してください。この振る舞いは、変数find-file-run-dirednilにセットすることにより無効にできます。この場合、ディレクトリーをvisitするとエラーになります。

実際には他のファイルの集まりであるようなアーカイブファイル(file archives)の場合、アーカイブされたメンバーを操作できる、Diredに似た環境を呼び出す特別なモードでvisitします。これらの機能については、ファイルアーカイブを参照してください。

オペレーティングシステムが変更を許していない、または読み取り専用にしているファイルをvisitした場合、Emacsもバッファーを読み取り専用にするので、保存すると問題を起こすような変更を防ぐことができます。C-x C-q (read-only-mode)で、バッファーを書き込み可能にできます。その他のバッファー操作を参照してください。

予期せぬ入力による変更を防ぐために、読み込み専用でファイルをvisitしたい場合は、C-x C-fのかわりにコマンドC-x C-r (find-file-read-only)でvisitします。

C-x 4 f (find-file-other-window)はC-x C-fと同様ですが、指定したファイルを含むバッファーは、別のウィンドウで選択されます。C-x 4 fの前に選択されていたウィンドウは、すでに表示していたのと同じバッファーの表示を続けます。1つのウィンドウしか表示されていないときにこのコマンドを使うと、これはウィンドウを2つに分割し、1つのウィンドウには前に表示されていたのと同じバッファー、別の1つには新しい要求されたファイルを表示します。複数ウィンドウを参照してください。

C-x 5 f (find-file-other-frame)も同様ですが、新しいフレームををオープンするか、指定したファイルをすでに表示している既存のフレームを選択します。フレームとグラフィカルなディスプレイを参照してください。

グラフィカルなディスプレイでは、ファイルをvisitする追加の方法が2つあります。1つ目は、Emacsが適したGUIツールキットによりビルドされているとき、マウスによるコマンドの呼び出し(メニューバーやツールバーのクリックによる)は、ミニバッファーでファイル名の入力を求める代わりに、そのツールキット標準のファイル選択(file selection)ダイアログを表示します。GNU/LinuxおよびUnixプラットフォームでは、GTK+、LessTif、Motifツールキットとともに構築されていると、Emacsはこれを行います。MS-WindowsとMacでは、GUIバージョンのデフォルトにより行われます。これをカスタマイズする情報については、ダイアログボックスの使用を参照してください。

2つ目は、Emacsはのドラッグアンドドロップ(drag and drop)サポートで、通常のEmacsウィンドウにファイルをドロップすることにより、そのウィンドウでファイルをvisitします。例外としてDiredバッファーを表示しているウィンドウにファイルをドロップすると、表示されているディレクトリーにファイルを移動またはコピーします。詳細についてはドラッグアンドドロップその他のDiredの機能を参照してください。

テキスト端末、およびGUIツールキットなしでビルドされているグラフィカルなディスプレイでは、アイテム‘Visit New File’と‘Open File’をもつメニューバーの‘File’メニューからファイルをvisitできます。

文字エンコーディングと使用されている改行規則を検知するために、Emacsは自動的に内容をスキャンします。そして、それらをEmacsの内部エンコーディングとバッファーの改行規則に変換します。バッファーを保存するとき、Emacsは逆の変換を行い、元のエンコーディングと改行規則でファイルをディスクに書き込みます。コーディングシステムを参照してください。

ファイルにたいして特別なエンコーディングや変換を行わずに、非ASCII文字のシーケンスとして編集したいときは、M-x find-file-literallyコマンドを使います。これはC-x C-fと同様ですが、フォーマット変換(Format Conversion in the Emacs Lisp Reference Manualを参照してください)、文字コード変換(コーディングシステムを参照してください)、自動解凍(圧縮ファイルへのアクセスを参照してください)を行わず、require-final-newlineによる最後の改行も追加しません(ファイル保存のカスタマイズを参照してください)。同じファイルをすでに通常(非リテラル)の方法でvisitしている場合、このコマンドはそれをリテラル(そのままの文字の列)としてvisitするかを尋ねます。

ファイルが別のファイルに(緩やかに)結びるけられているときがあります。このようなファイルのことを兄弟ファイル(sibling files)と呼ぶことにしましょう。たとえばCファイルの編集する際に‘"foo.c"’というファイルがある場合には‘"foo.h"’というファイルもある場合が間々あり、そのようなファイルが兄弟ファイルに該当します。あるいは‘"src/emacs/emacs-27/lisp/allout.el"’と‘"src/emacs/emacs-28/lisp/allout.el"’という異なるバージョンのファイルについても兄弟とみなすことができるかもしれません。これらの兄弟ファイル間をジャンプするためのコマンドfind-sibling-fileをEmacsは提供しますが、ユーザーがどのファイルを兄弟とみなしたいかを推奨するのは不可能なので、ユーザーオプションfind-sibling-rulesを変更することによってルールを設定できるようにしています。このルールはマッチと展開形のペアーからなる要素です。

たとえば‘".c"’を‘".h"’にマッピングするには、以下のように記述します:

(setq find-sibling-rules
      '(("\\([^/]+\\)\\.c\\'" "\\1.h")))

(ff-find-related-fileは特にCファイル向けに同等の機能を提供している。Cモードのその他のコマンドを参照のこと)

あるいは‘"src/emacs/DIR/file-name"’配下にある別のdirにあるすべてのファイルを兄弟としたければ、以下のように記述できます:

(setq find-sibling-rules
      '(("src/emacs/[^/]+/\\(.*\\)\\'" "src/emacs/.*/\\1")))

ご覧の通り、これは(MATCH expansion…)という形式の要素からなるリストです。matchはvisitするファイル名にマッチする正規表現、そしてexpansionはそれぞれ‘\\1’、...を使用して参照されるマッチグループです。結果として得られる展開文字列はその後ファイルシステムに適用されて、この展開文字列(regexpとして解釈)とマッチするファイルがあるかどうか確認されます。

2つの特別なフック変数により、ファイルをvisitする操作を変更して拡張することができます。存在しないファイルをvisitすることにより、find-file-not-found-functionsの関数が実行されます。この変数は関数のリストを保有し、それらはどれか1つが非nilを返すまで、(引数を指定せずに)1つずつ呼び出されます。これはノーマルフックではないため、その事実を示すために名前の最後が‘-hook’ではなく、‘-functions’で終わっています。

ファイルが存在するしないにかかわらず、ファイルをvisitするのに成功すると、引数なしで関数find-file-hookを呼び出します。この変数はノーマルフックです。ファイルが存在しない場合、最初にfind-file-not-found-functionsを実行します。フックを参照してください。

ファイルを編集するために自動的にメジャーモードを指定し(ファイルのモードを選択するを参照してください)、そのファイルのために特別なローカル変数を定義する方法がいくつかあります(ファイル内のローカル変数を参照してください)。