オプションの引数を使用してvimscript関数を作成する方法は?


34

オプションの引数を持つ関数を作りたいです。

Pythonでは、私はこのようなことをします:

def functionName(arg1,arg2=false,arg3=false):
    if arg2:
        #Do stuff with arguments
    else:
        #Do stuff without arguments

やってみfunction FunctionName(arg1,arg2=false,arg3=false)ましたが、引数が無効であるというエラーが出ます。

vimscriptでこれを行うにはどうすればよいですか?

回答:


35

はい、関数でオプションの引数を取ることができます。pythonの方法ほど便利ではありませんが、これがあなたのやり方です:

function FooBar(...) " This is like *args in python
    echom a:0 " a:0 contains an integer which is the number of arguments passed to the function
    echom a:1 " a:1 contains the first argument passed, a:2 contains the second and so on
    echo a:000 " a:000 contains a list of all arguments that were passed to the function
endfunction

この方法では、最大20個の引数しか使用できないことに注意してください。

関連するヘルプトピック:

:help :function
:help function-argument

27

パーティーに少し遅れましたが、私のお気に入りのものが見当たりませんでした

function! FunctionName(arg1,...)
    let arg2 = get(a:, 1, 0)
    let arg3 = get(a:, 2, 0)

    if arg2
        "Do stuff with arguments"
    else
        "Do stuff without arguments"
    endif
endfunction

ここでget(a:, n, default)取得しますnth返すオプションの引数defaultそれが存在しない場合はを。


いいね!
joeytwiddle

3
私はこれが非常に古いことを知っていますが、これを読んでいる人には参考にしてください。let a:arg=vim ではもうできません。let l:arg=またはのようなものを使用する必要がありますlet arg=github.com/vim/vim/commit/…を
jmzagorski

23

このパターンにより、各引数に意味のある名前を割り当て、提供されなかった引数にデフォルト値を提供できます。

function FunctionName(foo, ...)
  let bar = a:0 >= 1 ? a:1 : 0
  let baz = a:0 >= 2 ? a:2 : 0
  ...
  " Code that makes use of a:foo, bar and baz

Boris Brodskiが指摘したように:

a:0 渡されたオプションの引数の数を数えます

a:1a:2、...私たちはオプションの引数にアクセスしてみましょう

必須の引数(foo上記の例のみ)はカウントされません

condition ? result_if_true : result_if_false は条件(3項)式で、最初の項が真かどうかに応じて2番目または3番目の項に評価されます。

したがって、3番目の引数が指定されていない場合baz、デフォルト値のが使用されます0

上記の例に関する懸念の1つは、プレフィックスをa:foo使用してのみアクセスでき、a:プレフィックスbarbaz使用せずにアクセスできることです。これはあまり一貫性がないため、次のようにすべての引数をローカル変数に引き出すことをお勧めします。

function FunctionName(...)
  let foo = a:1                  " Will throw an error if no arg was provided
  let bar = a:0 >= 2 ? a:2 : 0
  let baz = a:0 >= 3 ? a:3 : 0
  ...
  " Code that makes use of foo, bar and baz

(技術的には、l:接頭辞を使用して関数内のローカル変数を参照できます。たとえばl:baz、これは冗長なので、お勧めしません。)


ただし、可能な限りこのフォームを使用することをお勧めします。

function! s:FunctionName(...)

!使用すると、実行時に関数を再定義できます(たとえば、スクリプトをリロードするなど)。またs:、関数をスクリプトスコープに制限します。関数がスクリプト内の他の場所からのみ参照されている場合、グローバル名前空間の汚染(および衝突のリスク)を回避します。一般に、グローバルに表示する必要がない場合に関数を定義するのに好ましい方法です。;-)


a:0固定の名前付きパラメーターは含まれません。(VIM 8.0でテスト済み)a:1内の最初のパラメーター...
ボリスブロスキー

@BorisBrodskiに感謝します。答えを修正しました。
-joeytwiddle

8

私はvimscriptに精通していませんが、これは私がそれを行う方法です:

function Func(foo, ...)
  if a:0 < 1
    let bar = "Unspecified bar"
  else
    let bar = a:1
  endif
  if a:0 < 2
    let baz = "Unspecified baz"
  else
    let baz = a:2
  endif

  echo a:foo
  echo bar
  echo baz
endfunction

するとcall Func("Hello", "World")、「Hello」、「World」、「Unspecified baz」が出力されることがわかります。

これはvim関数の可変引数機能を使用しており、任意の数の追加引数を関数に渡すことができます。引数は変数に保存され、a:0(追加の引数リストの長さ)に応じて、対応する引数またはデフォルト値に設定されます。


2

Vim 8.1.1310から、Vimは実際のオプションの関数引数もサポートします。

ただし、ほとんどのvimインストールではまだサポートされていません。また、neovimはその機能も提供していません。

からの例:help optional-function-argument

  function Something(key, value = 10)
     echo a:key .. ": " .. a:value
  endfunction
  call Something('empty')   "empty: 10"
  call Something('key', 20) "key: 20"   

きちんとした。回答を拡大して例を挙げて、追加内容をすばやく把握できるようにしてください。
リュックエルミット

@LucHermitte私はそれに応じて答えを修正しました。
ラドラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.