vim-users.jp

Hack #162: Vimを終了しても undo 履歴を復元する

Posted at 2010/07/19
このエントリーをはてなブックマークに追加

Hack #8: 作業の履歴を辿るでも紹介したように Vim には編集履歴を辿る機能が充実していますが、Vim を終了したりファイルを開きなおしたりするとこの undo 履歴は消えてしまいます。

undo-persistence

現在開発中の Vim 7.3 から、新しく undo-persistence (:help undo-persistence) と言う機能が追加されました。これを使うと undo の情報をファイルに保存し、Vim を終了しても次に起動したときに undo の履歴を復元してくれるようになります。

設定

'undodir'

まず、undo 履歴を保存するファイルが作成されるディレクトリを 'undodir' オプションに設定します。これにはディレクトリをカンマ区切りのリストで指定します。 ディレクトリの指定に "." を使うと、対象ファイルのあるディレクトリを指します。デフォルトはこれです。

指定したディレクトリの中で、最初に存在したディレクトリに undo 履歴のファイルが保存されます。また、復元する際は最初に見付かったファイルから履歴を復元します。

例えば、ファイルと同じディレクトリに .vimundo と言うディレクトリがあったらそのディレクトリへ、なければ ~/.vimundo へ保存するには、以下のように設定します。

set undodir=./.vimundo,~/.vimundo

'undofile'

これはバッファローカルなオプションで、これが on のバッファはバッファの保存時に undo 履歴をファイルに保存します。また、読み込み時に undo 履歴を復元します。

全てのファイルで有効にしたい場合は単に :set undofile とすれば良いでしょう。特定のファイル、例えばホームディレクトリ以下のファイルのみで設定したい場合は以下のようにします。

augroup vimrc-undofile
  autocmd!
  autocmd BufReadPre ~/* setlocal undofile
augroup END

+persistent_undo

これらの機能は +persistent_undo がないと利用できないので、if で囲っておくと良いでしょう。

if has('persistent_undo')
  set undodir=./.vimundo,~/.vimundo
  augroup vimrc-undofile
    autocmd!
    autocmd BufReadPre ~/* setlocal undofile
  augroup END
endif

注意点

undo 履歴ファイルは 'undodir' で指定したディレクトリが "." 以外だった場合は対象のディレクトリに、フルパスのパスの区切りを "%" で置き換えたファイル名で保存されます。つまり、ファイルを移動すると履歴ファイルの名前を手動で変更しない限り undo 履歴は失われます。

また、この機能は現在開発中の Vim に含まれているものです。利用する場合は自己責任で利用してください。

thinca

もどる
blog comments powered by Disqus