回答:
はい、関数でオプションの引数を取ることができます。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
パーティーに少し遅れましたが、私のお気に入りのものが見当たりませんでした
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それが存在しない場合はを。
let a:arg=vim ではもうできません。let l:arg=またはのようなものを使用する必要がありますlet arg=。github.com/vim/vim/commit/…を
                    このパターンにより、各引数に意味のある名前を割り当て、提供されなかった引数にデフォルト値を提供できます。
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:1、a:2、...私たちはオプションの引数にアクセスしてみましょう必須の引数(
foo上記の例のみ)はカウントされません
condition ? result_if_true : result_if_false は条件(3項)式で、最初の項が真かどうかに応じて2番目または3番目の項に評価されます。
したがって、3番目の引数が指定されていない場合baz、デフォルト値のが使用されます0。
上記の例に関する懸念の1つは、プレフィックスをa:foo使用してのみアクセスでき、a:プレフィックスbarをbaz使用せずにアクセスできることです。これはあまり一貫性がないため、次のようにすべての引数をローカル変数に引き出すことをお勧めします。
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内の最初のパラメーター...
                    私は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(追加の引数リストの長さ)に応じて、対応する引数またはデフォルト値に設定されます。
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"