exists({:command}) に関する覚書

:help exists() 読んでて知らなかったので覚書。
さて、特定のコマンドや変数、関数が存在するかどうかを判定する時に使用する exists() 関数ですが、コマンドの有無を判定する場合、戻り値に複数の意味が存在します。
:help exists() から引用するとこういう風になっています。

:cmdname    exコマンド: 組み込みコマンド、ユーザ定
        義コマンド、コマンド修飾子|:command|。
        戻り値:
        1  コマンド名の先頭に一致
        2  コマンド名に完全一致
        3  複数のユーザ定義コマンドに一致
        コマンドが定義されているかどうかを判定
        するには、必ず戻り値が2であるかを確認
        すること。


実際に使ってみるとこんな感じ。


[ソース]

command! -nargs=+
\   Assert if !(<args>) | echoerr 'assertion failure' | endif


Assert exists("Hoge") == 0

command! Hoge :
command! HogeFoo :
command! HogeBar :

Assert exists(":Hoge") == 2
Assert exists(":HogeFoo") == 2
Assert exists(":HogeBar") == 2

delcommand Hoge
" :HogeFoo と :HogeBar に一致
Assert exists(":Hoge") == 3

delcommand HogeFoo
" HogeBar の先頭 Hoge に一致
Assert exists(":Hoge") == 1

" コマンドの有無を確認する場合は 2 で判定する
if exists(":Hoge") == 2
    :Hoge
endif