ぱちコマな日々

ざれごと、たわごと、うわごと、しごと。

Neovimで変更履歴をツリー表示(undotree.vim) @Windows10

※この記事は、dein.vimによりプラグイン管理を行うことを前提で説明します。
まだdein.vimを入れてない人はいつぞやの記事などを参考に入れて下さいまし。

確認環境

Spec / Version
PC mouse LB-J770X-SH2
OS Windows10 Home (ver 1607 build 14393.693)
neovim v0.2.0-621-ge901868f
neovim-qt v0.2.4

変更履歴をツリー表示 undotree.vim

vimは変更履歴をundotreeとして保存しています。もちろんNeovimでも。
それを見やすい形でウィンドウに表示してくれるのが、undotree.vimというプラグインです。
そのウィンドウから任意の変更ポイントを選択してUndo/Redoが出来るようになります。
変更して、undoして、そこからまた変更すると、変更履歴が枝分かれします。
そういう枝分かれしたパラレルワールドを行き来したい場合は便利です。
一本道の履歴であれば、undotreeは表示せずに普通にuとC-rでUndo/Redoすれば良いかと。

もし今後、任意の変更ポイントにコメントが残せる機能が追加されれば、簡易的なバージョン管理システムとしても使えちゃいそうな勢いです。
とまぁそんな妄想は置いといて、どんなプラグインかご紹介します。

使用イメージ

undotree起動時の画面はこちらです。

f:id:pachicoma:20170305182254p:plain

左側のウィンドウがundotreeです。
上の方はヘルプを表示中でして、通常は表示されません。
下の方の枝っぽいのが実際のundotreeの表示になります。
赤字でsと表示されているのはファイルのセーブポイントです。大文字のSは最新のセーブポイントです。
 
下側のウィンドウに一つ前の変更履歴とのdiffが表示されます。設定で非表示にも出来ます。
 
ウィンドウのレイアウト(undotreeを表示位置とdiffウィンドウの幅)は4パターン用意されています。
 
右側のウィンドウで紫にハイライトされている箇所は、直前のUndo/Redoによって変更された箇所です。
undotreeを表示している間はハイライトされます。ハイライトの無効設定も可能です。

dein(*.tomlファイル)の設定

参考までに私の設定サンプルです。

[[plugins]]
repo = 'mbbill/undotree'
hook_add = '''
if has("persistent_undo")
   " ファイルを閉じてもUndo記録を残す
    set undodir=$XDG_CACHE_HOME/undodir/
    set undofile
endif
let g:undotree_WindowLayout = 2         " undotreeは左側/diffは下にウィンドウ幅で表示
let g:undotree_ShortIndicators = 1      " 時間単位は短く表示
let g:undotree_SplitWidth = 30          " undotreeのウィンドウ幅
let g:undotree_SetFocusWhenToggle = 1   " undotreeを開いたらフォーカスする
"let g:undotree_DiffAutoOpen = 0         " diffウィンドウは起動時無効
let g:undotree_DiffpanelHeight = 8      " diffウィンドウの行数
"let g:undotree_HighlightChangedText = 0 " 変更箇所のハイライト無効
" undotreeをトグル表示
noremap <Leader>u :UndotreeToggle<CR>

" undotreeバッファ内でのキーバインド設定
function! g:Undotree_CustomMap()
    map <silent> <buffer> <Esc> q
    map <silent> <buffer> h ?
endfunction
'''

ウィンドウのレイアウトはg:undotree_WindowLayoutに1〜4を指定してお好きなものを選んで下さいな。

備考

操作キーは使用イメージ画像のundotreeウィンドウにヘルプを表示しているので参考にして下さい。
よく使う操作は下あたりかなと。

操作キー 操作内容
u / C-r Undo / Redo
< / > 1つ前のセーブポイントへ移動 / 1つ次のセーブポイントへ移動
j / k 変更ポイントの移動(カーソル移動)
CR(Enter) カーソル位置の履歴まで戻る
C 変更履歴のクリア ※取扱注意
q undotreeを閉じる

<キーと>キーでセーブポイントへワープ出来ちゃいます。
出来ちゃうはずなのですが、私の環境では<キーが効きませんでした。なして。。。

ついでにCキーを押した後、何も画面表示に変化がなく固まったような状態になりました。
ソースを見た感じだとYes/Noでホントにクリアするか聞いているみたいです。
こちらはyキーを続けて押せば無事履歴がクリアできました。

まとめ

今回はNeovimの変更履歴をundotreeウィンドウから自由に辿れるようになりました。

これで数秒~数分前へタイムスリップし、パラレルワールドを行き来することが出来ます。

gitなど使うのも躊躇しちゃうような、ちょっとしたお試し修正などでは活躍するかもですね。

おしまい。

参考