EnsekiTT Blog

EnsekiTTが書くブログです。

Vimで作業中にセーブしてうっかり閉じちゃってもUndoできるようにする話

つまりなにしたの?

Vimで作業している時に保存してVimを閉じてしまった。
そのあと、さっきの変更をなかったコトにしたい。というのはよくあるけどデフォルトではそういう設定になっていないことをやらかしてから気づいたのでメモしておく。
f:id:ensekitt:20180620161552j:plain

用意するもの

undoデータを保存するディレクト

undoデータを保存するディレクトリは、.vimに作ったり作業環境に作ったりすることができる。
リモート環境だと作業ディレクトリに.vimundoみたいなディレクトリを作っていて、
ローカル環境だとホームディレクトリの.vimにundoみたいなディレクトリを作っている。

今回はどこでも使えるホームディレクトリを例に紹介する。

mkdir .vim/undo

.vimrcへの設定

今更だけどこの機能(undo-persistence)はVim 7.3から使えるようになったらしい
.vimrcの末尾か好きなところに以下の設定を追加する

if has('persistent_undo')
  set undodir=~/.vim/undo
  set undofile                                                                                                                                   
endif

ここまで設定してvimに反映させれば、閉じてしまってもundoすることができる。

Undoファイルって何が入っているのか

ファイルに保存しているのだから、undoファイルの中身が気になる。

for i in range(10):
    print("hello world", i)

みたいなファイルを

for i in range(100):
    print("bye world", i)

に変更してUndoファイルに何が書かれているのか確認する。
Undoファイルは今回の場合

/Users/YourHome/.vim/undo/%Users%YourHome%hello.py

みたいな名前で保存されている。

中身を見ると

Vim?UnDo?%%%%%%%%%%%%%%%%%%%%%%%%?^@^@^@^C^@^@^@^Sfor i irange(10):^@^@^@^A^@^@^@^Q^@^@^@^D^@^@^@^D^@^@^@^D^@^@^@^D^@^@^@^D^@^@^@^@^ #もっと長く続く

みたいなワチャワチャしたものが書いてあったけど特に暗号化されているわけではなさそう。

Undoファイルを削除する

~/.vim/undo以下のファイルを削除するればUndoできなくなった。

よそのUndoファイルを持ってくる

対象ファイルとUndoファイルの所有ユーザが異なったりするとUndoファイルは使えない。
設定ファイルなどを普段のユーザで設定して、サービス用のユーザに変更したりすると、Undoできなくなる。

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。