Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

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

$
0
0

やりたいこと

以下の関数を、

: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

参考


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>