Undoを管理する

  • 29
    Like
  • 0
    Comment
More than 1 year has passed since last update.

本記事は Vim Advent Calendar 2012 の169日目です。
168日目は@cohamaさんによる、tig なんて目じゃない! Git のログ系 Vim プラグイン gitv & gitv をGit 統合インターフェース化する最強の設定でした。

Vimにはundo(redo)機能があります。エディタとしては当たり前ですね。
回数は無制限です。ここまで聞くと高機能だと感じる方もいるかもしれません。
が、Vimは更にundo履歴をツリー状に管理することができます。標準で。
undo履歴のツリー管理機能を標準で持つエディタを他に聞いたことありませんし、
実際なかなか無いでしょう。

こうして標準搭載されていながらも、なぜかあまり噂を聞かない(私だけ?)この機能について
今回調べてみましたので、触れていこうかと思います。

undo-branches(undo-tree)

アンドゥツリーなどと言ったりするこの機能ですが、Vimではundo-branchesとも言うようです。
というより、調べて見た感じだと実装時はundo-branchesと呼ばれ、最近ではundo-treeとも呼ぶようになった印象を受けました。
:h undo-branches
:h undo-tree
:h usr_32

概要

よく使うであろうコマンドは以下です。

  • g- / g+

ツリーを利用したundo/redoを行います。但し、ツリーを利用した、と言っても
実際は時間にそって編集履歴をたどっていっているのみです。
以下のような編集履歴があったとします。


change 1 - change 2
         \ change 3 - change 4@

仮にすべて1分間隔で編集が行われていったとすると、以下のように時間が記録されます。


change 1 - change 2
(1 min.)   (2 min.)
         \ change 3 - change 4@
           (3 min.)   (4 min.)

これをg-を用いてchange 4から遡って行くと、
change4, 3, 2, 1となっていくわけです。

  • :undol[ist]

ツリーの葉に当たる部分をリスト表示します。
上記の例で行けばchange2, 4についてのリストが表示されます。
このリスト番号を用いて直接undoしたいときは、
:earlier {count} / :later {count} を用います。

活用法を考える

こんな便利にもかかわらず、どこかとっつきにくい印象を受けるのでどうしたら使いやすくなるか考えてみました。
まず、この機能をフル活用するという前提のもとに、以下の設定を行なっておきます。


" Undo履歴をファイルに保存する
set undodir=$HOME/.vim/undodir
set undofile

これでVimを終了してもファイルのundo履歴は残ります。
では具体的にどのように活用するか。例えばこのような方法があります。

プラグインを導入する

Gundo - Visualize your Vim Undo Tree
http://sjl.bitbucket.org/gundo.vim/

GundoはUndo-branchesを可視化し、利用しやすくすることができます。
プラグインの持つウインドウには可視化されたツリーと差分が表示されます。
GundoImg

表示されているツリーはカーソルを移動して<CR>することでその編集履歴まで戻ることができます。カーソルを動かしてbranchesをたどっている時も差分を見ることができるので、直感的なundoができます。

欠点を上げるならば、結構画面を食われてしまうことでしょうか。また、変更がリアルタイムにツリーに反映されないので、使用する際はマニュアルにあるように、起動コマンド:GundoToggle<CR>をmapして使うことになるでしょう。

mapする

思い切って普段のundo/redoコマンドにundo-branchesを利用するコマンドをマップしてしまいます。


nnoremap u g-
nnoremap <C-r> g+

枝がない箇所では通常通りundoとして機能するので、使い勝手もあまり変わりません。劇的な使い勝手の向上とはいかないですが、意識せず使えるのが良い点です。上書きするのが忍びない場合は覚えやすい他のマップでもいいでしょう。個人的にはよく連打でundoするので、U(行単位Undo)を上書きするのも有りだと思います。
普段使わないコマンドだとこんな簡単なものでも結構覚えてないことがあるので、いざ枝を辿ろうとした時にあたふたしなくていいのもいいかもしれません。

まとめ

色々と書いてみましたが、実際なぜあまり聞かないのかというと、

意外と使わない

ということではないかと思っています。
実際に、こうしてみてみると便利そうだけど、いざというときは存在を忘れてuを連打している私がいます。また常にツリー構造が見えているわけでもないので、分岐が把握しにくい、とっつきにくい、というところもあり、活用するためにはそういったところが課題として感じました。いつか取り組んでみたいです。

以上VAC 169日目の記事でした、次回のAdvent Calendar 170日目は@tyruさんです。

参考

http://kaworu.jpn.org/kaworu/2008-04-30-1.php
http://blog.bonar.jp/entry/20080613/1213312249
http://umezo.hatenablog.jp/entry/20090429/1240989787
http://vim-users.jp/2010/07/hack162/