0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

vim終了時にアンドゥファイル削除スクリプト

Last updated at Posted at 2021-05-09

vimにて、プログラム修正などをやり直したいときが頻繁に発生する。
それは当然のことだろうし、他の人も例外はないだろう。

そして、やり直しをしやすいように、私はmbbill/undotreeと言うプラグインを使っている。
それはさておき、現在のバッファを裏に回し、他のファイルを修正後に、バッファを戻した場合、やり直しが出来ずに困っていた。
そのため、アンドゥファイルを生成することに決めた。

ということで、またもや壁にぶち当たる。
以下、その壁の壊し方。

アンドゥファイル生存期間

アンドゥファイルが生成された状態のままでは、生成された状態までやり直しをすることができる。
しかし、私はファイルを開き直した場合、やり直しはそこから始まる状態になって欲しい。
そして、バッファを切り替えた場合もやり直しは有効化を保持したままになって欲しい。

vim本体を終了したときに限り、アンドゥファイルを削除してくれればいいと思っていた。
プラグインでそこまで細かい制御が出来るように見えず、仕方ないため、自作することにした。

vim終了時にアンドゥファイル削除

何のことはなく、ほんの数行で完成する。
(故に、当然のように完成までに数時間費やしたのは内緒だ)
そして、未完成でもある。

vimrc
augroup quitcmd
	autocmd!
	autocmd VimLeave * call s:CleanupStuff()
augroup END
function! s:CleanupStuff()
	let l:undoFileName=expand('%:p')
	if ( has('win32') || has('win64') )
		let l:undo_fileName = substitute(l:undoFileName, '\\', "%", "g")
		let l:undo_fileName = substitute(l:undo_fileName, ':', "%", "g")
	else
		let l:undo_fileName = substitute(l:undoFileName, '\/', "%", "g")
	end
	let l:deleteUndoFile=&undodir . "/" . l:undo_fileName
	call delete(l:deleteUndoFile)
endfunction

終了時の動作として、VimLeaveから関数を呼び出す。
その関数内で、"アンドゥファイル生成場所+ファイル名"の組み合わせでフルPathファイル名を作り出してからファイル削除の手順を踏んだ。

ある程度詳細な解説

関数内の解説

  • 1段目:let l:undoFileName=expand('%:p')
    開いているファイルのフルPathを含むファイル名を抜き出す。

  • 2段目:let l:undo_fileName = substitute(l:undoFileName, '\/', "%", "g") ←Mac用
    上記のファイル名からスラッシュでのディレクトリ区切りをパーセント記号に置き換える。
    Windowsの場合は、2行で処理をしており、円記号とコロン記号をパーセント記号に置き換えている。
    この2行が無ければ、vimが生成するアンドゥファイル名に合致してくれない。

  • 3段目:let l:deleteUndoFile=&undodir . "/" . l:undo_fileName
    上記の置き換えは、アンドゥファイル名のためだった。そのため、今回新たにアンドゥファイル生成場所のPathを先頭に追加し、改めてフルPathを作り上げた。

  • 4段目:call delete(l:deleteUndoFile)
    実際のファイル削除実施。

感想

作ってみれば何てことは無いが、ないと困っていた。
ないから我慢して使っていたが、やっぱり我慢できない。
こんな時に取り組めるだけの知識を持っているというのは一歩を踏み出しやすい。
ちょっとした思い込みで時間を無駄遣いしてしまったが、知識があるというのは新しい世界への扉を見つけやすいと言うことでもある。
やはり、勉強以上に重要なことはないし、知識のみが人間であることを証明する。
今後もぼそぼそ新しい扉を開いていける人間になりたい。

今後

リンクファイルなどにより、実態ファイルを開いていない場合、削除できないようだ。
アンドゥファイルは、実態ファイル名で生成するようで、対処できないぞ・・・う〜む。
今後はそれを改善していきたい。

  • もう一つ。
    致命的なのは、複数ファイルをタブで開いておき、編集したファイル以外のタブを開いた状態でvim本体を終了した場合、アンドゥファイル削除がなされない。
    これは非常に困る。
    終了検知の方法が間違っている?
    そう思い調べたが、通常のvimエディタでは対応できないようだな。

  • もう一つ。
    xolox/vim-sessionプラグインでセッション管理をしているのだが、これからセッションを再起動させた場合もアンドゥファイル削除をせずに再起動が終わる。
    困る。
    vim終了後に、セッションを開けば良いのかもしれないが、煩わしい。
    上記通り、他のタブを開いた状態でvim本体を終了した場合も目的のアンドゥファイルを削除しないため、vim本体の終了方法にも気を遣う必要が出てくる。
    困った。

  • もう一つ。
    バッファを閉じた(:bd)場合もアンドゥファイル削除はしてくれない。
    さらに、上記通り目的のバッファをアクティブにせずにvim本体を終了した場合も目的のアンドゥファイルを削除しないため、致命的なスクリプトを作ったことになる。
    何とかして対処したい・・・。
    非常に困った。

今後のさらなる追加機能。
バッファを裏に回してもスワップファイルを維持したままにする。
これで、私の環境は完璧に近づくだろう。

私の最後の感想:新しい扉を開けることは出来なかった。

以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?