1️⃣
Vim scriptで1回しか使えないコマンド・関数を定義する
この記事はVim駅伝の2023-06-14の記事です。
前回の記事はuhooiさんのNeovimのHEADをビルドする方法です。
次回の記事は輪ごむさんのvim.defer_fn でコマンドを直列実行するです。
Vim scriptにおいて、1回しか使えないコマンドと関数を定義する方法です。
1回しか使えないコマンド
コマンドの末尾でdelcommand
を使って自身を削除します。
command! DelSelfCmd echo 'one-shot command!' | delcommand DelSelfCmd
1回しか使えない関数
コマンドと同じように、delfunction
を使って自身を削除すれば良いのですが、普通に関数内部で実行すると、E131: 関数 DelSelfFun を削除できません: 使用中です
が出てしまいます。
これはtimer_start
を使うことで回避できます。
function! DelSelfFun() abort
echo 'one-shot function!'
call timer_start(1, {->execute('delfunction! DelSelfFun')})
endfunction
スクリプトローカル関数でも動きます。
以下のコードを:source
すると、2回目の実行では関数が存在しないと表示されます。
function! s:del_self_fun() abort
echo 'function del_self_fun'
call timer_start(1, {->execute('delfunction s:del_self_fun')})
endfunction
call s:del_self_fun()
call timer_start(1000, {->execute('call s:del_self_fun()')})
おまけ:1回しか使えないautocmd
autocmdでは++once
が仕様に入っています。これを設定すればOKです。
autocmd BufEnter * ++once echo 'one-shot autocmd!'
Discussion