LoginSignup
15
9

More than 5 years have passed since last update.

引数が 0 or 1 個の関数を呼ぶExコマンドを定義する方法

Posted at

やりたいこと

以下の関数を、

: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 call s:Func_arg_zero_or_one(<f-args>)
:function! s:Func_arg_zero_or_one(...)
:  if a: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 call s: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(...)
:  if a:0 >= 1
:    echo "arg : ".a:1
:  else
:    echo "noarg!"
:  end
:endfunction

参考

15
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
9