Vimで最近使ったファイルを開く(:oldfiles)
「昨日編集していたあのファイル、どこに置いたか忘れた」というときも、ファイラーでディレクトリを探し回る必要はありません。Vimは開いたファイルの履歴を自動的に記録しており、標準コマンドだけで一覧から呼び出せます。
目次(8項目)
| キー | これだけ覚える |
|---|---|
:oldfiles | 履歴を番号付きで一覧表示 |
:bro ol | 一覧から番号を選んでそのまま開く |
:filter /pattern/ oldfiles | ファイル名で絞り込んで表示 |
履歴を一覧表示する
:oldfilesを実行すると、これまでに開いたファイルの一覧が番号付きで表示されます。目的のファイルの番号を確認したら、番号を指定して開きます。
:oldfiles
| 開き方 | コマンド |
|---|---|
| 通常の編集 | :e #<10 |
| 水平分割 | :split #<19 |
| 新規タブ | :tabe #<24 |
ただし、この方法だと一覧を見てから番号を別途入力する2段階の操作が必要になり、覚えるのが少し面倒です。
プロンプト付きで選んで開く
もっと手早く使いたいなら、こちらのコマンドがおすすめです。
:browse oldfiles
:bro ol
実行すると履歴の一覧が表示され、続けて「どの番号を開くか」を尋ねるプロンプトが出ます。そこに番号を入力するだけで対象のファイルが開きます。一覧確認と番号入力が1つの流れで完結するので、こちらの覚え方のほうが実用的です。
:bro olの方が手数が少なくなります。現在のバッファに未保存の変更があり、それを破棄してでも強制的に開きたい場合は!を付けます。
:bro ol!
履歴が記録される仕組み
この履歴は、Vimではviminfo、Neovimではshadaというファイルに保存されており、エディタを終了しても消えません。保存件数を決めるオプションの名前もこれに揃っていて、ここは名前が新旧の関係ではなく、エディタごとに別物です。手元で確かめた対応はこうなります。
| オプション | Vim 9.1 | Neovim 0.12 |
|---|---|---|
'viminfo' | これを使う | 使える('shada'の別名) |
'shada' | 存在しない(E113) | これを使う |
件数は先頭の'フラグで調整します。両方で動く書き方をしたいならviminfoを使うのが手堅い選択です。
set viminfo='1000,<50,s10,h " Vim / Neovim どちらでも動く
set shada='1000,<50,s10,h " Neovim専用
デフォルトのままでも数十件は保持されますが、大きめのプロジェクトを行き来する人は少し増やしておくと過去のファイルを見失いにくくなります。なお、この履歴に保存されるのはファイル名やレジスタといった「使い続けるほど積み重なる情報」で、ウインドウの配置はセッション機能の担当です。役割が違うので、両方を併用するのが実用的です。開いているバッファの一覧を見たいだけなら:lsのほうが早く済みます。
:filterで絞り込む
履歴が増えてくると一覧から目的のファイルを探すのも一苦労になります。Vim 8以降の:filterコマンドと組み合わせれば、正規表現でファイル名を絞り込めます。
:filter /config/ oldfiles
パスに「config」を含む履歴だけに絞り込んで表示できるので、履歴が多いプロジェクトでも目的のファイルを見つけやすくなります。除外したい場合は!を付けます。
:filter! /node_modules/ oldfiles
node_modules配下など、履歴を汚しがちなディレクトリを除外して表示したいときに使えます。:filterはoldfiles以外にも:buffersや:marksなど、一覧を返す多くのコマンドと組み合わせられるので、覚えておくと応用が利きます。
複数プロジェクトを行き来していると:oldfilesの履歴がすぐに肥大化して探しづらくなりますが、:filterでプロジェクト名やディレクトリ名を絞り込むようにしたら実用的に使えるようになりました。ファイラーを開く手間より速いので、直近数日のファイルを開き直すときはほぼこれで済ませています。
履歴に残らないファイルがある
:oldfiles に出るのは、Vimを終了したときに記録されたファイルです。そのため、いま開いているファイルはまだ一覧に入っていません。強制終了した場合も記録されないので、直前に触っていたファイルが見つからないことがあります。
記録の対象から外れるファイルもあります。一時ファイルやGitのコミットメッセージのように、決まったパターンに一致するものは既定で除外されています。設定で変えられます。
:set viminfo? " Vim
:set shada? " Neovim
set shada='1000,<50,s10,h " 1000ファイルぶん覚える
先頭の '1000 が、いくつのファイルについて情報を覚えるかの指定です。既定の100では足りないと感じたら、ここを増やしてください。
前回のカーソル位置に戻る
履歴と一緒に、そのファイルで最後にいた行も記録されています。開いた瞬間にそこへ飛ばすには、自動コマンドを1つ書きます。
autocmd BufReadPost *
\ if line("'\"") > 1 && line("'\"") <= line("$") |
\ execute "normal! g`\"" |
\ endif
'" は「最後にこのファイルを離れた位置」を指すマークです。Neovim 0.10以降は標準でこの動きが入っているので、書く必要はありません。Vimでは自分で書くことになります。
曖昧検索のプラグインと使い分ける
曖昧検索のプラグインを入れていれば、履歴からの検索もそちらでできます。候補を打ちながら絞り込めるので、:oldfiles の番号を目で探すより速く済みます。
それでも標準の機能を覚えておく価値があるのは、プラグインを入れられない環境があるからです。サーバー上の素のVimでも :browse oldfiles は使えるので、この2つを両方持っておくと、どんな環境でも詰まりません。バッファの切り替えはバッファ一覧の記事にまとめています。
まとめ
最近使ったファイルを開くなら:bro olが最短です。履歴が多い場合は:filterと組み合わせて絞り込めば、ファイラーを開かなくても目的のファイルにたどり着けます。