ファイルにアクセスする (find-file)。
ファイルの閲覧のみを行い、変更は許可しない (find-file-read-only)。
最後にアクセスしたファイルではなく、別のファイルにアクセスする (find-alternate-file)。
別のウィンドウでファイルを開く (find-file-other-window)。選択したウィンドウに表示されている内容は変更しない。
新しいフレーム (find-file-other-frame)
でファイルにアクセスします。選択中のフレームに表示されている内容は変更しません。
内容を変換せずにファイルにアクセスしてください。
ファイルを訪問するとは、その内容をEmacsのバッファに読み込んで編集できるようにすることです。Emacsは、訪問するファイルごとに新しいバッファを作成します。
ファイルにアクセスするには、C-x C-f (find-file)
と入力し、ミニバッファを使用して目的のファイル名を入力してください。ミニバッファ内では、C-g
と入力することでコマンドを中止できます。ミニバッファへのファイル名の入力に関する詳細は、ファイル名を参照してください。
指定したファイルが存在するにもかかわらず、システムが読み取りを許可しない場合は、エコーエリアにエラーメッセージが表示されます(GNUおよびUnixシステムでは、‘su’ または ‘sudo’ の手法を用いてそのようなファイルにアクセスできる場合があります。リモートファイルを参照してください)。それ以外の場合は、画面に新しいテキストが表示されることや、モードラインにバッファ名が表示されることで、C-x C-f が正常に完了したことが分かります(モードラインを参照してください)。通常、Emacsはファイル名からバッファ名を構築し、ディレクトリ名は省略します。例えば、/usr/rms/emacs.tex という名前のファイルは、‘emacs.tex’ という名前のバッファで開かれます。すでにその名前のバッファが存在する場合、Emacsは一意の名前を構築します。一般的な方法は、ディレクトリ名に基づいた接尾辞を付けること(例:‘<rms>’、‘<tmp>’ など)ですが、他の方法を選択することも可能です。バッファ名を一意にするを参照してください。
新しいファイルを作成するには、同じコマンド C-x C-f を使ってそのファイルにアクセスするだけです。Emacs はエコーエリアに ‘(New file)’ と表示しますが、それ以外の点では、既存の空ファイルにアクセスした場合と同様に動作します。
ファイルを開いた後、編集コマンドによる変更はEmacsバッファに反映されます。バッファを保存するまで(ファイルの保存を参照)、開いているファイルには反映されません。バッファに保存されていない変更が含まれている状態を、バッファが変更済みであると言います。これは、バッファを保存しない場合、一部の変更が失われることを意味します。モードラインの左端付近に2つの星が表示されることで、バッファが変更済みであることが示されます。
すでにEmacsで開いているファイルにアクセスする場合、C-x C-fは別のコピーを作成せず、既存のバッファに切り替えます。その前に、前回アクセスまたは保存してからファイルに変更があったかどうかを確認します。ファイルに変更があった場合、Emacsは再読み込みを提案します。
large-file-warning-threshold(デフォルトは10000000で、約10メガバイト)を超えるサイズのファイルを訪問しようとすると、Emacsはまず確認を求めます。ファイルの訪問を進めるにはyを、ファイルをリテラルに訪問するにはlを入力してください(後述)。大容量ファイルをリテラルに訪問すると、コストがかかる可能性のある各種機能が無効になるため、そうしたファイルのナビゲーションや編集が高速化されます。ただし、Emacsは最大バッファサイズを超えるファイルを訪問することはできません。この最大バッファサイズは、Emacsが割り当て可能なメモリ量と、Emacsが表現できる整数によって制限されています(複数のバッファの使用を参照)。訪問を試みると、Emacsは最大バッファサイズを超えた旨のエラーメッセージを表示します。
メジャーモード(メジャーモードを参照)がTree-sitter解析ライブラリを使用しているファイルを開こうとする際、そのファイルのサイズ(バイト単位)が変数
treesit-max-buffer-size
の値を超えていると、Emacsは警告を表示します。デフォルト値は、64ビット版Emacsでは40メガバイト、32ビット版Emacsでは15メガバイトです。これは、一般的なTree-sitterパーサーが解析対象のテキストの約10倍のメモリを必要とするため、このような大容量バッファにおいてTree-sitterベースのメジャーモードの有効化を防ぎ、Emacsのメモリ不足を回避するものです。
指定したファイル名にシェル形式のワイルドカード文字が含まれている場合、Emacs
はそれに一致するすべてのファイルを参照します。(大文字小文字を区別しないファイルシステムでは、Emacs
は大文字小文字を無視してワイルドカードに照合します。)ワイルドカードには、‘?’、‘*’、および
‘[…]’
というシーケンスが含まれます。ミニバッファのファイル名にワイルドカード ‘?’ を入力するには、C-q ?
と入力する必要があります。ファイル名に実際にワイルドカード文字が含まれているファイルを参照する方法については、引用符付きファイル名を参照してください。find-file-wildcards をカスタマイズすることで、ワイルドカード機能を無効にできます。
バッファ内で既に参照済みのファイルを再度参照しようとした際に、ファイルが外部から変更されていた場合、通常 Emacs
はディスクからファイルを再読み込みするかどうかを尋ねます。しかし、query-about-changed-file を nil
に設定すると、Emacs
は確認を求めず、代わりに変更前のバッファ内容を表示し、バッファをファイルの状態に戻す方法を知らせるエコーエリアメッセージを表示します。
ファイル名を打ち間違えて意図せず別のファイルを開いてしまった場合は、C-x C-v (find-alternate-file) と入力して、本来開きたかったファイルを開いてください。C-x C-v は C-x C-f
と同様ですが、現在のバッファを破棄します(変更されている場合は、まず保存の確認が行われます)。C-x
C-v
で開くファイル名を読み込むと、デフォルトのファイル名全体がバッファに挿入され、ポイントはディレクトリ部分の直後に配置されます。これは、ファイル名の入力でわずかな間違いをした場合に便利です。
実際にはディレクトリであるファイルにアクセスすると、EmacsはEmacsのディレクトリブラウザであるDiredを起動します。Dired, the Directory Editorを参照してください。変数
find-file-run-dired を nil に設定することでこの動作を無効にでき、その場合、ディレクトリにアクセスしようとするとエラーになります。
実際には他のファイルの集合であるファイル、すなわちファイルアーカイブは、Diredのような環境を呼び出してアーカイブ構成要素への操作を可能にする専用モードで扱われます。これらの機能の詳細については、ファイルアーカイブを参照してください。
オペレーティングシステムが変更を許可しないファイルや、読み取り専用に設定されているファイルを開いた場合、Emacsはバッファも読み取り専用にします。これにより、後で保存する際に問題となるような変更を加えてしまうことを防げます。バッファを書き込み可能にするには、C-x C-q (read-only-mode)
を使用します。バッファに関する各種操作を参照してください。
誤って変更を加えてしまうのを防ぐため、ファイルを読み取り専用で開きたい場合は、C-x C-f ではなく
C-x C-r (find-file-read-only) コマンドを使用して開いてください。
C-x 4 f (find-file-other-window) は C-x C-f
と同様ですが、指定したファイルを含むバッファが別のウィンドウで選択される点が異なります。C-x 4 f
の前に選択されていたウィンドウには、引き続きそれまでと同じバッファが表示されます。ウィンドウが1つしか表示されていない状態でこのコマンドを使用すると、そのウィンドウが2つに分割され(display-buffer の動作
を参照)、一方のウィンドウには従来と同じバッファが、もう一方には新たに要求されたファイルが表示されます。複数のウィンドウ を参照してください。
C-x 5 f (find-file-other-frame)
も同様ですが、新しいフレームを開くか、指定したファイルが表示されている既存のフレームを選択します。フレームとグラフィカル表示を参照してください。
グラフィカルディスプレイでは、ファイルにアクセスするための方法がさらに2つあります。まず、Emacsが適切なGUIツールキットを用いてビルドされている場合、マウス操作(メニューバーやツールバーのクリック)で呼び出されるコマンドは、ミニバッファでファイル名の入力を求める代わりに、ツールキット標準のファイル選択ダイアログを使用します。GNU/LinuxおよびUnixプラットフォームでは、GTK+、LessTif、Motifツールキットを用いてビルドされた場合にこの動作となり、MS-WindowsおよびMacでは、GUI版がデフォルトでこの動作を行います。この機能をカスタマイズする方法については、ダイアログボックスの使用を参照してください。
次に、Emacsはドラッグ&ドロップに対応しています。通常のEmacsウィンドウにファイルをドロップすると、そのウィンドウでそのファイルが開きます。例外として、Diredバッファを表示しているウィンドウにファイルをドロップすると、そのファイルが表示中のディレクトリに移動またはコピーされます。詳細については、ドラッグ&ドロップおよびその他のDired機能を参照してください。
テキストモードのターミナルや、GUIツールキットなしでEmacsをビルドした場合のグラフィカルディスプレイでは、メニューバーの‘File’メニューからファイルにアクセスでき、そこには‘Visit New File’と‘Open File’の項目があります。
ファイルにアクセスするたびに、Emacsは自動的にその内容をスキャンして、使用されている文字エンコーディングと改行規約を検出し、それらをバッファ内でEmacsの内部エンコーディングと改行規約に変換します。バッファを保存すると、Emacsは逆変換を行い、元のエンコーディングと改行規約のままファイルをディスクに書き込みます。コーディングシステムを参照してください。
特別なエンコーディングや変換を行わず、ASCII文字のシーケンスとしてファイルを編集したい場合は、M-x
find-file-literallyコマンドを使用してください。このコマンドはC-x
C-fと同様にファイルにアクセスしますが、フォーマット変換(Emacs Lisp Reference
Manualのフォーマット変換を参照)、文字コード変換(コーディングシステムを参照)、または自動展開(圧縮ファイルへのアクセスを参照)は行わず、またrequire-final-newlineによる末尾の改行も追加しません(ファイル保存のカスタマイズを参照)。すでに通常の(リテラルではない)方法で同一ファイルにアクセスしている場合、このコマンドは、代わりにリテラルとしてアクセスするかどうかを尋ねます。
ファイルは時に(緩やかに)他のファイルと関連付けられており、こうしたファイルを兄弟ファイルと呼ぶことがあります。例えば、Cファイルを編集している際に‘"foo.c"’というファイルがあれば、多くの場合‘"foo.h"’というファイルも存在し、それが兄弟ファイルとなり得ます。あるいは、ファイルの異なるバージョンがある場合、例えば‘"src/emacs/emacs-27/lisp/allout.el"’と‘"src/emacs/emacs-28/lisp/allout.el"’が兄弟ファイルと見なされることもあります。Emacsには兄弟ファイル間を移動するための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はアクセスしたファイル名にマッチする正規表現であり、各expansionは‘\\1’などを用いてマッチグループを参照できます。その後、得られた展開文字列がファイルシステムに適用され、この展開(正規表現として解釈)に一致するファイルがあるかどうかが確認されます。
2つの特殊なフック変数により、拡張機能でファイル訪問時の動作を変更できます。存在しないファイルを訪問すると find-file-not-found-functions
内の関数が実行されます。この変数には関数のリストが格納されており、いずれかの関数が nil
以外を返すまで、関数が一つずつ(引数なしで)呼び出されます。これは通常のフックではなく、その点を示すため、名称は -hook ではなく ‘-functions’ となっています。
既存か否かを問わず、任意のファイルへのアクセスに成功すると、find-file-hook
内の関数が引数なしで呼び出されます。この変数は通常のフックです。存在しないファイルの場合は、まず find-file-not-found-functions が実行されます。フック を参照してください。
ファイル編集用のメジャーモードを自動的に指定する方法(ファイルモードの選択を参照)や、そのファイル用に定義されたローカル変数を指定する方法(ファイル内のローカル変数を参照)がいくつかあります。