やりたいこと
以下の関数を、
:function!s:Func_arg_zero_or_one(text):if text !="": echo "arg : ".a:text
:else: echo "noarg!":end:endfunction
こんな風にExコマンドから実行したい
:CallFuncArgZeroOrOne # echo noarg!:CallFuncArgZeroOrOne test # echo test
先に結論
こんな感じになる
:command!-nargs=? CallFuncArgZeroOrOne calls:Func_arg_zero_or_one(<f-args>):function!s:Func_arg_zero_or_one(...):ifa:0>=1: echo "arg : ".a:1:else: echo "noarg!":end:endfunction
command! で引数を指定
-nargs オプションを使う
属性を指定しなかった場合、ユーザー定義コマンドは引数を取りません
(引数が与えられた場合はエラーになります)。
-nargs属性を指定すると、ユーザー定義コマンドが引数指定できるようになります。次の属性が指定できます:
-nargs=0 引数を取らない (デフォルト)
-nargs=1 1個の引数が必要 (空白で区切られない)
-nargs=* いくつでも引数を取れる (0個以上)
空白で区切られる
-nargs=? 0 もしくは 1 個の引数が取れる
-nargs=+ 引数が必ず必要。数はいくつでもよい
0 or 1個なので、-nargs=? とする
command! 経由で、function に引数を渡す
<f-args> を使う
ユーザー定義コマンドの引数を関数に渡すには、<f-args>("function args")が利用できます。
これはコマンドの引数をスペースやタブ文字で区切り、それぞれの引数を別々にクォート("で囲む)し、カンマで区切ったリストにして<f-args>と置き換えます。
引数がない場合は <f-args> は取り除かれます。
command の内容
こんな感じになる
:command!-nargs=? CallFuncArgZeroOrOne calls:Func_arg_zero_or_one(<f-args>)
が、実は上記コマンドを引数なしで実行するとエラーが発生
E119: Not enough arguments for function: Func_arg_zero_or_one
可変長引数
名前付き引数は、渡されないと例外が発生
そのため、0 or 1 個の引数を渡す場合、可変長引数を利用する
最後の引数を "..."にすることで、可変長の引数を使用できる。
関数の中では "a:1" や "a:2" のようにして可変長の引数にアクセスできる。
"a:0" は可変長引数が幾つあるかを示している (0であること、つまり引数がそれ以上ないこともある)。
"a:000" は全引数を持つリスト|List|を示している。Note "a:1" は "a:000[0]" と同じである。
関数を以下のように修正
:function!s:Func_arg_zero_or_one(...):ifa:0>=1: echo "arg : ".a:1:else: echo "noarg!":end:endfunction