この記事は Vim 8.0 Advent Calendarの 11 日目の記事です。
今回は、ユーザーの作業が記録されている viminfo ファイルについてです。
viminfo ファイルの概要
viminfo ファイルは、ユーザーが行った様々な操作を記録しておくファイルです。例えば、レジスタの内容、コマンドラインの履歴、検索文字列の履歴や、ジャンプリストなど、様々な情報が記録されます。これらをファイルに記録することで、次回 Vim を使った際にも、前回の履歴を引き継いで使うことができます。
viminfo ファイルは、基本的には起動時に読み込まれ、終了時にファイルに書き出されます。
viminfo ファイルのマージ
1 つの viminfo ファイルを複数の Vim のセッションで使った場合、viminfo ファイルはマージされます。
どのようにマージが起きるか、例を挙げます。
同時に 2 つの Vim を立ち上げて、それぞれ A B とします。起動時には viminfo は空で、どちらも最初は履歴がありません。
この時、
- A で Ex コマンド
:echo 1
を実行 - B で Ex コマンド
:echo 2
を実行 - A で Ex コマンド
:echo 3
を実行 - B で Ex コマンド
:echo 4
を実行 - B を終了
- A を終了
とします。
5 の時点で、B の履歴が viminfo ファイルに書き込まれ、viminfo ファイルには新しいものが上に来るように以下のような順番で記録されます(実際のファイルの形式とは異なります)。
:echo 2
:echo 4
次に 6 で A が終了する際、viminfo ファイルに更新があることを Vim が検出すると、一旦新しくなった viminfo を読み込みます。続いて A の Vim のセッションで記録された履歴を追記し、viminfo ファイルに書き出します。以下のようになります。
:echo 2
:echo 4
:echo 1
:echo 3
このように、コマンドラインヒストリがマージされます。
発生する問題
上記の例で、1 つ問題が発生します。ユーザーは複数の Vim を行き来し、:echo 1
から :echo 4
まで順番に実行したのにも関わらず、履歴の順番はぐちゃぐちゃになってしまっています。
これは特に Vim を長時間起動していた場合、つい先ほど実行したコマンドが履歴の奥深くに潜ってしまうことを意味します。例だと、ユーザーが最後に実行したのは :echo 4
ですが、これは履歴の一番下から 3 番目に来てしまっています。
最近実行したものは、履歴の中でも最近に出てきてくれた方が嬉しいでしょう。
タイムスタンプを使った新しい viminfo ファイル
そこで Vim 8.0 では、コマンドなどの履歴を保存する際に、それらが実行された時間のタイムスタンプも一緒に保存するようになりました。
これによって履歴は読み込まれる時にタイムスタンプ順でソートされ、ユーザーが実行した順番で履歴を参照することができます。
以下のものがタイムスタンプで管理されるようになりました。
- コマンドラインの履歴
- 検索文字列の履歴
- 入力行の履歴
- 空ではないレジスタの値
- ジャンプリスト
- ファイルのマーク