ノーマルモードでZQを押すと、vimのヘルプにあるように「:q!」と同じ動作をするのだが、間違って保存すべきものを保存しない事故が絶えない。そのため、/tmp/とか、/usr/tmp/とかにZQ用のバックアップを保存する対策を考えた。
はじめはvimrcに以下のワンライナーを追加することを考えたが、
このままではvimを何のファイルも指定せず立ち上げて、そのまま終了したときに
エラーが起こり、終了できない。
.vimrc
nnoremap ZQ :setnobackup<C-m>:w!/usr/tmp/%:t~<C-m>:q!<C-m>
そこで、スクリプトを追加する改良を施し、条件分岐するようにした。
以下が最終的なvimrcへの記述になる。
.vimrc
function! ZQchecker()if expand('%:t')==""q!elsesetnobackupw!/usr/tmp/%:t~q!endifendfunctionnnoremap ZQ :silentcall ZQchecker()<CR>
(スクリプトの内容について)
set nobackupとしているのは、保存する際にset backupがあると、
すでに/usr/tmp/に同名のファイル名がある場合、
さらに名前に「~」が末尾についたファイルをbackupの機能で作ってしまうため。
この例では、末尾に「~~」が付いた名前のファイルができてしまう。
%はレジスタを参照しており開いてあるファイルを示すが、
そのままではパスを付けてしまうので:tを付けて回避している。
silentで関数を呼ぶようにしているのはこれがないと/usr/tmp/に保存した旨が
プロンプトに出てしまうためそれを表示させないため。