Vimでファイルパスを補完・挿入する方法(Ctrl-x Ctrl-f)
設定ファイルやスクリプトを書いていると、他のファイルやディレクトリのパスを手で打ち込む場面がよくあります。うろ覚えのパスをタイプミスなく挿入したいときは、プラグインなしの標準補完で十分対応できます。
目次(9項目)
| キー | これだけ覚える |
|---|---|
| Ctrl-x Ctrl-f | 入力中のパスからファイル/ディレクトリ候補を補完 |
| Ctrl-n / Ctrl-p | 補完候補を次/前へ移動 |
Ctrl-x Ctrl-f:ファイルパス補完
インサートモードでパスの一部を入力した状態で、次のキーを押します。
target: project/|
target: project/config.yml
候補が複数あるときは一覧から選び、1つしかなければそのまま補完されます。上位のディレクトリから絞り込んでいく探し方ができるので、パスをうろ覚えのまま探しながら入力するのに向いています。カレントディレクトリからの相対パスでも同様に補完できます。
:r!:OSコマンドの出力を挿入する
パスの補完だけでなく、OSコマンドの実行結果をそのままカーソル位置に挿入することもできます。
:r! {OSコマンド}
例えば、カレントディレクトリの絶対パスを挿入したい場合はこう書きます。
:r!pwd
OSコマンド側の自由度が高いため、条件を組み合わせたファイル検索の結果を直接挿入することもできます。例えば、特定のファイル名・階層の深さを指定して検索する場合はこうなります。
:r!find ~ -name "init.lua" -type f -maxdepth 2 -print 2>/dev/null
標準エラー出力を2>/dev/nullで捨てておかないと、権限エラーなどのメッセージまでバッファに挿入されてしまうので忘れずに付けておく必要があります。
補完候補の絞り込み方
Ctrl-x Ctrl-fで候補が多く出すぎて選びにくいときは、パスの続きを1〜2文字追加で入力すると候補が自動的に絞り込まれます。逆に候補を広げ直したい場合はBackspaceで入力を削ってから、もう一度Ctrl-x Ctrl-fを叩けば再表示されます。候補の移動はCtrl-n/Ctrl-pと同じ操作感で行えます。
使い分け
| やりたいこと | 使うもの |
|---|---|
| ファイル/ディレクトリのパスを1つ挿入したい | Ctrl-x Ctrl-f |
| 検索条件を組み合わせたい、パス以外の出力を挿入したい | :r! |
| ファイルの中身そのものを挿入したい | :r {ファイルパス}(!なし) |
ファイルの中身の挿入について詳しくはファイルの内容を挿入する記事を参照してください。
シェルスクリプトの中で他のスクリプトの絶対パスを書く機会が多く、Ctrl-x Ctrl-fで補完しながら書くようになってからタイプミスがほぼなくなりました。findコマンドと組み合わせたパス挿入は、深い階層に埋もれたファイルを参照するときに特に重宝しています。
補完の基準はカレントディレクトリ
Ctrl-x Ctrl-f が探すのは、編集中のファイルの隣ではなくVimのカレントディレクトリからの相対パスです。ここを取り違えると、すぐ隣にあるファイルが候補に出てこない、という状態になります。
手元のVim 9.1.1752で確かめました。カレントディレクトリを ctest/ に置いたまま ctest/sub/deep/target.txt を編集し、tar と打って補完しても候補は出ません。いっぽう、カレントディレクトリにある note.txt は no だけで補完できました。
:pwd " いまの基準を確認する
:cd %:h " 編集中のファイルの場所へ移す
set autochdir " 開くたびに自動で移す
autochdir は補完を素直にする一方で、:find や grep の基準まで一緒に動きます。プロジェクトの根に留まりたい人には向かないので、必要なときだけ :cd %:h を打つ運用でも構いません。
候補に出るファイル名の範囲
何をファイル名の一部と見なすかは isfname というオプションが決めています。既定では英数字と一部の記号が含まれ、スペースは含まれません。スペース入りのパスが途中で切れるのはこのためです。
パスの区切りを含めて補完したいときは、./ や ../ から打ち始めるのが確実です。区切り文字が入っていればVimはそこまでをディレクトリと解釈するので、候補が階層ごとに絞られます。
書いたパスをその場で開く
補完で書いたパスが正しいかを確かめたいときは、そのパスの上で gf を押します。ファイルが存在すればそのまま開き、無ければエラーが出るので、打ち間違いをその場で見つけられます。
gf が探す範囲は path オプションが決めていて、Ctrl-x Ctrl-f とは基準が違います。補完はできたのに gf で開けない、という食い違いはここから来ます。詳しい使い方はgfでファイルを開くにまとめています。
まとめ
ファイルパスの挿入はCtrl-x Ctrl-fで補完しながら、コマンド出力を挿入したいときは:r!を使います。どちらもプラグイン不要で標準機能だけで完結します。