Vimのundo/redoの基本と、ファイルを閉じても履歴を保つ設定
ファイルを一度閉じて開き直したら、さっきまでのundo履歴が消えていて元に戻せませんでした。基本のundo/redoは誰でもすぐ使えますが、履歴を永続化する設定は意外と知られていません。
| キー | これだけ覚える |
|---|---|
| u | 1つundo |
| Ctrl-r | 1つredo |
| U | 直近1行をまとめて元に戻す |
| g- / g+ | 時系列で1つ前 / 後の変更状態へ |
基本のundo/redo
u " 1つundo
3u " 3つ分まとめてundo
Ctrl-r " redo
3Ctrl-r " 3つ分まとめてredo
数字を前置きすれば、その回数分をまとめてundo/redoできます。ノーマルモードでもビジュアルモードでも同じキーで動きます。
let name = "vim";
let count = 42;
let name = "vim"; let count = 1;
1をciwで42に書き換えたあとuを押すと、直前の書き換えだけが取り消されて元の値に戻ります。Ctrl-rを押せばもう一度42に戻せます。
もう1つ、行単位の特殊なundoとしてUがあります。これは直近に変更された1行の内容を、変更前の状態にまとめて戻すコマンドで、複数回の1手ずつのundoとは挙動が異なります。ノーマルモードとビジュアルモードでこのUの意味が変わる点は別記事で扱っています。
ファイルを閉じると履歴が消える
デフォルトでは、undo履歴はそのセッション(Vimを起動してから閉じるまで)の間しか保持されません。一度ファイルを閉じて開き直すと、履歴はリセットされてしまいます。
永続的なundo履歴を有効にする
set undofile
set undodir=~/.vim/undodir
undofileを有効にすると、undo履歴がディスク上のファイルとして保存され、Vimを再起動してファイルを開き直しても続きからundoできるようになります。undodirで保存先のディレクトリを指定できますが、ディレクトリ自体は事前に作成しておく必要がある点に注意してください。存在しないディレクトリを指定すると保存に失敗します。
変更履歴を確認しながら戻る
何回undoすればよいか分からないときは、g-で1つ前の変更状態へ、g+で1つ後の変更状態へ移動できます。u/Ctrl-rとの違いは、分岐したundoツリーがある場合の扱いです。一度undoしてから新しい変更を加えると、undo木は枝分かれします。
| コマンド | たどる対象 |
|---|---|
| g- / g+ | 実際に操作した時系列の順序 |
| u / Ctrl-r | 現在の枝(ブランチ)の中だけ |
複雑な編集をしたあとに「さっきの状態」を正確に取り戻したいときはg-を試すと便利です。
保持する履歴の量を調整する
set undolevels=1000
undolevelsでundoできる回数の上限を設定できます。デフォルトは1000で、通常の作業であれば困ることはまずありません。履歴を確認したい場合は:undolistを実行すると、現在保持されている変更の一覧を確認できます。
set undofileとundodirの設定を忘れずに行ってください。ディレクトリの事前作成だけは忘れやすいので注意してください。
数日前に消した内容を復元したくなり、ファイルを開き直したら履歴が残っていないことに気づいたのがundofileを導入したきっかけでした。設定してからは「あの時のあの変更、消さなければよかった」という後悔をしなくて済むようになりました。ディレクトリを作り忘れて最初は保存されておらず、少し戸惑いました。
まとめ
基本操作はu/Ctrl-rだけで十分ですが、undofileを設定しておくとファイルを閉じた後でも過去の変更を取り消せるようになります。地味ですが一度設定しておく価値の高い項目です。