1️⃣

Vim scriptで1回しか使えないコマンド・関数を定義する

2023/06/14に公開

この記事は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