📝

vimの関数定義でデフォルト引数が使えるようになっていた

2023/01/10に公開

前置き

「vim デフォルト引数」と検索すると可変長引数 a:000 を用いた擬似的なデフォルト引数(オプショナル引数)がヒットします。

私自身もこの方法しか知らず、「vimの関数定義はデフォルト引数がないから不便だなー」と思っていたのですが、どうやら数年前には実装されていたようです。

いつ頃入ったのか

適当に git blame で探したところ2019年5月のコミット、 バージョン的には vim v8.1.1310 で導入されたようですが、ちゃんと確認してないので正確では無いかもしれません。

https://github.com/vim/vim/commit/42ae78c

ざっくり言うと vim v8.2 以上を使っていればデフォルト引数が使えると思っていいでしょう。
neovimに移植された時期は調べていませんが、少なくとも neovim v0.8.2 では使えました。

ドキュメントの場所

該当ドキュメントは runtime/doc/eval.txtruntime/doc/userfunc.txt の関数定義のセクションにあります。

最近のvim(あるいはneovim)では巨大なeval.txtを複数ファイルに分割したらしく、バージョンによってドキュメントのパスが違います。

おそらく以下のタグでヘルプを開けば使用中のバージョンに関わらず該当ドキュメントが開けます。

:h optional-function-argument

具体的な書き方 (本題)

最もシンプルな例を1つだけ書いておきます。
他のパターンや使用などはドキュメントを参照してください。

function Hoge(value = 10)
   echo a:value
endfunction
call Hoge()   " 10
call Hoge(20) " 20

余談

なぜこのような本題が数行しかないブログをわざわざ書いたのかと言うと、

  • 検索しても可変長引数を使った書き方しか出てこなかった(少なくとも私のブラウザの1ページ目には)
  • 組み込みのヘルプだとあいまい検索がやりづらいので該当箇所を探しづらい
    • 今回のケースだと default argument default parameter optional argument optional parameter の4パターン
  • 上記の理由から、私含め「まずはブラウザで検索」という人が多そう
  • 検索すれば簡単に課題を解決できる環境(言語、ライブラリ、その他)の方がユーザーが増えそう(大事)

などの理由があります。
ありますが、正直なんとなく書きました。

Discussion