カーソル下のパスをそのまま開く(gf)と分割・タブでの開き方
コード中に書かれたimport文のパスを、コピーしてExコマンドとして貼り付けて開く、という作業を繰り返していました。カーソルを乗せるだけでそのパスを開けるコマンドがあり、これを覚えるとファイル間の移動がずっと楽になります。
目次(10項目)
| キー | これだけ覚える |
|---|---|
| gf | カーソル位置のパスをそのまま開く |
| Ctrl-w f | 水平分割した新規ウィンドウで開く |
| Ctrl-w gf | 新規タブで開く |
基本の使い方
gf
「Go to File」の略で、カーソルの下または後ろにあるファイルパスをカレントウィンドウで開きます。パスがディレクトリであれば、netrwや設定しているファイラーがそこを起点に開きます。
import "./utils/format.js"
console.log(1)
export function format() {}
分割・タブで開くバリエーション
| キー | 動作 |
|---|---|
| Ctrl-w f | 水平分割した新規ウィンドウで開く |
:vertical wincmd f | 垂直分割した新規ウィンドウで開く |
| Ctrl-w gf | 新規タブで開く |
:vertical wincmd fは打鍵数が多いので、頻繁に使うなら好きなキーにマッピングしておくと便利です。
nnoremap <Leader>gf :vertical wincmd f<CR>
関連するオプション
| オプション | 役割 |
|---|---|
path | カレントディレクトリ以外に検索対象とするディレクトリ一覧 |
suffixesadd | 拡張子を省略したパスに自動で補う拡張子 |
isfname | ファイル名とみなす文字の種類 |
suffixesaddを設定しておくと、import fooのように拡張子が省略されたパスでもgfで開けるようになります。言語ごとに拡張子が異なるので、プロジェクトの言語に合わせて設定しておくと快適さが変わります。
set suffixesadd=.js,.ts,.py
ビジュアルモードでも使える
ビジュアル選択した範囲をファイルパスとして開きたい場合もgfが使えます。パスの一部だけをカーソルが指しているために誤ったファイル名として解釈されてしまうときに、範囲を選択してからgfを実行すると、その選択範囲そのものをパスとして扱ってくれます。空白を含むパスなど、通常の判定ではうまく認識されない場合の保険として覚えておくと安心です。
使いどころ
C言語の#include、Pythonのimport、HTMLのhref/src属性など、ファイルパスが登場する場面全般で活用できます。ターミナルモードで検索結果からパスを表示させ、そこにカーソルを合わせてgfで開く、という使い方もできます。ファイルを探すこと自体が目的なら:findコマンドのほうが向いています。
suffixesaddを設定しておくと拡張子省略のパスにも対応でき、実用度が上がります。
TypeScriptのimport文を目で追ってファイルを探す作業が多かったのですが、suffixesaddに.tsを追加してからgfが拡張子なしのパスでも一発で開けるようになり、コードジャンプの手間がかなり減りました。分割で開きたいときのCtrl-w fも、慣れると無意識に指が動くようになります。
探す場所を決めているのは path
gf が相対パスをどこから探すかは path オプションが決めています。手元のVim 9.1.1752の既定値は .,/usr/include,, で、. が編集中のファイルの場所、空の項目がカレントディレクトリを表します。
:set path? " .,/usr/include,,
set path+=** " プロジェクト配下を再帰的に探す
set path+=src,lib " 特定のディレクトリを足す
** を足すと :find でも名前の一部だけでファイルを開けるようになります。ただし巨大なリポジトリでは探索に時間がかかるので、目的のディレクトリを名指しで足すほうが速く済むこともあります。
開けないときの切り分け
gf が失敗したとき、パスの取り出しに失敗しているのか、探し先に無いのかを切り分けます。Vimがカーソル位置から何をパスとして読み取ったかは expand('<cfile>') で確認できます。
:echo expand('<cfile>') " ./sub/deep/target.txt
ここに出た文字列が意図と違うなら、原因は isfname です。何をファイル名の一部と見なすかを決めているオプションで、既定ではスペースが含まれません。想定どおりの文字列が出ているのに開けないなら、原因は path のほうです。
分割で開いて元に戻る
同じウィンドウで開くと元のファイルが見えなくなります。Ctrl-w f なら水平分割、Ctrl-w gf なら新しいタブで開くので、参照しながら作業できます。
同じウィンドウで開いてしまった場合も、Ctrl-o を押せば元のファイルの元の行に戻れます。gf はジャンプとして記録されるためで、定義を見に行って戻る、という往復が2キーで済みます。移動の履歴についてはスクロールとジャンプの記事にまとめています。
まとめ
gfはパスが書かれた場所からファイルへ直接移動できる便利なコマンドです。suffixesaddなどの関連オプションを設定しておくと、より多くの場面で使えるようになります。カーソル下がディレクトリのパスだった場合は、ファイルの代わりにnetrwの一覧が開きます。設定ファイルに書かれたディレクトリを確認したいときはこちらのほうが早く、開いた先ではそのまま目的のファイルを分割やタブで開けます。ディレクトリが開いたあとは通常のnetrwなので、一覧の表示形式を変えて目的のファイルを探すこともできます。