vim-jp / vimdoc-ja / eval

eval - Vimドキュメント

メインヘルプファイルに戻る
eval.txt      For Vim バージョン 8.2.  Last change: 2021 Jul 28


                VIMリファレンスマニュアル    by Bram Moolenaar


Vim script                              expression expr E15 eval

Vim script の利用についてはユーザーマニュアルの41章usr_41.txtでも解説され
ている。

注意: Vim script はコンパイル時に無効化できる。もしそうなっているとこのド
キュメントに書かれている事は有効ではない。+evalno-eval-featureを参照。

このファイルは後方互換の Vim script について書かれている。より高速で、型チェッ
クや多くの機能に対応する Vim9 script については vim9.txt を参照のこと。

1.  変数                        variables
    1.1 変数の型
    1.2 関数への参照                    Funcref
    1.3 リスト                          Lists
    1.4 辞書                            Dictionaries
    1.5 Blobs                           Blobs
    1.6 変数について補足                more-variables
2.  式の文法                    expression-syntax
3.  内部変数                    internal-variables
4.  組み込み関数                functions
5.  関数定義                    user-functions
6.  波括弧{}変数                curly-braces-names
7.  コマンド                    expression-commands
8.  例外処理                    exception-handling
9.  例                          eval-examples
10. Vim scriptバージョン        vimscript-version
11. +eval機能が無効             no-eval-feature
12. サンドボックス              eval-sandbox
13. テキストロック              textlock

テストのサポートは testing.txt を参照。
プロファイリングは profiling に記録されている。

==============================================================================
1. 変数                                                 variables

1.1 変数の型
                                                E712 E896 E897 E899
変数には10種類の型がある:

                                                        Number Integer
数値            32ビットまたは64ビットの符号有整数。expr-number
                ビット数は v:numbersize で得られる。
                例:  -123  0x10  0177  0o177 0b1011

浮動小数点数    浮動小数点数。floating-point-format Float
                {+float 機能つきでコンパイルされたときのみ}
                例: 123.456  1.15e-6  -1.1e3

文字列          終端がNUL文字である8ビットの符号無し文字(バイト)。
                expr-string 例: "ab\txx\"--"  'x-z''a,c'

リスト          要素の順序つきの列。詳細は List を参照。
                例: [1, 2, ['a', 'b']]

辞書            順序を持たない連想配列: 各要素はキーと値を持つ。Dictionary
                例:
                    {'blue': "#0000ff", 'red': "#ff0000"}
                    #{blue: "0000ff", red: "ff0000"}

Funcref         関数への参照 Funcref
                例: function("strlen")
                辞書や引数とバインドすることができ、そのときは部分適用(Partial)
                のように働く。
                例: function("Callback", [arg], myDict)

特殊値          v:falsev:truev:none と v:null。  Special

ジョブ          ジョブに使われる。job_start()を参照。 Job Jobs

チャネル        チャネルに使われる。ch_open()を参照。 Channel Channels

Blob            バイナリラージオブジェクト。任意のバイトシーケンスを格納する。
                詳細は Blob を参照。
                例: 0zFF00ED015DAF
                0z は空のBlobである。

数値と文字列は文脈に応じて相互に変換される。

数値から文字列への変換は数字のASCII表現によって行われる。例:
        数値 123        -->     文字列 "123"
        数値 0          -->     文字列 "0"
        数値 -1         -->     文字列 "-1"
                                                        octal
文字列から数値への変換は旧来の Vim script のみで行われ、Vim9 script では行われ
ない。最初に出る数字を用いて数値に変換する。16進表記 "0xf9" や8進表記 "017" も
しくは "0o17"、2進表記の "0b10" も認識される。
NOTEscriptversion-4 を使用する場合、先頭が "0" の8進数は認識されない。
"0o" 記法はパッチ 8.2.0886 が必要になる。
文字列が数字で始まらない場合結果は0となる。
例:
        文字列 "456"    -->     数値 456
        文字列 "6bar"   -->     数値 6
        文字列 "foo"    -->     数値 0
        文字列 "0xf1"   -->     数値 241
        文字列 "0100"   -->     数値 64
        文字列 "0o100"  -->     数値 64
        文字列 "0b101"  -->     数値 5
        文字列 "-8"     -->     数値 -8
        文字列 "+8"     -->     数値 0

文字列を強制的に数値に変換するには0を足す:
        :echo "0100" + 0
        64

先頭の0によって8進数とみなされるのを防いだり、異なる基数を使うにはstr2nr()
使う。

                                                TRUE FALSE Boolean
ブール(真偽値)演算には数値が使われる。0は偽を意味し、非0は真を表す。また、
v:false と v:true を使うこともできる。Vim9 script では false と true
になる。
関数から真が返されたときは数値の 1 であり、偽が返されたときは数値の 0 である。

Note 次のコマンドをみると
        :if "foo"
        :" 実行されない
"foo" は 0 に変換され、それは偽を意味する。もし文字列がゼロでない数値から始ま
る場合は真を意味する:
        :if "8foo"
        :" 実行される
文字列が空ではないか調べるためには empty() を使用して次のようにする。
        :if !empty("foo")

                                                falsy truthy
式は、型を無視した値が「真の一種」か「偽の一種」のどちらであるかだけを利用し
て、判定条件として使用できる。Falsy は:
        値が0
        空の文字列、Blob、リスト、辞書
それ以外の値は truthy。例:
        0       falsy
        1       truthy
        -1      truthy
        0.0     falsy
        0.1     truthy
        ''      falsy
        'x'     truthy
        []      falsy
        [0]     truthy
        {}      falsy
        #{x: 1} truthy
        0z      falsy
        0z00    truthy

                                                        non-zero-arg
関数の引数は、TRUE とは少し異なる場合がある: 引数が存在し、それが非ゼロの
Number、v:true または空でない String に評価される場合、値は TRUE と見なされ
る。
Note: " " と "0" も空文字列ではないので、TRUE と見なされる。List、Dictionary、
または Float は数値または文字列ではないため、FALSE と評価される。

                E745 E728 E703 E729 E730 E731 E908 E910 E913
                E974 E975 E976
リスト List, 辞書 DictionaryFuncref, ジョブ Job, チャネル Channel
および Blob は自動的に変換されない。

                                                        E805 E806 E808
数値と浮動小数点数をまぜると浮動小数点数になる。それ以外には浮動小数点数への自
動的な変換は存在しない。文字列から浮動小数点数へは str2float() を使い、浮動小
数点数から文字列へは printf() を、浮動小数点数から数値へは float2nr() を使う。

                        E891 E892 E893 E894 E907 E911 E914
浮動小数点数が予期されているところでは数値も使用可能だが、それ以外は使用できな
い。

                                                no-type-checking
変数の型を変更しようとしてもエラーは発生しない。


1.2 関数への参照
                                                Funcref E695 E718
関数への参照は、関数function()、関数funcref()またはラムダ式expr-lambda
使うことで得られる。関数への参照は、式の中で関数名が要求される場所で使うと参照
先の関数を呼び出す。例:

        :let Fn = function("MyFunc")
        :echo Fn()
                                                        E704 E705 E707
関数参照の変数名は、大文字、"s:"、"w:"、"t:"、"b:" のいずれかで始めなければな
らない。"g:" も使えるが、あとに続く名前は大文字で始めなければならない。関数参
照と参照先の関数の名前を同じにすることはできない。

関数を定義して、それへの参照を直接辞書に入れるための特別な形式がある。例:
        :function dict.init() dict
        :   let self.val = 0
        :endfunction

この辞書のキーは小文字で始めなければならない。実際の関数名はここでは使われない。
numbered-functionも参照。

:callコマンドでも関数参照を使うことができる:
        :call Fn()
        :call dict.init()

参照先の関数名はstring()で得られる。
        :let func = string(Fn)

call()を使うと、リスト型の変数を引数として関数参照を呼び出すことができる:
        :let r = call(Fn, mylist)

                                                                Partial
関数参照は、辞書および/もしくは引数とバインドすることができる。これは部分適用
(Partial)とも呼ばれる。これは、辞書および/もしくは引数を function() または
funcref() に渡すことで作成される。その関数を呼び出すと、その辞書および/もしく
は引数がその関数に渡される。例:

        let Cb = function('Callback', ['foo'], myDict)
        call Cb('bar')

これは、関数を以下のようにして呼び出す:
        call myDict.Callback('foo', 'bar')

これは関数を何かに渡す場合、例えば ch_open() の引数とする場合などに非常に有
用である。

Note 関数の辞書へのバインドは、その関数が辞書のメンバーであるときにも発生する
ことに注意:

        let myDict.myFunction = MyFunction
        call myDict.myFunction()

ここで、MyFunction() は myDict を "self" として受け取る。これは、"myFunction"
メンバーがアクセスされたときに起こる。"myFunction" を別の辞書 otherDict に代入
して呼び出すと、それは otherDict にバインドされる:

        let otherDict.myFunction = myDict.myFunction
        call otherDict.myFunction()

今度は、"self" は "otherDict" になる。しかし、辞書を明示的にバインドしたときに
はこれは起こらない:

        let myDict.myFunction = function(MyFunction, myDict)
        let otherDict.myFunction = myDict.myFunction
        call otherDict.myFunction()

ここでは、"self" は "myDict" である。なぜなら明示的にバインドされているからで
ある。


1.3 リスト
                                                list List Lists E686
リストとは順序を保つ要素の列である。要素はどんな型でもよい。要素へはインデック
ス番号を使ってアクセスする。列の任意の位置に要素を追加したり削除することができ
る。


リストの作成
                                                        E696 E697
リストを作るには、[]の中にコンマで区切って要素を書く。
例:
        :let mylist = [1, two, 3, "four"]
        :let emptylist = []

要素はどんな式でもよい。要素としてリストを指定すると、リストのリストができる:

        :let nestlist = [[11, 12], [21, 22], [31, 32]]

最後の要素の後に余分なコンマがあると無視される。


リストのインデックス
                                                        list-index E684
リストの要素にアクセスするには、リスト名の後に[]を書き、その中にインデックスを
書く。インデックスは0基点(つまり最初の要素のインデックスは0)である。
        :let item = mylist[0]           " 最初の要素(1)を取得
        :let item = mylist[2]           " 3番目の要素(3)を取得

取得した要素がリストならば、さらに続けてインデックスを書くことができる:
        :let item = nestlist[0][1]      " 最初のリストの2番目の要素(12)を取得

負のインデックスを指定すると、リストの末尾から数えられる。インデックス-1は最後
の要素を示し、-2は最後から2番目を指す
        :let last = mylist[-1]          " 最後の要素("four")を取得

無効なインデックスによるエラーを回避するには関数get()を使う。するとインデッ
クスが無効な場合は、0かまたは自分で指定した既定値が返る:
        :echo get(mylist, idx)
        :echo get(mylist, idx, "NONE")


リストの連結
                                                        list-concatenation
2つのリストを連結するには演算子 "+" を使う:
        :let longlist = mylist + [5, 6]
        :let mylist += [7, 8]

1個の要素を先頭または末尾に付け加えるには、[]で囲んでリストにして連結する。リ
ストの特定の要素を変更するには後述のlist-modificationを参照。


部分リスト
                                                        sublist
リストの一部分を取り出すには、[]の中に始点と終点のインデックスを書き、コロンで
区切る:
        :let shortlist = mylist[2:-1]   " リスト[3, "four"]を得る

始点のインデックスを省略すると0となる。終点のインデックスを省略すると-1となる
        :let endlist = mylist[2:]       " 2番目から最後まで: [3, "four"]
        :let shortlist = mylist[2:2]    " 1個の要素からなるリスト: [3]
        :let otherlist = mylist[:]      " リストのコピーを作る

最後のインデックスが含まれることに注意。排他的なインデックスを利用するなら
slice() メソッドを利用する。

終点のインデックスが始点のインデックスよりも前になってしまった場合は空リストと
なる。エラーメッセージは表示されない。

終点のインデックスがリストの長さより大きい場合は、長さ-1を指定したときと同じに
なる:
        :let mylist = [0, 1, 2, 3]
        :echo mylist[2:8]               " 結果: [2, 3]

NOTE: mylist[s:e]と書くと変数 "s:e" をインデックスとして使ったと解釈される。
":" の前に1文字の変数を使うときは十分注意すること。必要ならこのようにスペース
を入れるとよい: mylist[s : e].


リストの同一性
                                                        list-identity
変数 "aa" がリストであり、それを別の変数 "bb" に代入したとすると、両方とも同じ
変数を参照するようになる。よってリスト "aa" を変更すると "bb" も変更される:
        :let aa = [1, 2, 3]
        :let bb = aa
        :call add(aa, 4)
        :echo bb
        [1, 2, 3, 4]

リストのコピーを作るには関数copy()を使う。前述の通り[:]を使ってもできる。こ
れは浅いコピーである。つまりリストの要素であるリストに変更を加えると、コピーさ
れたリスト内の同じ要素も変更される:
        :let aa = [[1, 'a'], 2, 3]
        :let bb = copy(aa)
        :call add(aa, 4)
        :let aa[0][1] = 'aaa'
        :echo aa
        [[1, aaa], 2, 3, 4]
        :echo bb
        [[1, aaa], 2, 3]

完全に独立したコピーを作るにはdeepcopy()を使う。これは再帰的にリストの要素の
コピーを作る。ただし深さは100レベルまでである。

2つの変数が同じリストを指しているかは演算子 "is" で判定できる。"isnot" はその
逆である。一方、"==" は2つのリストが同じ値を持っているかを判定する。
        :let alist = [1, 2, 3]
        :let blist = [1, 2, 3]
        :echo alist is blist
        0
        :echo alist == blist
        1

Note リストの比較について注意: 2つのリストは、同じ長さを持ち、全要素が "==" の
意味で等しいとき、等しいとみなされる。ただ、1つ例外がある: 数値と文字列を比較
するとそれらは異なるとみなされる。変数に対して "==" で比較したときに行われるよ
うな自動的な型変換は行われない。例:
        echo 4 == "4"
        1
        echo [4] == ["4"]
        0

つまり、リストの比較は数値や文字列の比較よりも厳格である。単純な値もリストに入
れることによりこの方法で比較することができる:

        :let a = 5
        :let b = "5"
        :echo a == b
        1
        :echo [a] == [b]
        0


リストのアンパック

リストの要素を個々の変数としてアンパックするには、[]の中に変数を書く:
        :let [var1, var2] = mylist

変数の個数とリストの要素数が一致しないときはエラーになる。リストにある余分な要
素をまとめて受け取るには、";" と受け取る変数名を書いておく:
        :let [var1, var2; rest] = mylist

上の例は次とほぼ同じである:
        :let var1 = mylist[0]
        :let var2 = mylist[1]
        :let rest = mylist[2:]

要素が 2 つしかないときでもエラーにはならない。"rest" は空リストになる。


リストの変更
                                                        list-modification
リストの中の特定の要素を変更するには次のように:letを使う:
        :let list[4] = "four"
        :let listlist[0][3] = item

始点と終点を指定してリストの一部分を変更することができる。代入する値は、少なく
とも削除する範囲の要素数と同じ数だけ必要である:
        :let list[3:5] = [3, 4, 5]

リストに要素を追加したり削除するには関数を使う。いくつか例を示す:
        :call insert(list, 'a')         " 先頭に要素 'a' を挿入する
        :call insert(list, 'a', 3)      " 要素 'a' をlist[3]の前に挿入する
        :call add(list, "new")          " 文字列の要素を最後に追加する
        :call add(list, [1, 2])         " 1個の要素としてリストを追加する
        :call extend(list, [1, 2])      " 2個の要素からなるリストを連結する
        :let i = remove(list, 3)        " 要素3を削除する
        :unlet list[3]                  " 同上
        :let l = remove(list, 3, -1)    " 要素3から最後までを削除する
        :unlet list[3 : ]               " 同上
        :call filter(list, 'v:val !~ "x"')  " 要素 'x' を削除

要素の順番を変更する:
        :call sort(list)                " リストをアルファベット順にソート
        :call reverse(list)             " 要素の順序を反転させる
        :call uniq(sort(list))          " ソートして重複を削除する


for ループ

:for ループは、リスト、文字列または Blob の各要素に対してコマンドを実行する。
変数に各要素が順番に代入される。リストを使った例:
        :for item in mylist
        :   call Doit(item)
        :endfor

上の例は次と同じ:
        :let index = 0
        :while index < len(mylist)
        :   let item = mylist[index]
        :   :call Doit(item)
        :   let index = index + 1
        :endwhile

やりたいことがリストの各要素を変更するだけなら、forループを使うより関数map()
を使った方がよりシンプルになる。

:letコマンドと同じように、:forは変数のリストをループ変数にすることができる。
この場合、引数はリストのリストでなければならない。
        :for [lnum, col] in [[1, 3], [2, 8], [3, 0]]
        :   call Doit(lnum, col)
        :endfor

これはリストの各要素に対して:letコマンドを実行するかのように実行される。また
この場合も引数の型は全て同じでないとエラーになる。

引数の残りを1個のリスト変数に代入することもできる:
        :for [i, j; rest] in listlist
        :   call Doit(i, j)
        :   if !empty(rest)
        :      echo "remainder: " . string(rest)
        :   endif
        :endfor

Blob の場合、一度に 1 バイトが使われる。

文字列の場合、任意の合成文字を含む 1 文字が文字列として使われる。例:
        for c in text
          echo 'This character is ' .. c
        endfor


リスト操作関数
                                                E714
以下はリスト操作に使える関数である:
        :let r = call(funcname, list)   " 引数リストをつけて関数を呼び出す
        :if empty(list)                 " リストが空かどうか判定する
        :let l = len(list)              " リストの要素数
        :let big = max(list)            " リスト中の最大値
        :let small = min(list)          " リスト中の最小値
        :let xs = count(list, 'x')      " 'x' の出現回数を数える
        :let i = index(list, 'x')       " 最初に 'x' が現れる位置のインデックス
        :let lines = getline(1, 10)     " バッファから10行を取得
        :call append('$', lines)        " バッファに行を追加する
        :let list = split("a b c")      " 文字列を分割してリストにする
        :let string = join(list, ', ')  " リストの要素を連結して文字列にする
        :let s = string(list)           " リストの文字列表現
        :call map(list, '">> " . v:val')  " 各要素の前に ">> " をつける

機能を組み合わせると、処理を単純に記述できることを覚えておくとよい。例えば、リ
スト中の全ての数値の和を求める例:
        :exe 'let sum = ' . join(nrlist, '+')


1.4 辞書
                                dict Dict Dictionaries Dictionary
辞書とは連想配列である。各要素はキーと値を持つ。要素はキーによって特定できる。
要素は特に順序を持たずに保持される。


辞書の作成
                                                E720 E721 E722 E723
辞書を作るには、{}の中にコンマで区切って要素を書く。各要素のキーと値はコロンで
区切る。それぞれのキーは1度しか現れてはならない。例:
        :let mydict = {1: 'one', 2: 'two', 3: 'three'}
        :let emptydict = {}
                                                        E713 E716 E717
キーは必ず文字列である。数値を使うこともできるが、自動的に文字列に変換される。
よって文字列 '4' のキーと数値4のキーは同一の要素を参照する。
Note 文字列 '04' と数値04は異なることに注意。なぜなら数値04は文字列 '4' に変換
されるからである。空文字列もまたキーとして使用できる。
                                                literal-Dict #{}
すべてのキーを引用符で囲む必要を避けるために、#{} 形式を使用できる。この形式
は、ASCII文字、数字、'-' および '_' のみで構成されるキーを必要とする。
例:
        :let mydict = #{zero: 0, one_key: 1, two-key: 2, 333: 3}
Note ここでは 333 は 文字列 "333" であることに注意。空のキーは #{} を使うこと
ができない。

値はどんな式でもよい。辞書を値にすると、ネストした辞書ができる:
        :let nestdict = {1: {11: 'a', 12: 'b'}, 2: {21: 'c'}}

最後の要素の後に余分なコンマがあると無視される。


要素にアクセスする

通常、要素にアクセスするには[]の中にキーを書く:
        :let val = mydict["one"]
        :let mydict["four"] = 4

また、この書き方で既存の辞書に要素を追加できる。この点はリストと異なる。

キー名がアルファベット、数字、アンダースコアだけからなる場合は、以下の形式が使
えるexpr-entry:
        :let val = mydict.one
        :let mydict.four = 4

要素はリストや辞書を含むどんな型でもよいため、インデックス参照とキー参照を続け
て書くことができる:
        :echo dict.key[idx].key


辞書からリストへの変換

辞書の全要素に対してループを行いたい場合がある。そのためには辞書をリストに変換
し、そのリストに対して:forループを行う。

多くの場合はキーに対してループを行う。これには関数keys()を使う:
        :for key in keys(mydict)
        :   echo key . ': ' . mydict[key]
        :endfor

このキーのリストはソートされていない。ソートさせるには関数sort()を使う:
        :for key in sort(keys(mydict))

値に対してループを行うには関数values()を使う:
        :for v in values(mydict)
        :   echo "value: " . v
        :endfor

キーと値両方を得るには関数items()を使う。この関数は、キーと値の2個の要素から
なるリストのリストを返す:
        :for [key, value] in items(mydict)
        :   echo key . ': ' . value
        :endfor


辞書の同一性
                                                        dict-identity
辞書のコピーを作るにはリストと同様にcopy()deepcopy()を使う必要がある。そ
うでなく代入を行うと同一の辞書を参照するようになる:
        :let onedict = {'a': 1, 'b': 2}
        :let adict = onedict
        :let adict['a'] = 11
        :echo onedict['a']
        11

2つの辞書は、全てのキー・値のペアが等しいとき等しいとみなされる。より詳しくは
list-identityを参照。


辞書の変更
                                                        dict-modification
辞書の要素を変更したり、新しい要素を追加するには:letを使う:
        :let dict[4] = "four"
        :let dict['one'] = item

辞書から要素を取り除くにはremove():unletを使う。以下のように辞書からキー
"aaa" を取り除くには3つの方法がある:
        :let i = remove(dict, 'aaa')
        :unlet dict.aaa
        :unlet dict['aaa']

2つの辞書を併合させるにはextend()を使う:
        :call extend(adict, bdict)
上のコマンドはbdictの全ての要素をadictに追加する。キーが重複した要素はbdictの
要素により上書きされる。この動作は3番目の引数により変更できる。
Note 辞書の要素間に順序は定まっていない。そのため ":echo adict" としたとき、も
ともとadictにあった要素が先に、bdictから追加された要素が後に表示されると考えて
はならない。

辞書から条件を指定して要素を取り除くにはfilter()が使える:
        :call filter(dict, 'v:val =~ "x"')
このコマンドは "dict" から 'x' にマッチしない要素を全て取り除く。
このコマンドで全てのエントリを除去することもできる:
        call filter(dict, 0)


関数を辞書に入れる
                                Dictionary-function self E725 E862
関数が "dict" 属性つきで定義されると、特殊な方法で呼び出すことができる。例:
        :function Mylen() dict
        :   return len(self.data)
        :endfunction
        :let mydict = {'data': [0, 1, 2, 3], 'len': function("Mylen")}
        :echo mydict.len()

これはオブジェクト指向プログラミングのメソッドに似ている。この辞書の要素は
Funcrefである。暗黙に定義されるローカル変数 "self" は、この関数を呼び出した
辞書を参照している。

"dict" 属性をつけないでFuncrefを辞書に入れることもできる。しかしその場合、変
数 "self" は定義されない。

                                numbered-function anonymous-function
関数に名前をつける必要をなくすために、関数を定義して直接辞書に代入することがで
きる:
        :let mydict = {'data': [0, 1, 2, 3]}
        :function mydict.len()
        :   return len(self.data)
        :endfunction
        :echo mydict.len()

こうすると関数に番号がふられ、dict.lenがこの関数を参照するFuncrefとなる。こ
の関数はFuncrefを通してのみ呼び出せる。参照しているFuncrefがなくなると、こ
の関数は自動的に削除される。

番号付き関数には "dict" 属性を付ける必要はない。

番号付き関数でエラーが発生したときは、あるトリックを使うことで発生源を確認でき
る。例えば 42 という関数なら次のようにする:
        :function {42}


辞書操作関数
                                                        E715
以下は辞書操作に使える関数である:
        :if has_key(dict, 'foo')        " 辞書がキー "foo" の要素を持つなら真
        :if empty(dict)                 " 辞書が空なら真
        :let l = len(dict)              " 辞書の要素数
        :let big = max(dict)            " 辞書中の最大値
        :let small = min(dict)          " 辞書中の最小値
        :let xs = count(dict, 'x')      " 'x' の出現回数を数える
        :let s = string(dict)           " 辞書の文字列表現
        :call map(dict, '">> " . v:val')  " 各要素の前に ">> " をつける


1.5 Blobs
                                                blob Blob Blobs E978
Blobは、バイナリオブジェクトである。例えば、ファイルから画像を読んでチャネルを
通し送信することなどに使える。

Blobは、ほとんどの場合、数値の List のように振る舞う。数値は、0 から 255 の
8ビットの値を持つ。


Blobの作成

BlobはBlobリテラル blob-literal を使って作成できる:
        :let b = 0zFF00ED015DAF
読みやすくするために、ドットをバイト間(16進文字のペア)に挿入することができる。
ドットは値を変更しない:
        :let b = 0zFF00.ED01.5DAF

Blobは readfile() で引数{type}を "B" に設定してファイルから読み込むことがで
きる。例:
        :let b = readfile('image.png', 'B')

Blobは、ch_readblob() 関数を使用してチャネルから読み取ることができる。


Blobのインデックス
                                                        blob-index E979
Blob内のバイトは、Blobの後ろに角括弧でインデックスを入れることによってアクセス
することができる。インデックスは 0 から始まるため、最初のバイトのインデックス
は 0 になる。
        :let myblob = 0z00112233
        :let byte = myblob[0]           " 1番目のバイトを取得: 0x00
        :let byte = myblob[2]           " 3番目のバイトを取得: 0x22

負のインデックスは終端から数えられる。インデックス -1 はBlobの最後のバイト、-2
は最後の1つ前のバイトを表す。
        :let last = myblob[-1]          " 最後のバイトを取得: 0x33

無効なインデックスに対するエラーを回避するには、get() 関数を使用すること。項
目が利用できない場合、-1 または指定したデフォルト値が返される:
        :echo get(myblob, idx)
        :echo get(myblob, idx, 999)


Blobの繰り返し

:for ループは、Blobの各バイトに対してコマンドを実行する。ループ変数はBlobの
各バイトに設定される。例:
        :for byte in 0z112233
        :   call Doit(byte)
        :endfor
これは、0x11, 0x22 および 0x33 で Doit() を呼び出す。


Blobの連結

2つのBlobは "+" 演算子で連結できる:
        :let longblob = myblob + 0z4455
        :let myblob += 0z6677

Blobの決まった場所を変更するには、下記の blob-modification を参照。


Blobの一部

Blobの一部は、角括弧内のコロンで区切られた最初と最後のインデックスを指定するこ
とによって取得できる:
        :let myblob = 0z00112233
        :let shortblob = myblob[1:2]    " 0z1122 を取得
        :let shortblob = myblob[2:-1]   " 0z2233 を取得

最初のインデックスを省略することはゼロと同じである。最後のインデックスを省略す
ることは -1 と同じである。
        :let endblob = myblob[2:]       " 項目2から終端まで: 0z2233
        :let shortblob = myblob[2:2]    " 1バイトのBlob: 0z22
        :let otherblob = myblob[:]      " Blobのコピーを作成

最初のインデックスがBlobの最後のバイトを超えている場合、または2番目のインデッ
クスが最初のインデックスより前にある場合、結果は空のBlobになる。エラーメッセー
ジはない。

2番目のインデックスがリストの長さ以上の場合、長さから 1 を引いたものが使用され
る:
        :echo myblob[2:8]               " result: 0z2233


Blobの変更
                                                        blob-modification
Blobの特定のバイトを変更するには、 :let を使用する:
        :let blob[4] = 0x44

インデックスがBlobの終端を1つ超える場合は、それが追加される。それより上のイン
デックスはエラーである。

バイトシーケンスを変更するには、[:] 表記が使用できる:
        let blob[1:3] = 0z445566
置き換えられたバイトの長さは、提供された値と丁度同じでなければならない。 E972

Blobの一部を変更するには、変更する最初と最後のバイトを指定する。値の範囲内のバ
イト数は同じでなければならない:
        :let blob[3:5] = 0z334455

関数 add()remove() および insert() も使用できる。


Blobの同一性

Blobは等しいかどうか比較することができる:
        if blob == 0z001122
または、同一性の等しさのために:
        if blob is otherblob
                                                        blob-identity E977
変数 "aa" がBlobで、別の変数 "bb" に代入すると、両方の変数は同じBlobを参照す
る。そして、"is" 演算子はtrueを返す。

[:] または copy() を使用してコピーを作成する場合、値は同じだが、同一性は異な
る:
        :let blob = 0z112233
        :let blob2 = blob
        :echo blob == blob2
        1
        :echo blob is blob2
        1
        :let blob3 = blob[:]
        :echo blob == blob3
        1
        :echo blob is blob3
        0

Blobのコピーを作成するには、copy() 関数を使用する。[:] を使っても上で説明し
たように動作する。


1.6 変数について補足
                                                        more-variables

変数や式の結果の型を知りたいのならば、関数type()を使う。

オプション 'viminfo' にフラグ '!' が含まれるならば、大文字で始まり小文字を含ま
ない名前のグローバル変数は、viminfoファイルviminfo-fileに格納される。

オプション 'sessionoptions' が "global" を含むなら、大文字で始まり少なくとも一
文字以上の小文字を含む名前のグローバル変数は、sessionファイルsession-file
格納される。

変数名                  何処に保存されるか
my_var_6                されない
My_Var_6                sessionファイル
MY_VAR_6                viminfoファイル


波括弧を使って変数名を構成できる。詳細はcurly-braces-namesを参照。

==============================================================================
2. 式の文法                                             expression-syntax

式文法一覧、優先順位の低いものから高い順に:

expr1 expr2
        expr2 ? expr1 : expr1   if-then-else 条件式

expr2 expr3
        expr3 || expr3 ...      論理和

expr3 expr4
        expr4 && expr4 ...      論理積

expr4 expr5
        expr5 == expr5          等しい
        expr5 != expr5          等しくない
        expr5 >  expr5          より大きい
        expr5 >= expr5          大きいか等しい
        expr5 <  expr5          より小さい
        expr5 <= expr5          小さいか等しい
        expr5 =~ expr5          正規表現にマッチする
        expr5 !~ expr5          正規表現にマッチしない

        expr5 ==? expr5         文字列として等しい(大文字/小文字区別無し)
        expr5 ==# expr5         文字列として等しい(大文字/小文字区別有り)
        etc.                    上記の各式は大小文字の区別を、?を付加すると行
                                わず、#を付加すると行う

        expr5 is expr5          同一のリスト List、辞書 Dictionary または
                                Blob のインスタンス
        expr5 isnot expr5       異なるリスト List、辞書 Dictionary または
                                Blob のインスタンス

expr5 expr6
        expr6 +  expr6 ...      足し算、リストまたはBlobの連結
        expr6 -  expr6 ...      引き算
        expr6 .  expr6 ...      文字列の連結
        expr6 .. expr6 ...      文字列の連結

expr6 expr7
        expr7 *  expr7 ...      掛け算
        expr7 /  expr7 ...      割り算
        expr7 %  expr7 ...      剰余(割った余り)

expr7 expr8
        ! expr7                 論理否定
        - expr7                 単項のマイナス {訳注: -1等}
        + expr7                 単項のプラス

expr8 expr9
        expr8[expr1]            文字列のバイト、またはリストの要素
        expr8[expr1 : expr1]    文字列の部分文字列、またはリストの部分リスト
        expr8.name              辞書 Dictionary の要素
        expr8(expr1, ...)       Funcref 変数による関数呼び出し
        expr8->name(expr1, ...) method 呼び出し

expr9 number                  数定数
        "string"                文字列定数。バックスラッシュは特別な意味を持つ
        'string'                リテラル文字列定数。'を含めるには2重にする
        [expr1, ...]            リスト List
        {expr1: expr1, ...}     辞書 Dictionary
        #{key: expr1, ...}      辞書 Dictionary
        &option                 オプション変数
        (expr1)                 式の入れ子
        variable                内部変数
        va{ria}ble              波括弧付きの内部変数
        $VAR                    環境変数
        @r                      レジスタ 'r' の値
        function(expr1, ...)    関数呼出し
        func{ti}on(expr1, ...)  波括弧付きの関数呼出し
        {args -> expr1}         ラムダ式

"..." はその演算が、その後に他の演算を続ける事ができることを示している。
例:
        &nu || &list && &shell == "csh"

一つのレベルにある全ての式は左から右に解釈される。


expr1                           expr1 trinary falsy-operator ?? E109
-----

三項演算子:   expr2 ? expr1 : expr1
Falsy 演算子: expr2 ?? expr1

三項演算子

'?' より前の式は数値として評価される。その結果がTRUEであった場合、'?' と ':'
に挟まれた式の値がこの式全体の値となり、そうでなかった場合は ':' 以降の式の値
が全体の値となる。
例:
        :echo lnum == 1 ? "先頭" : lnum

始めの式が "expr2" であるから、そこに別の?:を含むことはできない。残り二つの式
については以下のように再帰的な?:の利用が許される。
例:
        :echo lnum == 1 ? "top" : lnum == 1000 ? "last" : lnum

読み易くするために、行継続line-continuationを利用することが推奨される:
        :echo lnum == 1
        :\      ? "top"
        :\      : lnum == 1000
        :\              ? "last"
        :\              : lnum

':' の前には必ずスペースを入れること。そうでないと "a:1" のような変数の使用と
間違えてしまう可能性がある。

Falsy 演算子

これは "null合体演算子" としても知られている、しかし複雑すぎるため、単に Falsy
演算子と呼ぶことにした。

'??' の前の式が評価される。truthy と評価された場合、これが結果として使われ
る。
そうでないなら、'??' の後の式が評価され、結果として使われる。これがもっとも便
利なのは、ゼロや空な結果になりうる式でデフォルト値を持つ場合:
        echo theList ?? 'list is empty'
        echo GetName() ?? 'unknown'

これは同等だが、同じではない:
        expr2 ?? expr1
        expr2 ? expr2 : expr1
2行目は "expr2" が2度評価される。


expr2 and expr3                                         expr2 expr3
---------------

expr3 || expr3 ..       論理和          expr-barbar
expr4 && expr4 ..       論理積          expr-&&

演算子 "||" と "&&" は左右に一つずつ引数を取る。引数は数値に変換される。結果は:

    入力                         出力
n1      n2              n1 || n2        n1 && n2
FALSE FALSE         FALSE         FALSE
FALSE TRUE          TRUE          FALSE
TRUE  FALSE         TRUE          FALSE
TRUE  TRUE          TRUE          TRUE

演算子は続けて書く事ができる。例:

        &nu || &list && &shell == "csh"

Note "&&" は "||" よりも高い優先順位を持っている。これは次の事を意味する:

        &nu || (&list && &shell == "csh")

結果が確定した時点で残りの式は省略され、解釈されない。これはC言語で行われるこ
とに似ている。例:

        let a = 1
        echo a || b

これはaがTRUEであるため、変数bが宣言されていなくても有効であり、結果は絶対
TRUEである。次のも同様に:

        echo exists("b") && b == "yes"

これもbが宣言されているいないにかかわらず有効である。後半の項はbが定義されてい
る時にだけ評価される。


expr4                                                   expr4
-----

expr5 {cmp} expr5

2つの式expr5を比較し、結果が偽なら0を、真なら1を返す。

                        expr-==  expr-!=  expr->   expr->=
                        expr-<   expr-<=  expr-=~  expr-!~
                        expr-==# expr-!=# expr->#  expr->=#
                        expr-<#  expr-<=# expr-=~# expr-!~#
                        expr-==? expr-!=? expr->?  expr->=?
                        expr-<?  expr-<=? expr-=~? expr-!~?
                        expr-is expr-isnot expr-is# expr-isnot#
                        expr-is? expr-isnot?
                'ignorecase'次第   大小文字考慮    大小文字無視
等しい                  ==              ==#             ==?
等しくない              !=              !=#             !=?
より大きい              >               >#              >?
より大きいか等しい      >=              >=#             >=?
より小さい              <               <#              <?
より小さいか等しい      <=              <=#             <=?
正規表現マッチ          =~              =~#             =~?
正規表現非マッチ        !~              !~#             !~?
同一のインスタンス      is              is#             is?
異なるインスタンス      isnot           isnot#          isnot?

例:
"abc" ==# "Abc"   0と評価される
"abc" ==? "Abc"   1と評価される
"abc" == "Abc"    'ignorecase' が設定されていれば1と、でなければ0と評価

                                                        E691 E692
リストListはリストとだけ比較可能で、==系、!=系、is、isnotのみ利用できる。
これらはそれぞれのリストの値を再帰的に比較する。大文字小文字無視にすると要素を
比較するときに大文字小文字を無視する。

                                                        E735 E736
辞書Dictionaryは辞書とだけ比較可能で、==系、!=系、is、isnotのみ利用できる。
これらは辞書のキー/値を再帰的に比較する。大文字小文字無視にすると要素を
比較するときに大文字小文字を無視する。

                                                        E694
FuncrefFuncrefとだけ比較可能で、"equal", "not equal", "is", "isnot" のみ
利用できる。大文字小文字は常に区別される。引数や辞書が(部分適用に)バインドされ
ているかどうかも重要である。辞書も同値(あるいは "is" の場合は同一)でなければな
らず、引数も同値(あるいは同一)でなければならない。

関数参照が同じ関数を指しているのかを、バインドされた辞書や引数を無視して比較し
たい場合は、get() を使用して関数名を取得すればよい:
        if get(Part1, 'name') == get(Part2, 'name')
           " Part1 と Part2 は同じ関数を指している

リスト List 、辞書 Dictionary または Blob に対して "is" や "isnot" を使
うと、それらの式が同じリスト、辞書 または Blob のインスタンスを参照している
か判定される。リストのコピーと元のリストは異なると判定される。リスト、辞書また
は Blob 以外に対して "is" は "equal" と同じで、"isnot" は "not equal" と同じ
である。ただし "is"、"isnot" は型が異なると値が等しくない点が "==" とは異なる。

        echo 4 == '4'
        1
        echo 4 is '4'
        0
        echo 0 is []
        0
"is#"/"isnot#" と "is?"/"isnot?" は大文字小文字を区別するかどうかが違う。

文字列と数値を比較した場合、文字列が数値に変換され、数値として比較される。これ
は以下のようになることを意味する:
        echo 0 == 'x'
        1
なぜなら、'x' は数値のゼロに変換されるからである。しかし、
        echo [0] == ['x']
        0
リストや辞書の中ではこの変換は行われない。

文字列同士を比較した場合、strcmp()やstricmp()によって比較される。これは数値的
に(バイトの値で)比較されるのであって、必ずしも言語に基づく文字種の違いではな
い。

'#' を付けた演算子を使うか、省略形かつ 'ignorecase' が設定されていない場合、比
較はstrcmp()で行われる。大文字・小文字は区別される。

'?' を付けた演算子を使うか、省略形かつ 'ignorecase' が設定されている場合、比較
はstricmp()で行われる。大文字・小文字は区別されない。

'smartcase' は適用されない。

"=~" と "!~" 演算子は右側の引数を正規表現のパターンとして、左側の引数に対して
マッチを試みる。正規表現のパターンに関してはpatternを参照。このマッチは
'magic' が設定され 'cpoptions' が空であるように振舞い、実際の 'magic' や
'cpoptions' に何が設定されているには依存しない。これがスクリプトをポータブルに
してくれる。正規表現中のバックスラッシュが重複してしまうのを避けるには、シング
ルクォーテーションの文字列を使用する。詳細はliteral-stringを参照。
文字列は単一行として扱われるので、複数行のパターン(\nを含むもの)はマッチしな
い。しかしながらリテラルなヌル文字(NL)を、普通の文字として代用することはでき
る。例:
        "foo\nbar" =~ "\n"      1として評価される
        "foo\nbar" =~ "\\n"     0として評価される


expr5 and expr6                                         expr5 expr6
---------------
expr6 + expr6   足し算、リスト List または Blob の連結      expr-+
expr6 - expr6   引き算                                          expr--
expr6 . expr6   文字列の連結                                    expr-.
expr6 .. expr6  文字列の連結                                    expr-..

リストに対しては "+" のみ可能で、expr6は両方ともリストでなければならない。結果
は2つのリストを連結した新しいリスト。

文字列の連結には ".." が推奨される。"." はあいまいで、Dict メンバーアクセス
と浮動小数点数にも使用される。
vimscript-version が2以上の場合は "." を使用することはできない。

expr7 * expr7  掛け算                                           expr-star
expr7 / expr7  割り算                                           expr-/
expr7 % expr7  剰余(割った余り)                                 expr-%

"." と ".." を除く全ての演算子は自動的に文字列を数値に変換する。
ビット演算については and()or()xor() を参照。

"+" と "." の違いに注意:
        "123" + "456" = 579
        "123" . "456" = "123456"

'.' は '+' と '-' と等しい優先順位を持つので、次の式は:
        1 . 90 + 90.0
次のように解釈される:
        (1 . 90) + 90.0
これはエラーにならない。というのは、"190" は自動的に数値 190 に変換さ
れ、それと浮動小数点数 90.0 との和になる。しかし次の式は:
        1 . 90 * 90.0
次のように解釈される:
        1 . (90 * 90.0)
'.' は '*' より優先順位が低いためである。これはエラーになる。というのは、浮動
小数点数と文字列を結合することになるからである。

数値をゼロで割った結果は、被除数によって次のようになる:
          0 / 0  = -0x80000000  (浮動小数点数の NaN のようなもの)
         >0 / 0  =  0x7fffffff  (正の無限大のようなもの)
         <0 / 0  = -0x7fffffff  (負の無限大のようなもの)
        {訳注: >0 は正の数、<0 は負の数の意味}
        (Vim 7.2 以前では常に 0x7fffffff だった)

64ビット数値が有効化されている場合は:
          0 / 0  = -0x8000000000000000  (浮動小数点数の NaN のようなもの)
         >0 / 0  =  0x7fffffffffffffff  (正の無限大のようなもの)
         <0 / 0  = -0x7fffffffffffffff  (負の無限大のようなもの)

'%' の右辺(法)が0の場合、結果は0になる。

これらは全てFuncrefには適用できない。

. と % は浮動小数点数には適用できない。 E804


expr7                                                   expr7
-----
! expr7                 論理否定                expr-!
- expr7                 単項マイナス            expr-unary--
+ expr7                 単項プラス              expr-unary-+

'!' 演算子ではTRUEFALSEに、FALSETRUEになる。
'-' では数値の符号が反転される。
'+" では変化はない。Note: "++" は効果がない。

文字列はまず数値に変換される。

これら2つは繰り返したり混ぜたりできる。例:
        !-1         == 0
        !!8         == 1
        --9         == 9


expr8                                                   expr8
-----
この式は expr9、もしくは連続する以下の選択方式であり、どんな順番でもよい。
例として、これらはすべて可能である:
        expr8[expr1].name
        expr8.name[expr1]
        expr8(expr1, ...)[expr1].name
        expr8->(expr1, ...)[expr1]
評価は常に左から右に行われる。

expr8[expr1]            文字列またはリストの要素        expr-[] E111
                                                        E909 subscript
旧来の Vim script では:
expr8が数値か文字列ならば、この値は文字列 expr8 の第 expr1 番目のバイトからな
る1バイトの文字列となる。expr8は文字列 (数値の場合は自動で文字列に変換される)、
expr1は数として扱われる。マルチバイトのエンコーディングを認識しないため、代わ
りの方法は byteidx() を参照するか、split()を使って文字列を文字のリストに変
換すれば良い。例えばカーソルの下のバイトを得るには:
        :let c = getline(".")[col(".") - 1]

Vim9 script では:
expr8 が文字列ならば、この値は文字列 expr8 の第 expr1 番目の文字 (合成文字があ
る場合はそれらを全て含む) に相当する文字列となる。バイトインデックスの場合は
strpart() を使う。

インデックスが0の場合最初のバイトもしくは文字になる。注意: テキストの列番号は0
始まりである!

文字列の長さよりも大きなインデックスが指定された場合、結果は空文字列になる。負
数のインデックスを指定すると、結果は常に空文字列になる(後方互換性のため)。
最後のバイトもしくは文字を得るには[-1:]を使うこと。
Vim9 script では負数のインデックスはリストと同様に使用され、終端からのカウント
になる。

expr8がリストListならばインデックスexpr1の要素が返る。取りうるインデックスの
値についてはlist-indexを参照。インデックスが範囲を超えている場合はエラーとな
る。例:
        :let item = mylist[-1]          " 最後の要素を取得

一般的には、インデックスが正でリストの長さ以上または、負でリストの長さ×-1より
小さいときエラーとなる。


expr8[expr1a : expr1b]  部分文字列または部分リスト      expr-[:]

expr8が文字列ならば、バイトか文字数でexpr1aからexpr1bまでの部分文字列となる
(両端を含む)。expr8は文字列として扱われ、expr1aとexpr1bは数値として扱われる。

旧来の Vim script ではインデックスはバイトインデックスとなる。マルチバイトのエ
ンコーディングは認識しない。マルチバイト文字列のインデックスを計算する方法につ
いては byteidx() を参照。expr8が数値ならば最初に文字列に変換される。

Vim9 script ではインデックスは文字インデックスであり、合成文字を含む {訳注: 1
個の基底文字とその任意個の合成文字をまとめて 1 としてカウントする}。バイトイン
デックスを使用するには strpart() を使用する。合成文字を含まない文字インデッ
クスを使用するには strcharpart() を使用する。

インデックスの expr1b の項目は含まれ、内包的である。排他的なインデックスは
slice() 関数を使う。

expr1aが省略されたときは0となる。expr1bが省略されたときは文字列の長さ-1となる。

負数のインデックスを使うことによって文字列の末尾から取り出すことができる。-1は
最後の文字、-2は最後から2文字目…を表す。

インデックスがその文字の範囲外に出てしまったときは、その文字は省かれる。expr1b
がexpr1aより小さいときは空文字列となる。

例:
        :let c = name[-1:]              " 文字列の最後のバイト
        :let c = name[0:-1]             " 文字列全体
        :let c = name[-2:-2]            " 文字列の最後から2バイト目
        :let s = line(".")[4:]          " 5バイト目から末尾まで
        :let s = s[:-3]                 " 最後の2文字を削除する

                                                        slice
expr8が List ならば、インデックスexpr1aとexpr1bの間の要素からなる新しい List
となる。すぐ上で説明した文字列の場合と同様である。部分リストsublistも参照の
こと。例:
        :let l = mylist[:3]             " 最初の4個の要素
        :let l = mylist[4:4]            " 1個の要素からなるリスト
        :let l = mylist[:]              " リストの浅いコピー

expr8が Blob ならば、インデックスexpr1aとexpr1bのバイト数を含む新しい Blob
となる。
例:
        :let b = 0zDEADBEEF
        :let bs = b[1:2]                " 0zADBE
        :let bs = b[:]                  " 0zDEADBEEF のコピー

Funcrefに対してexpr8[expr1]やexpr8[expr1a : expr1b]を使うとエラーになる。

部分リストでスコープと変数に続くコロンとの混乱に注意してください:
        mylist[n:]     " 変数nは使える
        mylist[s:]     " スコープs:を使うとエラー!


expr8.name              辞書Dictionaryの要素          expr-entry

expr8が辞書Dictionaryのとき、ドットをつけるとその後に書かれた名前が辞書の
キーと見なされる。例: expr8[name]。

名前は変数名と同じようにアルファベットと数字だけから構成されなければならない
が、数字で始まってもよい。波括弧は使えない。

ドットの前後に空白があってはならない。

例:
        :let dict = {"one": 1, 2: "two"}
        :echo dict.one          " "1" を表示
        :echo dict.2            " "two" を表示
        :echo dict .2           " ドットの前のスペースによるエラー

Note ドットは文字列連結にも使われる。混乱を避けるために、文字列連結のドットの
周りには必ずスペースを入れること。


expr8(expr1, ...)       Funcref 関数呼び出し

expr8がFuncref型の変数のとき、その参照する関数を呼び出す。


expr8->name([args])     メソッド呼び出し                method ->
expr8->{lambda}([args])
                                                        E276
グローバル関数としても利用可能なメソッドの場合、これは次と同じである:
    name(expr8 [, args])
これらは "expr8" 専用としても利用できる

これにより、あるメソッドが返す値を次のメソッドに渡して連鎖させることができる:
    mylist->filter(filterexpr)->map(mapexpr)->sort()->join()

ラムダの使用例:
        GetPercentage()->{x -> x * 100}()->printf('%d%%')

-> を使用する場合 expr7 演算子が最初に適用される。したがって:
        -1.234->string()
は、以下と同等である:
        (-1.234)->string()
以下ではない:
        -(1.234->string())

                                                        E274
"->name(" には空白を含めることはできない。"->" の前と "(" の後に空白を含めるこ
とができる。したがって、次のように行を分割できる:
        mylist
        \ ->filter(filterexpr)
        \ ->map(mapexpr)
        \ ->sort()
        \ ->join()

ラムダ形式を使用する場合、} と ( の間に空白があってはならない。


                                                        expr9

------
number                  数定数                          expr-number

                        0x hex-number 0o octal-number binary-number
10進数、16進数(0xか0Xで始まる)、2進数(0bか0Bで始まる)、もしくは8進数(0か0oか0O
で始まる)の数定数。

                                                floating-point-format
浮動小数点数は次の2つの形式で書ける:

        [-+]{N}.{M}
        [-+]{N}.{M}[eE][-+]{exp}

ここで {N} と {M} は数値である。{N} と {M} の両方とも省略してはならず、数値の
みを含めることができる。
[-+] は、省略可能なプラスまたはマイナス記号である。
{exp} は指数で、10 のベキ。
現在のロケールが何であれ、小数点にはドットのみを使える。コンマは使えない。
{+float 機能つきでコンパイルされたときのみ有効}

例:
        123.456
        +0.0001
        55.0
        -0.123
        1.234e03
        1.0E-6
        -3.1416e+88

次のものは無効である:
        3.              {M} が空
        1e40            .{M} がない

論理的根拠:
浮動小数点数が導入される前は、123.456 と書くと 123 と 456 の2つの数値と解釈
され、それらが文字列に変換されて結合されて "123456" という文字列になった。
これは無意味であり、Vim script 内で意図的に使われているものが見つからなかった
ので、浮動小数点数の普通の表記法を用いるため、この後方非互換性は許容された。

                                                        float-pi float-e
コピー&ペーストしておくのに便利な値:
        :let pi = 3.14159265359
        :let e  = 2.71828182846
または、浮動小数点リテラルとして書き込むことを望まない場合は、次のような関数を
使用することもできる:
        :let pi = acos(-1.0)
        :let e  = exp(1.0)

                                                floating-point-precision
浮動小数点数の精度と範囲は、Vim とリンクしたライブラリの "double" の意味によ
る。実行時にこれを変更することはできない。

浮動小数点数 Float は printf("%g", f) とするのと同様に、小数点以下6桁まで表
示される。表示する桁数は printf() を使えば変えられる。例:
        :echo printf('%.15e', atan(1))
        7.853981633974483e-01



文字列                                  string String expr-string E114
------
"string"                文字列定数              expr-quote

ダブルクォートが使われていることに注意。

文字列定数には以下の特殊文字が使用できる:
\...    3桁の8進数字 (例 "\316")
\..     2桁の8進数字 (非数字が続かなければならない)
\.      1桁の8進数字 (非数字が続かなければならない)
\x..    2桁の16進数字 (例 "\x1f")
\x.     1桁の16進数字 (16進数字でないものが続かなければならない)
\X..    \x..に同じ
\X.     \x.に同じ
\u....  文字を4桁の16進数で表現したもので、実際の値は現在の 'encoding' の値に
        依存する (例えば "\u02a4")
\U....  \u と同じだが8桁までの16進数が使える
\b      バックスペース <BS>
\e      エスケープ <Esc>
\f      フォームフィード <FF>
\n      改行 <NL>
\r      改行(キャリッジリターン) <CR>
\t      タブ <Tab>
\\      円記号(バックスラッシュ)
\"      ダブルクォート
\<xxx>  "xxx" という名の特殊キー。例 "\<C-W>" は CTRL-W。これはマップで使うた
        めのものであり、0x80 バイトはエスケープされる。
        ダブルクォート文字を使う場合はエスケープしなければならない: "<M-\">"
        utf-8 文字を得るためには <Char-xxxx> を使わずに、上述の \uxxxx を使う
        こと。
\<*xxx>  \<xxx> と同じだが、文字に修飾子を含むのではなくそれを前に付加する。
        たとえば、"\<C-w>" は 0x17 の1文字だが、"\<*C-w>" は 4バイトになる:
        3は CTRL 修飾子で、その後に文字の "W"。

Note "\xff" は値255の1バイトとなる。これはエンコーディングによっては無効な値か
もしれない。現在の 'encoding' の値に応じた文字255を得るには "\u00ff" を使う。

Note "\000" と "\x00" は強制的に文字列の終端として扱われる。


blobリテラル                            blob-literal E973
------------

0zまたは0Zで始まる任意のバイト数の16進数。
シーケンスは偶数個の16進数文字でなければならない。例:
        :let b = 0zFF00ED015DAF


リテラル文字列                                          literal-string E115
--------------
'string'                文字列定数              expr-'

Note シングルクォートが使われていることに注意。

この文字列は文字通りに扱われる。バックスラッシュは取り除かれないし、また特別な
意味を持ったりもしない。唯一の例外は、2つのシングルクォートで1つのシングル
クォートになることである。

シングルクォートの文字列は、バックスラッシュを2重にしなくてよいため、正規表現
パターンを表すのに便利である。以下の2つのコマンドは同値である:
        if a =~ "\\s*"
        if a =~ '\s*'


オプション                                      expr-option E112 E113
---------
&option                 オプション変数、ローカルなものが優先
&g:option               グローバルオプション変数
&l:option               ローカルオプション変数

例:
        echo "タブストップは " . &tabstop . " です"
        if &insertmode

ここにはあらゆるオプション名を使うことができる。optionsを参照。ローカル変数
を使おうとして、実際にはバッファローカルもウィンドウローカルも存在しない場合に
は、グローバル変数が利用される。


レジスタ                                                expr-register @r
--------
@r                      レジスタ 'r' の値

名前付きレジスタの中身を1つの文字列として得る。必要なところには改行文字が挿入
されている。無名レジスタの中身を取得するには@"か@@を使う。利用可能なレジスタの
説明についてはregistersを参照。

レジスタ '=' を使うと、式の値でなく式そのものを得る。それを評価するには
eval()を使う。


入れ子                                                  expr-nesting E110
-------
(expr1)                 式の入れ子


環境変数                                                expr-env
--------
$VAR                    環境変数

環境変数の文字列。定義されていない環境変数を指定した場合、結果は空文字列。

getenv() と setenv() 関数も使用でき、英数字以外の名前を持つ環境変数に対し
て機能する。
environ() 関数は、すべての環境変数を含む辞書を取得するために使用できる。


                                                        expr-env-expand
Note $VARを直接使用した場合とexpand("$VAR")を使用した場合では、動作に違いがあ
ることに注意。直接使用した場合には、現在のVimのセッション中で既知の値に展開さ
れるだけである。expand()を使用した場合、まず最初にVimのセッション中で既知の値
に展開される。それが失敗した場合、変数の展開にシェルが使用されることになる。こ
れは遅くはなるが、シェルの知りうる全ての変数を展開することができる。例:
        :echo $shell
        :echo expand("$shell")
最初の一つは恐らく何も返ってこず、2つ目は $shell の値が返ってくるだろう (貴方
のシェルがそれをサポートしているなら)


内部変数                                                expr-variable
--------
variable                内部変数
以下のinternal-variablesを参照。


関数呼出                expr-function E116 E118 E119 E120
--------
function(expr1, ...)    関数呼出
以下のfunctionsを参照。


ラムダ式                                        expr-lambda lambda
--------
{args -> expr1}         ラムダ式

ラムダ式は、expr1 を評価した結果を返す新しい無名関数を作成する。ラムダ式は以
下の点がユーザー定義関数user-functionsと異なる:

1. ラムダ式の本体は単一の式expr1であり、Exコマンド列ではない。
2. 引数に前置詞 "a:" を使用しない。例:
        :let F = {arg1, arg2 -> arg1 - arg2}
        :echo F(5, 2)
        3

引数は任意である。例:
        :let F = {-> 'error function'}
        :echo F('ignored')
        error function

Note Vim9 script では別の書式のラムダ式を使う: vim9-lambda

                                                        closure
ラムダ式は外側のスコープの変数と引数にアクセスできる。これはよくクロージャと呼
ばれる。以下の例ではラムダの中で "i" と "a:arg" が使われているが、これらは関数
のスコープに既に存在する。これらは関数から抜けても有効であり続ける:
        :function Foo(arg)
        :  let i = 3
        :  return {x -> x + i - a:arg}
        :endfunction
        :let Bar = Foo(4)
        :echo Bar(6)
        5

Note: これが正しく機能するためには、ラムダが定義される前の外側のスコープ内にそ
れらの変数が存在していなければならない。:func-closureも参照。

ラムダとクロージャのサポートは以下のように判定できる:
        if has('lambda')

sort()map()filter()とともにラムダ式を使う例:
        :echo map([1, 2, 3], {idx, val -> val + 1})
        [2, 3, 4]
        :echo sort([3,7,2,1,4], {a, b -> a - b})
        [1, 2, 3, 4, 7]

ラムダ式は、チャネル、ジョブ、タイマーを使う際にも有用である:
        :let timer = timer_start(500,
                        \ {-> execute("echo 'Handler called'", "")},
                        \ {'repeat': 3})
        Handler called
        Handler called
        Handler called

Note クロージャが自身の依存するコンテキストから参照されている場合、メモリが使
われたままになり解放されない可能性がある:
        function Function()
           let x = 0
           let F = {-> x}
         endfunction
このクロージャが関数スコープの "x" を使用しており、そして同じスコープの "F" が
クロージャを参照している。この循環の結果解放されることのないメモリになる。
推奨: このようなことはしないこと。

Exコマンドを実行するためにどのように execute() を使っているかに注目せよ。醜い
が。
Vim9 script ではコマンドブロックが使える。inline-function を参照。

ラムダ式は '<lambda>42' のような内部名を持っている。もしラムダ式でエラーが発生
した場合には、以下のコマンドでどのラムダ式でエラーが起きたかを調べることができ
る:
        :function <lambda>42
numbered-functionも参照。

==============================================================================
3. 内部変数                                     internal-variables E461

内部変数の名前には文字と、数字とアンダーバー('_')を使うことができる。しかし数
字で始めることはできない。波括弧を使うこともできる。
詳細はcurly-braces-namesを参照。

内部変数は ":let" コマンドで作成される :let。":unlet" コマンドで明示的に内部
変数を破棄することができる :unlet。内部変数に使われてない名前か、既に破棄さ
れた内部変数を使うとエラーとなる。

                                                variable-scope
変数には幾つもの名前空間が存在する。実際にどれが利用されるかは、どのような前置
子が使われたかで決まる:

                (無し) 関数の中では関数ローカル、それ以外ではグローバル
buffer-variable    b:   現在のバッファにローカル
window-variable    w:   現在のウィンドウにローカル
tabpage-variable   t:   現在のタブページにローカル
global-variable    g:   グローバル
local-variable     l:   関数にローカル
script-variable    s:   :sourceされたVim scriptにローカル
function-argument  a:   関数の引数(関数内のみ)
vim-variable       v:   グローバル、Vimがあらかじめ定義

これらのスコープそのものに辞書を通じてアクセスできる。例えば、全てのスクリプト
ローカル変数を削除するには次のようにする:
        :for k in keys(s:)
        :    unlet s:[k]
        :endfor

Note: Vim9 script ではこれとは違いがある、vim9-scopes を参照。

                                                buffer-variable b:var b:
"b:" で始まる変数名は、カレントバッファに局所的な変数を意味する。このように一
つ一つのバッファ毎に、変数 "b:foo" を別々に使用することができる。この種の変数
はバッファが掃除(wipe out)された時や、":bdelete" で削除された時に一緒に削除さ
れる。

1つのバッファローカル変数が定義済:
                                        b:changedtick changetick
b:changedtick   現在のバッファに対する総変更の回数。変更を行うたびに増加する。
                これには一回のアンドゥ操作もカウントされる。バッファ書き込み時
                に 'modified' をリセットすることもカウントされる。
                この変数はバッファに変更が行われた際にだけアクションを起こした
                い時に利用できる。例:
                    :if my_changedtick != b:changedtick
                    :   let my_changedtick = b:changedtick
                    :   call My_Update()
                    :endif
                b:changedtick 変数を変更したり削除することはできない。

                                                window-variable w:var w:
"w:" で始まる変数名は、カレントウィンドウにローカルな変数を意味する。これはウィ
ンドウを閉じるときに破棄される。

                                                tabpage-variable t:var t:
"t:" で始まる変数名は、カレントタブページにローカルな変数を意味する。これはタ
ブページを閉じるときに破棄される。{+windows 機能つきでコンパイルしたときのみ
利用可能}

                                                global-variable g:var g:
関数の中からグローバル変数へアクセスするには、"g:" を付けた名前を使用する。こ
れが省略された場合は関数ローカルな変数にアクセスする。ただし "g:" 自体は、関数
の外でも使うことができる。

                                                local-variable l:var l:
関数の中からそのローカル変数にアクセスするには何も前置しなければ良い。明示的
に "l:" を付けることも可能である。ただし "l:" をつけないと予約されている変数名
と衝突してしまうことがある。例: "count" とすると "v:count" を参照してしまう。
"l:count" とすればローカル変数countを参照できる。

                                                script-variable s:var
Vim script 内では "s:" で始まる変数名を使うことができる。これはスクリプトに
ついてローカルであり、スクリプトの外部からはアクセスできない。

スクリプト変数は次の場所で使える:
- そのスクリプトをsourceしている間に実行されるコマンド
- そのスクリプト内で定義される関数
- そのスクリプト内で定義される自動コマンド
- そのスクリプト内で定義される関数や自動コマンドで定義される関数や自動コマンド
  (再帰的)
- そのスクリプト内で定義されるユーザー定義コマンド
次の場面では使えない:
- そのスクリプトからsourceされる他のスクリプト
- マッピング
- メニュー
- など。

グローバル変数との衝突を避けるにはスクリプト変数を使う。
次の例を参照:

        let s:counter = 0
        function MyCounter()
          let s:counter = s:counter + 1
          echo s:counter
        endfunction
        command Tick call MyCounter()

ここで他のスクリプトから "Tick" を実行してみると、そのスクリプト内の変数
"s:counter" は変化せず、"Tick" が定義されたスクリプト内の "s:counter" だけが変
化する。

これと同じことをするもう1つの例:

        let s:counter = 0
        command Tick let s:counter = s:counter + 1 | echo s:counter

関数呼び出しやユーザー定義コマンドを実行するとき、スクリプト変数のコンテキスト
はその関数、コマンドが定義されたスクリプトとなる。

関数の中で関数を定義した場合、スクリプト変数も共有される。例:

        let s:counter = 0
        function StartCounting(incr)
          if a:incr
            function MyCounter()
              let s:counter = s:counter + 1
            endfunction
          else
            function MyCounter()
              let s:counter = s:counter - 1
            endfunction
          endif
        endfunction

このStartCounting()を呼ぶと、カウントアップかカウントダウンのどちらかを行う関
数MyCounter()を定義する。StartCounting()がどこで呼ばれたかに関係なく、
MyCounter()の中では変数s:counterにアクセスできる。

同じスクリプトが再度読み込まれた場合、同一のスクリプト変数が使われる。スクリプ
ト変数はVimが終了するまで存続する。以下の例はカウンタを保持する:

        if !exists("s:counter")
          let s:counter = 1
          echo "script executed for the first time"
        else
          let s:counter = s:counter + 1
          echo "script executed " . s:counter . " times now"
        endif

Note これはつまり、ファイルタイププラグインはバッファごとにスクリプト変数を1セッ
ト持つのではないということを意味する。そのような目的にはバッファローカル変数
b:varを使うこと。


Vimの定義済変数                                 vim-variable v:var v:
                                                                E963
一部の変数はユーザーが設定できるが、型を変更することはできない。

                                        v:argv argv-variable
v:argv          Vimの起動に使用したコマンドライン引数。これは文字列のリストで
                ある。最初の項目はVimコマンドである。

                                        v:beval_col beval_col-variable
v:beval_col     マウスポインタがある桁の桁番号。v:beval_lnum行目のバイトイン
                デックスである。オプション 'balloonexpr' を評価している最中の
                み有効。

                                        v:beval_bufnr beval_bufnr-variable
v:beval_bufnr   マウスポインタがあるバッファの番号。オプション 'balloonexpr'
                を評価している最中のみ有効。

                                        v:beval_lnum beval_lnum-variable
v:beval_lnum    マウスポインタがある行の行番号。オプション 'balloonexpr' を
                評価している最中のみ有効。

                                        v:beval_text beval_text-variable
v:beval_text    マウスポインタの下もしくは後ろにあるテキスト。Cプログラムのデ
                バッグのために有用。'iskeyword' が適用されるが、マウスポインタ
                の下より前にあるドットと "->" は含まれる。マウスポインタが ']'
                の上にあるときは、そこから対応する '[' とその前にあるテキスト
                までが含まれる。マウスポインタが1行に収まるビジュアル領域の上
                にあるときはその選択領域となる。<cexpr> も参照。
                オプション 'balloonexpr' を評価している最中のみ有効。

                                        v:beval_winnr beval_winnr-variable
v:beval_winnr   マウスポインタがあるウィンドウの番号。オプション 'balloonexpr'
                を評価している最中のみ有効。1番目のウィンドウの番号はゼロであ
                る(他の場所でのウィンドウ番号と異なっている)。

                                        v:beval_winid beval_winid-variable
v:beval_winid   マウスポインタがあるウィンドウのウィンドウID window-ID
                それ以外は v:beval_winnr と同様。

                                        v:char char-variable
v:char          'formatexpr' を評価しているときの引数。また、短縮入力
                :map-<expr> で <expr> を指定しているとき、タイプされた文字を
                保持する。
                これは InsertCharPre と InsertEnter イベントでも使われる。

                        v:charconvert_from charconvert_from-variable
v:charconvert_from
                変換しようとしているファイルの文字エンコーディング名。オプショ
                ン 'charconvert' を評価している最中のみ有効。

                        v:charconvert_to charconvert_to-variable
v:charconvert_to
                変換後のファイルの文字エンコーディング名。オプション
                'charconvert' を評価している最中のみ有効。

                                        v:cmdarg cmdarg-variable
v:cmdarg        2つの目的のために使われる:
                1. ファイルの読み書きコマンドに与えられる余分な引数。現在のと
                   ころ "++enc=" と "++ff=" がそれである。読み書きコマンドに対
                   する自動コマンドイベントが発生する前にこの変数が代入される。
                   その読み書きコマンドの後に直接この変数を連結できるように、
                   先頭にスペースがついている。Note: ここには "+cmd" 引数は含
                   まれていない。どちらにしろそれは実行されるからである。
                2. ":hardcopy" でPostScriptファイルを印刷するとき、これが
                   ":hardcopy" への引数になる。'printexpr' の中で使うことがで
                   きる。

                                        v:cmdbang cmdbang-variable
v:cmdbang       v:cmdargと同じく読み書きコマンドを実行したとき設定される。読み
                書きコマンドに "!" が使われたときは1となり、使われていなければ
                0となる。Note 自動コマンドの中でのみ利用可能なことに注意。
                ユーザー定義コマンドでは<bang>を使えば同じことができる。
                                                v:collate collate-variable
v:collate       現在のロケール設定での実行環境の照合順序。これは Vim script が
                現在のロケールのエンコーディングを検知するのを許可する。技術的
                説明: LC_COLLATE の値となる。ロケールを使用していない時の値は
                "C" となる。この変数は直接は設定できなく、:language コマンド
                を使う。
                multi-lang を参照。

                                v:completed_item completed_item-variable
v:completed_item
                最も最近補完された単語が含まれたcomplete-itemsDictionary
                がCompleteDoneイベント後に設定される。補完に失敗した時、その
                Dictionaryは空である。

                                        v:count count-variable
v:count         最後に実行されたノーマルモードコマンドに渡されたカウント数。
                マッピングの前のカウントを取得するのに使用できる。読出し専用。
                使用例:
        :map _x :<C-U>echo "the count is " . v:count<CR>
                Note<C-U>は、カウントの後に ':' をタイプした時に示される行範
                囲指定を削除するために必要となる。
                "3d2w" のようにカウントが2個指定された場合、その数が掛けられる。
                よって "d6w" となる。
                オプション 'formatexpr' を評価するためにも使われる。
                scriptversion が 3以降でなければ、"count" も、以前の版のVim
                との互換性の為に動作する。

                                        v:count1 count1-variable
v:count1        "v:count" と同じだが、カウントが指定されなかった時の既定値が 1
                となる。

                                                v:ctype ctype-variable
v:ctype         文字に関する実行環境の現在のロケール設定。これを使えばVim
                script内で現在のロケール設定に対応できるようになる。技術的な詳
                細: LC_CTYPEに等しい。ロケールを使用していないときは "C"になる。
                この変数を設定するには:languageコマンドを使うこと。直接設定
                することはできない。
                multi-langを参照。

                                        v:dying dying-variable
v:dying         通常時は0。致命的なシグナルを受信したとき1が代入される。複数
                のシグナルを受信すると値が増加していく。自動コマンド内でVimが
                正常に終了するかチェックするために使える。{Unix でのみ動作}
                例:
        :au VimLeave * if v:dying | echo "\nAAAAaaaarrrggghhhh!!!\n" | endif

                Note: v:dying が 1 のときに別の致命的なシグナルを受信した場合
                は VimLeave 自動コマンドは実行されない。

                                        v:exiting exiting-variable
v:exiting       Vim の終了コード。通常は0、何か問題があった時は非0。
                VimLeavePre と VimLeave の自動コマンドが実行される前は値が
                v:null。:q:x:cquit を参照。
                例:
                        :au VimLeave * echo "Exit value is " .. v:exiting

                                        v:echospace echospace-variable
v:echospace     hit-enter-prompt を引き起こす前の最後の画面行の :echo メッ
                セージに使用できる画面セルの数。'showcmd''ruler' および
                'columns' に依存する。最後の行の上に全幅の行があるかどうかを
                'cmdheight' で確認する必要がある。

                                        v:errmsg errmsg-variable
v:errmsg        最後に表示されたエラーメッセージ。この変数は代入することが許
                されている。例:
        :let errmsg = ""
        :next
        :if (errmsg != "")
        :  ...
                scriptversion が 3以降でなければ、"errmsg" も、以前の版のVim
                との互換性の為に動作する。

                                v:errors errors-variable assert-return
v:errors        assert_true()のような、テスト用関数によって見つかったエラー。
                これは文字列のリストである。
                テスト用関数はテストに失敗した時にエラーを末尾に追加する。
                戻り値が示すもの: 要素が v:errors に追加された場合 1 が返る。
                それ以外では 0 が返る。
                古い結果を削除する方法はこの変数を空にする:
        :let v:errors = []
                たとえv:errors にリスト以外のいかなる値をセットしたとしても、
                (次に実行される時に)テスト用関数によって空のリストが設定(上書
                き)される。

                                        v:event event-variable
v:event         現在の autocommand に関する情報を含む辞書。辞書に何が入るか
                は個々のイベントを参照。
                この辞書は autocommand が終了したときに空にされる。独立した
                コピーの取得方法については dict-identity を参照。イベントト
                リガー後の情報を保持したいのであれば deepcopy() を使うこと。
                例:
                        au TextYankPost * let g:foo = deepcopy(v:event)

                                        v:exception exception-variable
v:exception     最も直近に捕捉され、まだ終了していない例外の値。
                v:throwpointthrow-variablesを参照。
                例:
        :try
        :  throw "oops"
        :catch /.*/
        :  echo "caught " .. v:exception
        :endtry
                出力: "caught oops".

                                        v:false false-variable
v:false         数値0。JSONでは "false" として使われる。json_encode()を参照。
                文字列として使われた時、これは "v:false" として評価される。
                        echo v:false
                        v:false
                これは eval() がその文字列をパースしたときに、元の値に戻せるよ
                うにするためである。読出し専用。

                                        v:fcs_reason fcs_reason-variable
v:fcs_reason    FileChangedShellイベントが発生した理由。自動コマンドの中で何
                をすべきかやv:fcs_choiceに何を代入すべきかを決めるために使う。
                値は次のどれかとなる:
                        deleted         もはやファイルが存在しない
                        conflict        ファイルの内容、モード、タイムスタンプ
                                        が変化しており、バッファが変更されてい
                                        る状態。
                        changed         ファイルの内容が変化している
                        mode            ファイルのモードが変化している
                        time            タイムスタンプだけが変化している

                                        v:fcs_choice fcs_choice-variable
v:fcs_choice    FileChangedShellイベントが発生した後に何をすべきかを表す。
                自動コマンドの中で、そのバッファに対して何をすべきかを指示する
                ために使う。
                        reload          バッファを読み直す(バッファが削除され
                                        ている場合には効果がない)。
                        ask             何をすべきかをユーザーに問い合わせる。
                                        これはこの自動コマンドがない場合と同じ
                                        である。ただしタイムスタンプだけが変化
                                        しているときは何もしない。
                        <empty>         何もしない。自動コマンドの中だけで必要
                                        なことは全て行ってしまっているという場
                                        合にこの値を代入する。
                既定値は<empty>。これら以外の(無効な)値が代入されたときは空の
                ときと同じ動作になり、警告メッセージは表示されない。

                                        v:fname fname-variable
v:fname         'includeexpr' の評価中: 検知したファイル名。それ以外のときは空。

                                        v:fname_in fname_in-variable
v:fname_in      入力ファイルの名前。以下のオプションを評価している最中のみ
                有効:
                        オプション      このファイル名の意味
                        'charconvert'   変換するファイル
                        'diffexpr'      元のファイル
                        'patchexpr'     元のファイル
                        'printexpr'     印刷するファイル
                また、自動コマンドイベントSwapExistsが発生したときスワップ
                ファイル名が代入される。

                                        v:fname_out fname_out-variable
v:fname_out     出力ファイルの名前。以下のオプションを評価している最中のみ
                有効:
                        オプション      このファイル名の意味
                        'charconvert'   変換した結果のファイル (*)
                        'diffexpr'      diffの出力
                        'patchexpr'     パッチを当てた結果のファイル
                (*) 書き込みコマンド(":w file" など)を実行する際の変換では
                v:fname_inと同じになる。読み込みコマンド(":e file" など)を実行
                する際の変換では一時ファイル名になり、v:fname_inと異なる。

                                        v:fname_new fname_new-variable
v:fname_new     新しい方のファイル名。'diffexpr' を評価している最中のみ有効。

                                        v:fname_diff fname_diff-variable
v:fname_diff    diff(patch)ファイルの名前。'patchexpr' を評価している最中のみ
                有効。

                                        v:folddashes folddashes-variable
v:folddashes    'foldtext' 用。閉じた折り畳みのレベルを表すダッシュ。
                サンドボックスsandboxの中では読出し専用。fold-foldtext

                                        v:foldlevel foldlevel-variable
v:foldlevel     'foldtext' 用。閉じた折り畳みのレベル。
                サンドボックスsandboxの中では読出し専用。fold-foldtext

                                        v:foldend foldend-variable
v:foldend       'foldtext' 用。閉じた折り畳みの最後の行。
                サンドボックスsandboxの中では読出し専用。fold-foldtext

                                        v:foldstart foldstart-variable
v:foldstart     'foldtext' 用。閉じた折り畳みの最初の行。
                サンドボックスsandboxの中では読出し専用。fold-foldtext

                                        v:hlsearch hlsearch-variable
v:hlsearch      検索による強調表示がオンになっているかどうかを示す変数。
                設定は +extra_search 機能が必要な 'hlsearch' が有効になって
                いる時のみ意味をなす。この変数を0に設定することは、
                :nohlsearchコマンドを実行することと同様に働き、1に設定するこ
                とは以下と同様に働く
                        let &hlsearch = &hlsearch
                関数から戻ったときに値が復元されることに注意すること。
                function-search-undo

                                        v:insertmode insertmode-variable
v:insertmode    自動コマンドイベントInsertEnterInsertChange用。
                値は次のどれか:
                        i       挿入モード
                        r       置換モード
                        v       仮想置換モード

                                                v:key key-variable
v:key           辞書Dictionaryの現在の要素のキー。map()filter()で使わ
                れる式を評価している最中のみ有効。
                読出し専用。

                                                v:lang lang-variable
v:lang          メッセージに関する実行環境の現在のロケール設定。これを使えば
                Vim script内で現在のロケール設定に対応できるようになる。
                技術的な詳細: LC_MESSAGESに等しい。この値はシステムに依存する。
                この変数を設定するには:languageコマンドを使うこと。直接設定
                することはできない。
                文字エンコーディングに使うのと違う言語でメッセージを表示させた
                い場合はv:ctypeと異なる値でもよい。multi-langを参照。

                                                v:lc_time lc_time-variable
v:lc_time       時刻のメッセージに関する実行環境の現在のロケール設定。これを使
                えばVim script内で現在のロケール設定に対応できるようになる。
                技術的な詳細: LC_TIMEに等しい。この値はシステムに依存する。こ
                の変数を設定するには:languageコマンドを使うこと。直接設定す
                ることはできない。

                                                v:lnum lnum-variable
v:lnum          'foldexpr' fold-expr と 'indentexpr' に使うための行番号。ま
                た 'guitablabel' と 'guitabtooltip' の文脈ではタブページ番号に
                なる。これらの式のどれかを評価しているときのみ有効。サンドボッ
                クス sandbox の中では読出し専用。

                                        v:mouse_win mouse_win-variable
v:mouse_win     getchar()でマウスクリックイベントが発生したときのウィンドウ
                番号。winnr()と同じく番号は1から始まる。マウスがクリックされ
                なかったときは0となる。

                                        v:mouse_winid mouse_winid-variable
v:mouse_winid   getchar()でマウスクリックイベントが発生したときのウィンドウ
                ID。マウスがクリックされていないときは0になる。

                                        v:mouse_lnum mouse_lnum-variable
v:mouse_lnum    getchar()でマウスクリックイベントが発生したときの行番号。物
                理行ではなく論理行。マウスがクリックされていないときは0となる。

                                        v:mouse_col mouse_col-variable
v:mouse_col     getchar()でマウスクリックイベントが発生したときの桁番号。
                virtcol()と同じく画面上の桁番号。マウスがクリックされていな
                いときは0となる。

                                        v:none none-variable None
v:none          空の文字列。JSONでは空の要素として使われる。
                json_encode()を参照。
                これは関数の引数のデフォルト値に使うこともできる、
                none-function_argument を参照。
                数値として使われた時、これは 0 として評価される。
                文字列として使われた時、これは "v:none" として評価される。
                        echo v:none
                        v:none
                これは eval() がその文字列をパースしたときに、元の値に戻せるよ
                うにするためである。読出し専用。

                                        v:null null-variable
v:null          空の文字列。JSONでは "null" として使われる。json_encode()
                参照。数値として使われた時、これは 0 として評価される。
                文字列として使われた時、これは "v:null" として評価される。
                        echo v:null
                        v:null
                これは eval() がその文字列をパースしたときに、元の値に戻せるよ
                うにするためである。読出し専用。

                                        v:numbermax numbermax-variable
v:numbermax     数値の最大値。

                                        v:numbermin numbermin-variable
v:numbermin     数値の最小値(負数)。

                                        v:numbersize numbersize-variable
v:numbersize    数値のビット数。これは通常64で、システムによっては32になること
                がある。

                                        v:oldfiles oldfiles-variable
v:oldfiles      起動時に viminfo から読み込まれたファイルの名前のリスト。
                これらはマークを記憶しているファイルである。リストの長さの上限
                はオプション 'viminfo' の引数 ' によって決まる(既定では 100)。
                viminfo ファイルが使われていない時、リストは空となる。
                :oldfiles と c_#< を参照。
                このリストは変更可能であるが、後で viminfo ファイルに書き込ま
                れるものには影響しない。文字列以外の値を使うと問題を引き起こす
                だろう。
                {+viminfo 機能つきでコンパイルされたときのみ有効}

                                                    v:option_new
v:option_new    オプションに設定された新しい値。自動コマンド OptionSet を実
                行している間のみ有効。
                                                    v:option_old
v:option_old    オプションの以前の値。自動コマンド OptionSet を実行している
                間のみ有効。設定に使用されたコマンドおよびオプションの種類に
                よって、ローカルの以前の値またはグローバルの以前の値のどちらか
                になる。
                                                    v:option_oldlocal
v:option_oldlocal
                オプションの以前のローカル値。OptionSet 自動コマンドの実行中
                に有効である。
                                                    v:option_oldglobal
v:option_oldglobal
                オプションの以前のグローバル値。OptionSet 自動コマンドの実行
                中に有効である。
                                                    v:option_type
v:option_type   set コマンドのスコープ。自動コマンド OptionSet を実行している
                間のみ有効。"global" もしくは "local" のどちらかとなる。
                                                    v:option_command
v:option_command
                オプションを設定するために使われたコマンド。OptionSet 自動コ
                マンドの実行中に有効である。
                        値              オプションは以下によって設定された
                        "setlocal"      :setlocal または ":let l:xxx"
                        "setglobal"     :setglobal または ":let g:xxx"
                        "set"           :set または :let
                        "modeline"      modeline
                                        v:operator operator-variable
v:operator      ノーマルモードにおいて最後に実行したオペレータコマンド。基本的
                に1文字である。例外は <g> や <z> で始まるコマンドで、その場合
                は2文字になる。v:prevcount と v:register と組み合わせて使う
                とよい。オペレータ待機モードをキャンセルして、それからオペレー
                タを使いたいときに便利である。例:
                        :omap O <Esc>:call MyMotion(v:operator)<CR>
                この値は他のオペレータが入力されるまでセットされてい
                る。よって空になると期待してはいけない。
                :delete:yank などの Ex コマンドに対しては v:operator は
                セットされない。
                読出し専用。

                                        v:prevcount prevcount-variable
v:prevcount     最後の1つ前のノーマルモードコマンドに与えられたカウントの値。
                前のコマンドのv:countの値である。ビジュアルモードやオペレータ
                待機モードをキャンセルし、その後にカウントを使う場合に便利であ
                る。例:
                        :vmap % <Esc>:call MyFilter(v:prevcount)<CR>
                読出し専用。

                                        v:profiling profiling-variable
v:profiling     通常時は0。":profile start" を実行すると1が代入される。
                profilingを参照。

                                        v:progname progname-variable
v:progname      Vimを起動したときのプログラム名(パスは除かれる)。view
                evim などの名前やシンボリックリンクなどで起動した場合に特別な
                初期化を行うのに便利。
                読出し専用。

                                        v:progpath progpath-variable
v:progpath      Vim を起動したときのコマンド (パスを含む)。--remote-expr で
                Vim サーバーにメッセージを送信するときに便利。
                Vimが呼び出されたときのコマンドが含まれている。シェルに渡され
                ると、現在のVimと同じVim実行可能ファイルが実行される($PATHが変
                更されない場合)。 --remote-expr を使用してVimサーバーにメッ
                セージを送信する場合に便利である。
                フルパスを得るには:
                        echo exepath(v:progpath)
                コマンドが相対パスの場合、フルパスに展開されるため、:cd の後
                でも機能する。したがって、"./vim" を開始すると
                "/home/user/path/to/vim/src/vim" という結果になる。
                Linuxおよびその他のシステムでは、常にフルパスになる。Macでは単
                に "vim" であり、前述の exepath() を使用してフルパスを取得する
                必要がある。
                MS-Windows では実行ファイルが "vim.exe" として呼び出されるかも
                しれないが、".exe" は v:progpath には追加されない。
                読出し専用。

                                        v:register register-variable
v:register      現在のノーマルモードコマンドに適用されるレジスタの名前 (そのコ
                マンドが実際にレジスタを使うかどうかには依らない)。または、現
                在実行しているノーマルモードマッピング用のレジスタの名前 (レジ
                スタを使うカスタムコマンドの中で使う)。レジスタが指定されなかっ
                たときはデフォルトレジスタ '"' になる。'clipboard' に
                "unnamed" か "unnamedplus" が含まれているときはデフォルトはそ
                れぞれ '*' か '+' になる。
                getreg() と setreg() も参照。

                                        v:scrollstart scrollstart-variable
v:scrollstart   画面のスクロールの原因となったスクリプトや関数を説明する
                文字列。空であるときのみ代入される。よってこの変数には最初の原
                因だけが記録されている。原因がキーボードから入力されたコマンド
                の場合は "Unknown" {訳注: 日本語メッセージの場合: "不明"} が代
                入される。
                スクリプトを実行したとき現れたhit-enterプロンプトの原因を探る
                ために便利。

                                        v:servername servername-variable
v:servername    client-server-name で登録された結果。
                読出し専用。


v:searchforward                 v:searchforward searchforward-variable
                検索方向: 前方検索の後なら1、後方検索の後なら0。quote/ で示す
                方法によって最終検索パターンを直接セットしたときは1(前方検索)
                にリセットされる。
                関数から戻るとき、この値は呼び出し前の値に復元される。
                function-search-undo
                読み書き両用。

                                        v:shell_error shell_error-variable
v:shell_error   最後に実行したシェルコマンドの結果。シェルコマンドの実行時に何
                かエラーがあったならば、非零の値を取る。問題がなければ零になる。
                これはシェルがエラーコードをVimに通知する時のみ働く。コマンドが
                実行されなかった時には、値として-1が良く使われる。読出し専用。
                例:
        :!mv foo bar
        :if v:shell_error
        :  echo 'could not rename "foo" to "bar"!'
        :endif
                scriptversion が 3以降でなければ、"shell_error" も、以前の版
                のVimとの互換性の為に動作する。

                                        v:statusmsg statusmsg-variable
v:statusmsg     最後に表示されたステータスメッセージ。この変数は代入すること
                が許されている。

                                        v:swapname swapname-variable
v:swapname      自動コマンドSwapExistsを実行している最中のみ有効。見つかった
                スワップファイルの名前。読出し専用。

                                        v:swapchoice swapchoice-variable
v:swapchoice    イベントSwapExistsにより実行された自動コマンドが、見つかった
                スワップファイルをどう処理するかをこの変数に代入する。
                        'o'     読込専用で開く
                        'e'     とにかく編集する
                        'r'     復活させる
                        'd'     スワップファイルを削除する
                        'q'     終了する
                        'a'     中止する
                この変数の値は1文字の文字列でなければならない。値が空のときは
                自動コマンドSwapExistsが存在しないときと同じようにユーザーに問
                い合わせる。既定値は空。

                                        v:swapcommand swapcommand-variable
v:swapcommand   ファイルを開いた後に実行するノーマルモードコマンド。自動コマン
                ドSwapExistsで、他のVimインスタンスにファイルを開かせ、指定
                位置までジャンプするために使うことができる。例えば、あるタグへ
                ジャンプするには、この変数に":tag tagname\r" という値を代入す
                る。":edit +cmd file" を実行させるには":cmd\r" を代入する。

                                v:t_TYPE v:t_bool t_bool-variable
v:t_bool        真偽値 Boolean 型の値。読出し専用。 参照: type()
                                        v:t_channel t_channel-variable
v:t_channel     チャネル Channel 型の値。読出し専用。 参照: type()
                                        v:t_dict t_dict-variable
v:t_dict        辞書 Dictionary 型の値。読出し専用。 参照: type()
                                        v:t_float t_float-variable
v:t_float       浮動小数点数 Float 型の値。読出し専用。 参照: type()
                                        v:t_func t_func-variable
v:t_func        Funcref 型の値。読出し専用。 参照: type()
                                        v:t_job t_job-variable
v:t_job         ジョブ Job 型の値。読出し専用。 参照: type()
                                        v:t_list t_list-variable
v:t_list        リスト List 型の値。読出し専用。 参照: type()
                                        v:t_none t_none-variable
v:t_none        特殊値 None 型の値。読出し専用。 参照: type()
                                        v:t_number t_number-variable
v:t_number      数値 Number 型の値。読出し専用。 参照: type()
                                        v:t_string t_string-variable
v:t_string      文字列 String 型の値。読出し専用。 参照: type()
                                        v:t_blob t_blob-variable
v:t_blob        Blob 型の値。読出し専用。 参照: type()

                                v:termresponse termresponse-variable
v:termresponse  termcapのエントリt_RVで端末から返されるエスケープシーケンス。
                ESC [ または CSI で始まり、次に '>' または '?' が来て、途中数
                字と ';' だけから構成され 'c' で終わるエスケープシーケンスを受
                け取ったとき代入される。このオプションがセットされると自動コマ
                ンドイベントTermResponseが発生し、端末からの応答に反応すること
                ができる。
                terminalprops() を使うことで Vim が端末をどのように認識した
                かを知ることができる。
                新しいxtermからの応答は次の形式である:
                 "<Esc>[> Pp ; Pv ; Pc c"。ここでPpは端末のタイプ: 0ならvt100、
                 1ならvt220。Pvはパッチレベル(パッチ95で導入されたため常に95以
                 上)。Pcは常に0。
                {Vimが+termresponse機能付きでコンパイルされたときのみ有効}

                                                v:termblinkresp
v:termblinkresp termcapのエントリ t_RC で端末から返されるエスケープシーケン
                ス。端末カーソルが点滅しているかを調べるために使用される。
                term_getcursor() で使用される。

                                                v:termstyleresp
v:termstyleresp termcapのエントリ t_RS で端末から返されるエスケープシーケン
                ス。カーソルの形状を調べるために使用される。term_getcursor()
                で使用される。

                                                v:termrbgresp
v:termrbgresp   termcapのエントリ t_RS で端末から返されるエスケープシーケン
                ス。端末の背景色を調べるために使用される。'background' を参照。

                                                v:termrfgresp
v:termrfgresp   termcapのエントリ t_RF で端末から返されるエスケープシーケン
                ス。端末の文字色を調べるために使用される。

                                                v:termu7resp
v:termu7resp    termcapのエントリ t_u7 で端末から返されるエスケープシーケン
                ス。曖昧な幅の文字に対して端末が何をするか調べるのに使われる。
                'ambiwidth' を参照。

                                        v:testing testing-variable
v:testing       test_garbagecollect_now() を使う前に設定する必要がある。
                また、これが設定されていると、特定のエラーメッセージが 2 秒間
                表示されなくなる。(例: "'dictionary' option is empty")

                                v:this_session this_session-variable
v:this_session  最後にロードされたか、セーブされたセッションファイルの完全な
                ファイル名。:mksessionを参照。この変数は代入することが許さ
                れている。それ以前にセーブされたセッションがなければ、この変数
                は空となる。
                scriptversion が 3以降でなければ、"this_session" も、以前の
                版のVimとの互換性の為に動作する。

                                        v:throwpoint throwpoint-variable
v:throwpoint    最も直近に捕捉されてまだ終了していない例外が発生した位置。キー
                ボードから入力されたコマンドは記録されていない。v:exception
                とthrow-variablesも参照。
                例:
        :try
        :  throw "oops"
        :catch /.*/
        :  echo "Exception from" v:throwpoint
        :endtry
                出力: "Exception from test.vim, line 2"

                                                v:true true-variable
v:true          数値1。JSONでは "true" として使われる。json_encode()を参照。
                文字列として使われた時、これは "v:true" として評価される。
                        echo v:true
                        v:true
                これは eval() がその文字列をパースしたときに、元の値に戻せるよ
                うにするためである。読出し専用。
                                                v:val val-variable
v:val           リストListもしくは辞書Dictionaryの現在の要素の値。map()
                とfilter()で使われる式を評価している最中のみ有効。読出し専
                用。

                                        v:version version-variable
v:version       Vimのバージョン番号。メジャーバージョン番号は100倍され、マイ
                ナーバージョン番号と足されている。Version 5.0は500。Version
                5.1は501となる。読出し専用。scriptversion が 3以降でなけれ
                ば、"version" も、以前の版のVimとの互換性の為に動作する。
                特定のパッチが適用されているかを調べるにはhas()を使う。例:
                        if has("patch-7.4.123")
                Note 5.0と5.1には両方ともパッチ123が存在しているが、バージョン
                が違えば番号は同じでもパッチの内容は全く異なっている。

                                        v:versionlong versionlong-variable
v:versionlong   v:versionと同じだが、最後の4桁にパッチレベルも含む。パッチ 123
                を適用したバージョン 8.1 の値は 8010123 である。これは次のよう
                に使用できる:
                        if v:versionlong >= 8010123
                ただし、含まれているパッチのリストに隙間がある場合は、うまくい
                かない。これは、最近のパッチが古いバージョンに含まれていた場合
                に起こる。例えば、セキュリティ修正のため。
                パッチが実際に含まれていることを確認するためには has() 関数を
                使用すること。

                                v:vim_did_enter vim_did_enter-variable
v:vim_did_enter ほとんどのスタートアップが完了するまでの間 0。VimEnter 自動
                コマンドが実行される直前に 1 にセットされる。

                                        v:warningmsg warningmsg-variable
v:warningmsg    最後に表示された警告メッセージ。この変数は代入することが許され
                ている。

                                        v:windowid windowid-variable
v:windowid      X11 ベースの GUI を使っているとき、もしくは端末の Vim を使って
                いて X サーバーに接続しているとき (-X) は、ウィンドウ ID が
                セットされる。
                MS-Windows の GUI を使っているときはウィンドウハンドルがセット
                される。
                それ以外では値はゼロである。
                Note: Vim の中のウィンドウを扱うときは winnr() または
                win_getid() を使う。window-ID を参照。

==============================================================================
4. 組み込み関数                                         functions

機能別に分類された一覧は function-list を参照のこと。

(関数名の上でCTRL-]を使うことで、詳細な説明へ飛ぶことができる。)

使用法                          結果    説明

abs({expr})                     浮動小数点数または数値  {expr}の絶対値
acos({expr})                    浮動小数点数    {expr}のアークコサイン
add({list}{item})             リスト  {item}をリスト{list}に追加する
add({object}{item})           リスト/Blob     {item}{object}に追加する
and({expr}{expr})             数値    ビット論理積
append({lnum}{text})          数値    {lnum}行目に{text}を付け加える
appendbufline({expr}{lnum}{text})
                                数値    バッファ{expr}{lnum}行目に{text}を付
                                        け加える
argc([{winid}])                 数値    引数内のファイルの数
argidx()                        数値    引数リスト内の現在のインデックス
arglistid([{winnr} [, {tabnr}]])
                                数値    引数リストID
argv({nr} [, {winid}])          文字列  引数の第{nr}番目
argv([-1, {winid}])             リスト  引数リスト
asin({expr})                    浮動小数点数    {expr}のアークサイン
assert_beeps({cmd})             数値    {cmd} がビープ音を鳴らすことをテストす
                                        る
assert_equal({exp}{act} [, {msg}])
                                数値    {exp}{act}が等しいかどうかテストする
assert_equalfile({fname-one}{fname-two} [, {msg}])
                                数値    ファイルの内容が等しいことをテストする
assert_exception({error} [, {msg}])
                                数値    v:exception{error}であるかテストする
assert_fails({cmd} [, {error} [, {msg} [, {lnum} [, {context}]]]])
                                数値    {cmd}が失敗するかどうかテストする
assert_false({actual} [, {msg}])
                                数値    {actual}がfalseかどうかテストする
assert_inrange({lower}{upper}{actual} [, {msg}])
                                数値    {actual}が範囲内にあるかテストする
assert_match({pat}{text} [, {msg}])    数値  {pat}{text}にマッチするかテス
                                        トする
assert_nobeep({cmd})            数値    {cmd} がビープ音を鳴らさないことをテス
                                        トする
assert_notequal({exp}{act} [, {msg}])  数値  {exp}{act}と等しくないことを
                                        テストする
assert_notmatch({pat}{text} [, {msg}]) 数値  {pat}{text}とマッチしないこと
                                        をテストする
assert_report({msg})            数値    テストの失敗を報告する
assert_true({actual} [, {msg}])
                                数値    {actual}がtrueかどうかテストする
atan({expr})                    浮動小数点数    {expr}のアークタンジェント
atan2({expr}{expr})           浮動小数点数    {expr1} / {expr2} のアークタン
                                                ジェント
balloon_gettext()               文字列  バルーン内のカレントテキストを得る
balloon_show({expr})            なし    {expr} をバルーン内に表示
balloon_split({msg})            リスト  {msg} をバルーンで使われるように分割す
                                        る
browse({save}{title}{initdir}{default})
                                文字列  ファイル選択ダイアログを表示
browsedir({title}{initdir})   文字列  ディレクトリ選択ダイアログを表示
bufadd({name})                  数値    バッファリストにバッファを追加する
bufexists({expr})               数値    バッファ{expr}が存在すればTRUE
buflisted({expr})               数値    バッファ{expr}がリストにあるならTRUE
bufload({expr})                 数値    まだバッファ{expr}がロードされていなけ
                                        ればバッファをロードする
bufloaded({expr})               数値    バッファ{expr}がロード済みならTRUE
bufname([{expr}])               文字列  バッファ{expr}の名前
bufnr([{expr} [, {create}]])    数値    バッファ{expr}の番号
bufwinid({expr})                数値    バッファ{expr}のウィンドウID
bufwinnr({nr})                  数値    バッファ{nr}のウィンドウ番号
byte2line({byte})               数値    {byte}番目のバイトの行番号
byteidx({expr}{nr})           数値    {expr}{nr}文字目のバイトインデックス
byteidxcomp({expr}{nr})       数値    {expr}{nr}文字目のバイトインデックス
call({func}{arglist} [, {dict}])
                                任意    引数{arglist}をつけて{func}を呼ぶ
ceil({expr})                    浮動小数点数    {expr} を切り上げる
ch_canread({handle})            数値    何か読むものがあるかをチェックする
ch_close({handle})              なし    {handle} を閉じる
ch_close_in({handle})           なし    {handle} の入力を閉じる
ch_evalexpr({handle}{expr} [, {options}])
                                任意    {handle} に {expr} を送り応答をJSONと
                                        して評価する
ch_evalraw({handle}{string} [, {options}])
                                任意    {handle} に {string} を送り応答を生の
                                        文字列として評価する
ch_getbufnr({handle}{what})   数値    {handle}/{what} に割り当てられたバッ
                                        ファ番号を得る
ch_getjob({channel})            ジョブ  {channel} の Job を得る
ch_info({handle})               文字列  チャネル {handle} に関する情報を得る
ch_log({msg} [, {handle}])      なし    チャネルのログファイルに {msg} を書き
                                        込む
ch_logfile({fname} [, {mode}])  なし    チャネルの挙動ログ出力を開始する
ch_open({address} [, {options}])
                                チャネル        {address} へのチャネルを開く
ch_read({handle} [, {options}]) 文字列  {handle} から読み込む
ch_readblob({handle} [, {options}])
                                Blob    {handle} からBlobを読み込む
ch_readraw({handle} [, {options}])
                                文字列  {handle} から生の文字列を読み込む
ch_sendexpr({handle}{expr} [, {options}])
                                任意    {expr}をJSONチャネル{handle}に送る
ch_sendraw({handle}{expr} [, {options}])
                                任意    {expr}をrawチャネル{handle}に送る
ch_setoptions({handle}{options})
                                なし    {handle}にオプションを設定する
ch_status({handle} [, {options}])
                                文字列  チャネル{handle}の状態
changenr()                      数値    現在の変更番号
char2nr({expr} [, {utf8}])      数値    {expr}の先頭文字のASCII/UTF8コード
charclass({string})             数値    {string} の文字クラス
charcol({expr})                 数値    カーソルかマークのカラム番号
charidx({string}{idx} [, {countcc}])
                                数値    {string} のバイト {idx} の文字のイン
                                        デックス
chdir({dir})                    文字列  現在の作業ディレクトリを変更する
cindent({lnum})                 数値    {lnum}行目のCインデント量
clearmatches([{win}])           なし    全マッチをクリアする
col({expr})                     数値    カーソルかマークのカラムバイトインデッ
                                        クス
complete({startcol}{matches}) なし    挿入モード補完を設定する
complete_add({expr})            数値    補完候補を追加する
complete_check()                数値    補完中に押されたキーをチェックする
complete_info([{what}])         辞書    現在の補完情報を取得
confirm({msg} [, {choices} [, {default} [, {type}]]])
                                数値    ユーザーへの選択肢と番号
copy({expr})                    任意    {expr}の浅いコピーを作る
cos({expr})                     浮動小数点数    {expr} の余弦(コサイン)
cosh({expr})                    浮動小数点数    {expr}のハイパボリックコサイン
count({comp}{expr} [, {ic} [, {start}]])
                                数値     {comp}中に{expr}が何個現れるか数える
cscope_connection([{num} , {dbpath} [, {prepend}]])
                                数値    cscope接続の存在を判定する
cursor({lnum}{col} [, {off}])
                                数値    カーソルを{lnum}{col}{off}へ移動
cursor({list})                  数値    カーソルを{list}の位置へ移動
debugbreak({pid})               数値    デバッグするプロセスへ割り込む
deepcopy({expr} [, {noref}])    任意    {expr}の完全なコピーを作る
delete({fname} [, {flags}])     数値    ファイルやディレクトリ{fname}を消す
deletebufline({expr}{first} [, {last}])
                                数値    バッファ {expr} から行を削除する
did_filetype()                  数値    FileTypeのautocommandが実行されたか?
diff_filler({lnum})             数値    差分モードで{lnum}に挿入された行
diff_hlID({lnum}{col})        数値    差分モードで{lnum}/{col}位置の強調
digraph_get({chars})            文字列  {chars} のダイグラフ digraph を取得
digraph_getlist([{listall}])    リスト  すべてのダイグラフ digraph を取得
digraph_set({chars}{digraph}) 真偽値  ダイグラフ digraph の登録
digraph_setlist({digraphlist})  真偽値  複数のダイグラフ digraph の登録
echoraw({expr})                 なし    {expr} をそのまま出力する
empty({expr})                   数値    {expr}が空ならTRUE
environ()                       辞書    すべての環境変数を返す
escape({string}{chars})       文字列  {string}内の{chars}を '\' でエスケープ
eval({string})                  任意    {string}を評価し、値を得る
eventhandler()                  数値    イベントハンドラの内側ならTRUE
executable({expr})              数値    実行可能な{expr}が存在するなら1
execute({command})              文字列  {command}を実行し、出力を得る
exepath({expr})                 文字列  コマンド {expr} のフルパス
exists({var})                   数値    変数{var}が存在したらTRUE
exp({expr})                     浮動小数点数    {expr}の指数
expand({expr} [, {nosuf} [, {list}]])
                                任意    {expr}内の特別なキーワードを展開
expandcmd({expr})               文字列  :edit のように{expr}を展開
extend({expr1}{expr2} [, {expr3}])
                                リスト/辞書 {expr1}{expr2}を要素として挿入
extendnew({expr1}{expr2} [, {expr3}])
                                リスト/辞書 extend() と同じだが新しいリスト/
                                辞書を作る
feedkeys({string} [, {mode}])   数値    先行入力バッファにキーシーケンスを追加
filereadable({file})            数値    {file}が読み込み可能ならTRUE
filewritable({file})            数値    {file}が書き込み可能ならTRUE
filter({expr1}{expr2})        リスト/辞書  {expr2}が0となる要素を{expr1}から
                                        とり除く
finddir({name} [, {path} [, {count}]])
                                文字列  {path}からディレクトリ{name}を探す
findfile({name} [, {path} [, {count}]])
                                文字列  {path}からファイル{name}を探す
flatten({list} [, {maxdepth}])  リスト  リスト {list} を {maxdepth} の深さまで
                                        平坦化する
flattennew({list} [, {maxdepth}])
                                リスト  {list} のコピーを平坦化する
float2nr({expr})                数値    浮動小数点数 {expr} を数値に変換する
floor({expr})                   浮動小数点数    {expr} を切り捨てる
fmod({expr1}{expr2})          浮動小数点数    {expr1} / {expr2} の余り
fnameescape({fname})            文字列  {fname} 内の特殊文字をエスケープする
fnamemodify({fname}{mods})    文字列  ファイル名を変更
foldclosed({lnum})              数値    {lnum}の折り畳みの最初の行(閉じている
                                        なら)
foldclosedend({lnum})           数値    {lnum}の折り畳みの最後の行(閉じている
                                        なら)
foldlevel({lnum})               数値    {lnum}の折り畳みレベル
foldtext()                      文字列  閉じた折り畳みに表示されている行
foldtextresult({lnum})          文字列  {lnum}で閉じている折り畳みのテキスト
foreground()                    数値    Vimウィンドウを前面に移動する
fullcommand({name})             文字列  {name} から完全なコマンドを取得
funcref({name} [, {arglist}] [, {dict}])
                                Funcref 関数{name}への参照
function({name} [, {arglist}] [, {dict}])
                                Funcref 名前による関数{name}への参照
garbagecollect([{atexit}])      なし    メモリを解放する。循環参照を断ち切る
get({list}{idx} [, {def}])    任意    {list}{def}から要素{idx}を取得
get({dict}{key} [, {def}])    任意    {dict}{def}から要素{key}を取得
get({func}{what})             任意    funcref/partial {func}のプロパティ取得
getbufinfo([{expr}])            リスト  バッファに関する情報
getbufline({expr}{lnum} [, {end}])
                                リスト  バッファ{expr}{lnum}から{end}行目
getbufvar({expr}{varname} [, {def}])
                                任意    バッファ{expr}の変数 {varname}
getchangelist([{expr}])         リスト  変更リスト要素のリスト
getchar([expr])                 数値/文字列     ユーザーから1文字を取得する
getcharmod()                    数値    修飾キーの状態を表す数値を取得
getcharpos({expr})              リスト  カーソル、マーク、その他のカーソル位置
getcharsearch()                 辞書    最後の文字検索を取得
getcharstr([expr])              文字列  ユーザーから1文字を取得する
getcmdline()                    文字列  現在のコマンドラインを取得
getcmdpos()                     数値    コマンドラインのカーソル位置を取得
getcmdtype()                    文字列  現在のコマンドラインの種類を取得
getcmdwintype()                 文字列  現在のコマンドラインウィンドウの種類
getcompletion({pat}{type} [, {filtered}])
                                リスト  コマンドライン補完にマッチするリスト
getcurpos([{winnr}])            リスト  カーソルの位置
getcursorcharpos([{winnr}])     リスト  カーソルの位置の文字
getcwd([{winnr} [, {tabnr}]])   文字列  現在の作業ディレクトリを取得
getenv({name})                  文字列  環境変数を返す
getfontname([{name}])           文字列  使用しているフォントの名前
getfperm({fname})               文字列  ファイル{fname}の許可属性を取得
getfsize({fname})               数値    ファイル{fname}のバイト数を取得
getftime({fname})               数値    ファイルの最終更新時間
getftype({fname})               文字列  ファイル{fname}の種類の説明
getimstatus()                   数値    IME がアクティブの場合は TRUE
getjumplist([{winnr} [, {tabnr}]])
                                リスト  ジャンプリスト要素のリスト
getline({lnum})                 文字列  現在のバッファから行の内容を取得
getline({lnum}{end})          リスト  カレントバッファの{lnum}から{end}行目
getloclist({nr})                リスト  locationリストの要素のリスト
getloclist({nr}{what})        辞書    指定したlocationリストのプロパティ
getmarklist([{expr}])           リスト  グローバル/ローカルのマークのリスト
getmatches([{win}])             リスト  現在のマッチのリスト
getmousepos()                   辞書    マウスの最新の位置
getpid()                        数値    Vim のプロセス ID
getpos({expr})                  リスト  カーソル・マークなどの位置を取得
getqflist()                     リスト  quickfixリストの要素のリスト
getqflist({what})               辞書    指定したquickfixリストのプロパティ
getreg([{regname} [, 1 [, {list}]]])
                                文字列/リスト   レジスタの中身を取得
getreginfo([{regname}])         辞書    レジスタについての情報
getregtype([{regname}])         文字列  レジスタの種類を取得
gettabinfo([{expr}])            リスト  タブページのリスト
gettabvar({nr}{varname} [, {def}])
                                任意    タブ{nr}の変数{varname}または{def}
gettabwinvar({tabnr}{winnr}{name} [, {def}])
                                任意    タブページ{tabnr}{winnr}{name}
gettagstack([{nr}])             辞書    ウィンドウ{nr}のタグスタックを取得
gettext({text})                 文字列  {text} の翻訳の検索
getwininfo([{winid}])           リスト  各ウィンドウに関する情報のリスト
getwinpos([{timeout}])          リスト  Vim ウィンドウのピクセルでの X および
                                        Y 座標
getwinposx()                    数値    Vim ウィンドウのピクセルでの X 座標
getwinposy()                    数値    Vim ウィンドウのピクセルでの Y 座標
getwinvar({nr}{varname} [, {def}])
                                文字列  ウィンドウ{nr}の変数{varname}
glob({expr} [, {nosuf} [, {list} [, {alllinks}]]])
                                任意    {expr}内のfile wildcardを展開
glob2regpat({expr})             文字列  globパターンを検索パターンに変換
globpath({path}{expr} [, {nosuf} [, {list} [, {alllinks}]]])
                                文字列  {path}の全ディレクトリに対し
                                        glob({expr})を行う
has({feature} [, {check}])      数値    機能{feature}がサポートならばTRUE
has_key({dict}{key})          数値    {dict}が要素{key}を持つならTRUE
haslocaldir([{winnr} [, {tabnr}]])
                                数値    現在のウィンドウで :lcd か :tcd が
                                        実行されたならTRUE
hasmapto({what} [, {mode} [, {abbr}]])
                                数値    {what}のマッピングが存在するならTRUE
histadd({history}{item})      数値    ヒストリに追加
histdel({history} [, {item}])   数値    ヒストリからitemを削除
histget({history} [, {index}])  文字列  ヒストリから{index}アイテムを取得
histnr({history})               数値    ヒストリの数
hlID({name})                    数値    highlight group {name}のID
hlexists({name})                数値    highlight group {name}が存在したらTRUE
hostname()                      文字列  vimが動作しているマシンの名前
iconv({expr}{from}{to})     文字列  {expr}のエンコーディングを変換する
indent({lnum})                  文字列  行{lnum}のインデントを取得
index({object}{expr} [, {start} [, {ic}]])
                                数値    {object}中に{expr}が現れる位置
input({prompt} [, {text} [, {completion}]])
                                文字列  ユーザーからの入力を取得
inputdialog({prompt} [, {text} [, {completion}]])
                                文字列  input()と同様。GUIのダイアログを使用
inputlist({textlist})           数値    ユーザーに選択肢から選ばせる
inputrestore()                  数値    先行入力を復元する
inputsave()                     数値    先行入力を保存し、クリアする
inputsecret({prompt} [, {text}]) 文字列 input()だがテキストを隠す
insert({object}{item} [, {idx}])
                                リスト  {object}に要素{item}を挿入 [{idx}の前]
interrupt()                     なし    スクリプトの実行を中断する
invert({expr})                  数値    ビット反転
isdirectory({directory})        数値    {directory}がディレクトリならばTRUE
isinf({expr})                   数値    {expr}が無限大の値(正または負)かどうか
                                        を判定する
islocked({expr})                数値    {expr}がロックされているならTRUE
isnan({expr})                   数値    {expr}がNaNならばTRUE
items({dict})                   リスト  {dict}のキーと値のペアを取得
job_getchannel({job})           チャネル  {job}のチャネルハンドルを取得
job_info([{job}])               辞書    {job}についての情報を取得
job_setoptions({job}{options}) なし   {job}のオプションを設定する
job_start({command} [, {options}])
                                ジョブ  ジョブを開始する
job_status({job})               文字列  {job}のステータスを取得する
job_stop({job} [, {how}])       数値    {job}を停止する
join({list} [, {sep}])          文字列  {list}の要素を連結して文字列にする
js_decode({string})             任意    JS形式のJSONをデコードする
js_encode({expr})               文字列  JS形式のJSONにエンコードする
json_decode({string})           任意    JSONをデコードする
json_encode({expr})             文字列  JSONにエンコードする
keys({dict})                    リスト  {dict}のキーを取得
len({expr})                     数値    {expr}の長さを取得
libcall({lib}{func}{arg})   文字列  ライブラリ{lib}の関数{func}をコール
libcallnr({lib}{func}{arg}) 数値    上と同じ。ただし数値を返す
line({expr} [, {winid}])        数値    行番号の取得
line2byte({lnum})               数値    行{lnum}のバイトカウント
lispindent({lnum})              数値    {lnum}行目のLispインデント量を取得
list2str({list} [, {utf8}])     文字列  {list}の数値を文字列に変換する
listener_add({callback} [, {buf}])
                                数値    変更を監視するためのコールバックを追加
listener_flush([{buf}])         なし    リスナーコールバックを呼び出す
listener_remove({id})           なし    リスナーコールバックを削除する
localtime()                     数値    現在時刻
log({expr})                     浮動小数点数    {expr}の自然対数(底e)
log10({expr})                   浮動小数点数    浮動小数点数 {expr} の 10 を底
                                                とする対数
luaeval({expr} [, {expr}])      任意    Lua の式を評価する
map({expr1}{expr2})           リスト/辞書  {expr1}の各要素を{expr2}に変える
maparg({name} [, {mode} [, {abbr} [, {dict}]]])
                                文字列/辞書
                                        モード{mode}でのマッピング{name}の値
mapcheck({name} [, {mode} [, {abbr}]])
                                文字列  {name}にマッチするマッピングを確認
mapnew({expr1}{expr2})        リスト/辞書  map() と同様だが新規のリストか
                                             辞書を作る
mapset({mode}{abbr}{dict})  なし    maparg() の結果からマッピングを復元
                                        する
match({expr}{pat} [, {start} [, {count}]])
                                数値    {expr}内で{pat}がマッチする位置
matchadd({group}{pattern} [, {priority} [, {id} [, {dict}]]])
                                数値    {pattern} を {group} で強調表示する
matchaddpos({group}{pos} [, {priority} [, {id} [, {dict}]]])
                                数値    位置を {group} で強調表示する
matcharg({nr})                  リスト  :matchの引数
matchdelete({id} [, {win}])     数値    {id} で指定されるマッチを削除する
matchend({expr}{pat} [, {start} [, {count}]])
                                数値    {expr}内で{pat}が終了する位置
matchfuzzy({list}{str} [, {dict}])
                                リスト  {list} 内について {str} でのファジー
                                        マッチ
matchfuzzypos({list}{str} [, {dict}])
                                リスト  {list} 内について {str} でのファジー
                                        マッチ
matchlist({expr}{pat} [, {start} [, {count}]])
                                リスト  {expr}内の{pat}のマッチと部分マッチ
matchstr({expr}{pat} [, {start} [, {count}]])
                                文字列  {expr}内の{count}番目の{pat}のマッチ
matchstrpos({expr}{pat} [, {start} [, {count}]])
                                リスト  {expr}内の{count}番目の{pat}のマッチ
max({expr})                     数値    {expr}内の要素の最大値
menu_info({name} [, {mode}])    辞書    メニューの項目情報を取得する
min({expr})                     数値    {expr}内の要素の最小値
mkdir({name} [, {path} [, {prot}]])
                                数値    ディレクトリ{name}を作成
mode([expr])                    文字列  現在の編集モード
mzeval({expr})                  任意    MzScheme の式を評価する
nextnonblank({lnum})            数値    {lnum}行目以降で空行でない行の行番号
nr2char({expr} [, {utf8}])      文字列  ASCII/UTF8コード{expr}で示される文字
or({expr}{expr})              数値    ビット論理和
pathshorten({expr} [, {len}])   文字列  path内の短縮したディレクトリ名
perleval({expr})                任意    Perlの式を評価する
popup_atcursor({what}{options}) 数値  カーソルの近くにポップアップウィンドウ
                                        を作成する
popup_beval({what}{options})  数値    'balloon_eval' のポップアップウィンド
                                        ウを作成する
popup_clear()                   なし    すべてのポップアップウィンドウを閉じる
popup_close({id} [, {result}])  なし    {id} のポップアップウィンドウを閉じる
popup_create({id} [, {result}]) 数値    ポップアップウィンドウを作成する
popup_dialog({what}{options}) 数値    ダイアログとしてポップアップウィンドウ
                                        を作成する
popup_filter_menu({id}{key})  数値    ポップアップウィンドウのメニューのフィ
                                        ルター
popup_filter_yesno({id}{key}) 数値    ポップアップウィンドウのダイアログの
                                        フィルター
popup_findinfo()                数値    情報ポップアップウィンドウの window ID
                                        を取得する
popup_findpreview()             数値    プレビューポップアップウィンドウの
                                        window ID を取得する
popup_getoptions({id})          辞書    ポップアップウィンドウ {id} のオプショ
                                        ンを取得する
popup_getpos({id})              辞書    ポップアップウィンドウ {id} の位置を取
                                        得する
popup_hide({id})                なし    ポップアップメニュー {id} を隠す
popup_list()                    リスト  全ポップアップのウィンドウIDのリストを
                                        取得する
popup_locate({row}{col})      数値    指定位置のポップアップのウィンドウIDを
                                        取得する
popup_menu({what}{options})   数値    メニューとして使われるポップアップウィ
                                        ンドウを作成する
popup_move({id}{options})     なし    ポップアップウィンドウ {id} の位置を
                                        セットする
popup_notifications({id}{options})
                                数値    ポップアップウィンドウの通知を作成する
popup_setoptions({id}{options})
                                なし    ポップアップウィンドウ {id} のオプショ
                                        ンを設定する
popup_settext({id}{text})     なし    ポップアップウィンドウ {id} のテキスト
                                        を設定する
popup_show({id})                なし    ポップアップウィンドウ {id} を再表示す
                                        る
pow({x}{y})                   浮動小数点数    {x} の {y} 乗
prevnonblank({lnum})            数値    {lnum}行目以前の空行でない行の行番号
printf({fmt}{expr1}...)       文字列  文字列を組み立てる
prompt_getprompt({buf})         文字列  プロンプト文字列の取得
prompt_setcallback({buf}{expr}) なし  プロンプトコールバック関数を設定する
prompt_setinterrupt({buf}{text}) なし プロンプト割り込み関数を設定する
prompt_setprompt({buf}{text}) なし    プロンプトテキストを設定する
prop_add({lnum}{col}{props})  なし  テキストプロパティを追加
prop_clear({lnum} [, {lnum-end} [, {props}]])
                                なし    全てのテキストプロパティを削除
prop_find({props} [, {direction}])
                                辞書    テキストプロパティを検索する
prop_list({lnum} [, {props}])   リスト  {lnum}行目のテキストプロパティを取得
prop_remove({props} [, {lnum} [, {lnum-end}]])
                                数値    テキストプロパティを削除
prop_type_add({name}{props})  なし    新しいプロパティタイプを定義
prop_type_change({name}{props})
                                なし    既存のプロパティタイプを変更
prop_type_delete({name} [, {props}])
                                なし    プロパティタイプを削除
prop_type_get({name} [, {props}])
                                辞書    プロパティタイプの値を取得
prop_type_list([{props}])       リスト  プロパティタイプ一覧を取得
pum_getpos()                    辞書    ポップアップメニューが表示されている場
                                        合、位置とサイズを取得
pumvisible()                    数値    ポップアップメニューが表示されているか
py3eval({expr})                 任意    python3 の式を評価する
pyeval({expr})                  任意    Python の式を評価する
pyxeval({expr})                 任意    python_x の式を評価する
rand([{expr}])                  数値    疑似乱数を取得する
range({expr} [, {max} [, {stride}]])
                                リスト  {expr}から{max}までの要素のリスト
readblob({fname})               Blob    {fname} から Blob を読む
readdir({dir} [, {expr} [, {dict}]])
                                リスト  {expr}によって選択された{dir}内のファ
                                        イル名を取得
readdirex({dir} [, {expr} [, {dict}]])
                                リスト  {expr}によって選択された{dir}内のファ
                                        イル情報を取得
readfile({fname} [, {type} [, {max}]])
                                リスト  ファイル{fname}から行のリストを取得
reduce({object}{func} [, {initial}])
                                任意    {func} を使って {object} の 畳み込み
                                        (reduce) を行う
reg_executing()                 文字列  実行中のレジスタ名を取得する
reg_recording()                 文字列  記録中のレジスタ名を取得する
reltime([{start} [, {end}]])    リスト  時刻の値を取得
reltimefloat({time})            浮動小数点数    時刻の値を浮動小数点に変換
reltimestr({time})              文字列  時刻の値を文字列に変換
remote_expr({server}{string} [, {idvar} [, {timeout}]])
                                文字列  式を送信する
remote_foreground({server})     数値    Vimサーバーを前面に出す
remote_peek({serverid} [, {retvar}])
                                数値    返信文字列を確認する
remote_read({serverid} [, {timeout}])
                                文字列  返信文字列を読み込む
remote_send({server}{string} [, {idvar}])
                                文字列  キーシーケンスを送信する
remote_startserver({name})      なし    サーバー {name} になる
remove({list}{idx} [, {end}]) 任意/リスト
                                        {list}から{idx}{end}間の要素を削除
remove({blob}{idx} [, {end}]) 数値/Blob
                                        {Blob}から{idx}{end}間のバイトを削除
remove({dict}{key})           任意    {dict}から要素{key}を削除
rename({from}{to})            数値    {file}から{to}へファイル名変更
repeat({expr}{count})         文字列  {expr}{count}回繰り返す
resolve({filename})             文字列  ショートカットが指す先のファイル名
reverse({list})                 文字列  {list}をその場で反転させる
round({expr})                   浮動小数点数    {expr} を四捨五入する
rubyeval({expr})                任意    Ruby の式を評価
screenattr({row}{col})        数値    スクリーン位置の属性
screenchar({row}{col})        数値    スクリーン位置の文字
screenchars({row}{col})       リスト  スクリーン位置の文字のリスト
screencol()                     数値    現在のカーソル列
screenpos({winid}{lnum}{col}) 辞書  スクリーン行と列のテキスト
screenrow()                     数値    現在のカーソル行
screenstring({row}{col})      文字列  スクリーン位置の文字列
search({pattern} [, {flags} [, {stopline} [, {timeout} [, {skip}]]]])
                                数値    {pattern} を検索する
searchcount([{options}])        辞書    検索の統計の取得もしくは更新する
searchdecl({name} [, {global} [, {thisblock}]])
                                数値    変数の宣言を検索
searchpair({start}{middle}{end} [, {flags} [, {skip} [...]]])
                                数値    開始/終端のペアの他方を検索
searchpairpos({start}{middle}{end} [, {flags} [, {skip} [...]]])
                                リスト  開始/終端のペアの他方を検索
searchpos({pattern} [, {flags} [, {stopline} [, {timeout} [, {skip}]]]])
                                リスト  {pattern}を検索
server2client({clientid}{string})
                                数値    返信文字列を送信する
serverlist()                    文字列  利用可能なサーバーのリストを取得
setbufline({expr}{lnum}{text})
                                数値    バッファ {expr} の {lnum} 行目に {text}
                                        を設定する
setbufvar({expr}{varname}{val})     バッファ{expr}内の変数{varname}{val}
                                        をセット
setcellwidths({list})           なし    文字のセル幅の上書き設定
setcharpos({expr}{list})      数値    {list} の {expr} 位置に設定
setcharsearch({dict})           辞書    文字検索を{dict}に設定
setcmdpos({pos})                数値    コマンドライン内のカーソル位置を設定
setcursorcharpos({list})        数値    {list} の位置へカーソルを移動
setenv({name}{val})           なし    環境変数を設定
setfperm({fname}{mode})       数値    ファイル {fname} のパーミッションを
                                        {mode} に設定
setline({lnum}{line})         数値    行{lnum}{line}(文字列)をセット
setloclist({nr}{list} [, {action}])
                                数値    {list}を使ってlocationリストを変更
setloclist({nr}{list}{action}{what})
                                数値    指定したlocationリストのプロパティを
                                        変更
setmatches({list} [, {win}])    数値    マッチのリストを復元する
setpos({expr}{list})          なし    {expr}の位置を{list}にする
setqflist({list} [, {action}])  数値    {list}を使ってquickfixリストを変更
setqflist({list}{action}{what})
                                数値    指定したquickfixリストのプロパティを
                                        変更
setreg({n}{v} [, {opt}])      数値    レジスタの値とタイプを設定
settabvar({nr}{varname}{val}) なし  タブページ{nr}の変数{varname}{val}
                                        設定する
settabwinvar({tabnr}{winnr}{varname}{val})
                                なし    タブページ{tabnr}内のウィンドウ{winnr}
                                        の変数{varname}{val}をセット
settagstack({nr}{dict} [, {action}])
                                数値    {dict}を使ってタグスタックを変更
setwinvar({nr}{varname}{val}) なし  ウィンドウ{nr}の変数{varname}{val}
                                        セット
sha256({string})                文字列  {string}のSHA256チェックサム
shellescape({string} [, {special}])
                                文字列  {string}をシェルコマンド引数として使う
                                        ためにエスケープする。
shiftwidth([{col}])             数値    実際に使用される 'shiftwidth' の値
sign_define({name} [, {dict}])  数値    目印を定義または更新する
sign_define({list})             リスト  目印のリストを定義または更新する
sign_getdefined([{name}])       リスト  定義されている目印のリストを取得する
sign_getplaced([{expr} [, {dict}]])
                                リスト  設置されている目印のリストを取得する
sign_jump({id}{group}{expr})
                                数値    目印に移動する
sign_place({id}{group}{name}{expr} [, {dict}])
                                数値    目印を設置する
sign_placelist({list})          リスト  目印のリストを設置する
sign_undefine([{name}])         数値    目印を削除する
sign_undefine({list})           リスト  目印のリストを削除する
sign_unplace({group} [, {dict}])
                                数値    目印を解除する
sign_unplacelist({list})        リスト  目印のリストを解除する
simplify({filename})            文字列  ファイル名を可能なかぎり簡略化する
sin({expr})                     浮動小数点数    {expr} の正弦(サイン)
sinh({expr})                    浮動小数点数    {expr}のハイパボリックサイン
slice({expr}{start} [, {end}])  文字列、リスト、Blob
                                        文字列、リスト、Blob のスライス
sort({list} [, {func} [, {dict}]])
                                リスト  比較に{func}を使って{list}をソートする
sound_clear()                   なし    すべてのサウンドの再生を停止する
sound_playevent({name} [, {callback}])
                                数値    イベントサウンドを再生する
sound_playfile({path} [, {callback}])
                                数値    サウンドファイル{path}を再生する
sound_stop({id})                なし    サウンド{id}の再生を停止する
soundfold({word})               文字列  {word}のsound-fold
spellbadword()                  文字列  カーソル位置のスペルミスした単語
spellsuggest({word} [, {max} [, {capital}]])
                                リスト  スペリング補完
split({expr} [, {pat} [, {keepempty}]])
                                リスト  {expr}{pat}で区切ってリストを作る
sqrt({expr})                    浮動小数点数    {expr} の平方根
srand([{expr}])                 リスト  rand() 用の種を取得する
state([{what}])                 文字列  Vimの現在の状態
str2float({expr})               浮動小数点数    文字列を浮動小数点数に変換する
str2list({expr} [, {utf8}])     リスト  {expr}の各文字をASCII / UTF8値に変換する
str2nr({expr} [, {base} [, {quoted}]])
                                数値    文字列を数値に変換する
strcharlen({expr})              数値    文字列 {expr} の文字の長さ
strcharpart({str}{start} [, {len} [, {skipcc}]])
                                文字列  {str} 内 {start} 文字目 から {len} 文
                                        字分
strchars({expr} [, {skipcc}])   数値    文字列{expr}の文字の数
strdisplaywidth({expr} [, {col}]) 数値  文字列{expr}の表示幅
strftime({format} [, {time}])   文字列  指定されたフォーマットで時刻を書式化
strgetchar({str}{index})      数値    {str} から {index} 番目の文字インデッ
                                        クスを得る
stridx({haystack}{needle} [, {start}])
                                数値    {haystack}内の{needle}のインデックス
string({expr})                  文字列  {expr}の値の文字列表現
strlen({expr})                  数値    文字列{expr}の長さ
strpart({str}{start} [, {len} [, {chars}]])
                                文字列  {str}{start}バイトから{len}バイト/
                                        文字分
strptime({format}{timestring})
                                数値    {timestring} を unix タイムスタンプに
                                        変換
strridx({haystack}{needle} [, {start}])
                                数値    {haystack}内の最後の{needle}のインデッ
                                        クス
strtrans({expr})                文字列  文字列を表示可能に変更
strwidth({expr})                数値    文字列{expr}の表示セル幅
submatch({nr} [, {list}])       文字列/リスト
                                        ":s" やsubstitute()における特定のマッチ
substitute({expr}{pat}{sub}{flags})
                                文字列  {expr}{pat}{sub}に置換え
swapinfo({fname})               辞書    スワップファイル {fname} に関する情報
swapname({expr})                文字列  バッファ{expr}のスワップファイル名
synID({line}{col}{trans})   数値    {line}{col}のsyntax IDを取得
synIDattr({synID}{what} [, {mode}])
                                文字列  syntax ID{synID}の属性{what}を取得
synIDtrans({synID})             数値    {synID}の翻訳されたsyntax ID
synconcealed({lnum}{col})     リスト  Conceal の情報
synstack({lnum}{col}) リスト  {lnum}{col}列目における構文IDの
                                        スタック
system({expr} [, {input}])      文字列  シェルコマンド{expr}の出力結果
systemlist({expr} [, {input}])  リスト  シェルコマンド{expr}の出力結果
tabpagebuflist([{arg}])         リスト  タブページ内のバッファ番号のリスト
tabpagenr([{arg}])              数値    現在または最後のタブページの番号
tabpagewinnr({tabarg} [, {arg}])
                                数値    タブページ内の現在のウィンドウの番号
tagfiles()                      リスト  使用しているタグファイルのリスト
taglist({expr} [, {filename}])  リスト  {expr}にマッチするタグのリスト
tan({expr})                     浮動小数点数    {expr}のタンジェント
tanh({expr})                    浮動小数点数    {expr}のハイパボリックタンジェ
                                                ント
tempname()                      文字列  テンポラリファイルの名前
term_dumpdiff({filename}{filename} [, {options}])
                                数値    2 つのダンプ間の差分を表示する
term_dumpload({filename} [, {options}])
                                数値    スクリーンダンプの表示
term_dumpwrite({buf}{filename} [, {options}])
                                なし    端末ウィンドウの内容をダンプする
term_getaltscreen({buf})        数値    代替スクリーンフラグを取得する
term_getansicolors({buf})       リスト  GUI カラーモードでの ANSI パレットを取
                                        得する
term_getattr({attr}{what})    数値    属性 {what} の値を取得する
term_getcursor({buf})           リスト  端末のカーソル位置を取得する
term_getjob({buf})              ジョブ  端末に関連付けられているジョブを取得す
                                        る
term_getline({buf}{row})      文字列  端末から 1 行のテキストを取得する
term_getscrolled({buf})         数値    端末のスクロール数を取得する
term_getsize({buf})             リスト  端末のサイズを取得する
term_getstatus({buf})           文字列  端末の状態を取得する
term_gettitle({buf})            文字列  端末のタイトルを取得する
term_gettty({buf}, [{input}])   文字列  端末の tty 名を取得する
term_list()                     リスト  端末バッファのリストを取得する
term_scrape({buf}{row})       リスト  端末スクリーンの行を取得する
term_sendkeys({buf}{keys})    なし    キー入力を端末に送信する
term_setansicolors({buf}{colors})
                                なし    GUI カラーモードでの ANSI パレットを設
                                        定する
term_setapi({buf}{expr})      なし    terminal-api の関数名プリフィックス
                                        を設定する
term_setkill({buf}{how})      なし    端末のジョブを停止するためのシグナルを
                                        設定する
term_setrestore({buf}{command}) なし  端末を復元するためのコマンドを設定する
term_setsize({buf}{rows}{cols})
                                なし    端末のサイズを設定する
term_start({cmd} [, {options}]) 数値    端末ウィンドウを開きジョブを実行する
term_wait({buf} [, {time}])     数値    スクリーンが更新されるのを待つ
terminalprops()                 辞書    端末のプロパティ
test_alloc_fail({id}{countdown}{repeat})
                                なし    メモリの確保を失敗にさせる
test_autochdir()                なし    起動時に 'autochdir' を有効にする
test_feedinput({string})        なし    キー入力を入力バッファに追加する
test_garbagecollect_now()       なし    テスト用に直ちにメモリを解放する
test_garbagecollect_soon()      なし    テスト用にすぐにメモリを解放する
test_getvalue({string})         任意    内部変数の値を取得する
test_gui_drop_files({list}{row}{col}{mods})
                                なし    ファイルのリストをウィンドウにドロップ
                                        する
test_gui_mouse_event({button}{row}{col}{repeated}{mods})
                                なし    マウスイベントを入力バッファへ追加する
test_ignore_error({expr})       なし    特定のエラーを無視する
test_null_blob()                Blob    テスト用のnull値
test_null_channel()             チャネル        テスト用のnull値
test_null_dict()                辞書    テスト用のnull値
test_null_function()            Funcref テスト用のnull値
test_null_job()                 ジョブ  テスト用のnull値
test_null_list()                リスト  テスト用のnull値
test_null_partial()             Funcref テスト用のnull値
test_null_string()              文字列  テスト用のnull値
test_option_not_set({name})     なし    オプション設定フラグをリセットする
test_override({expr}{val})    なし    Vimの内部処理を置き換えてテストする
test_refcount({expr})           数値    {expr}の参照カウントを取得
test_scrollbar({which}{value}{dragging})
                                なし    GUIのスクロールのテスト用
test_setmouse({row}{col})     なし    テスト用にマウス位置を設定する
test_settime({expr})            なし    テスト用に現在の時刻を設定する
test_srand_seed([seed])         なし    srand() のテスト用に種を設定する
test_unknown()                  任意    テスト用のunknown値
test_void()                     任意    テスト用のvoid値
timer_info([{id}])              リスト  タイマーに関する情報
timer_pause({id}{pause})      なし    タイマーの一時停止または一時停止解除
timer_start({time}{callback} [, {options}])
                                数値    タイマーを作成する
timer_stop({timer})             なし    タイマーを停止する
timer_stopall()                 なし    すべてのタイマーを停止する
tolower({expr})                 文字列  文字列{expr}を小文字にする
toupper({expr})                 文字列  文字列{expr}を大文字にする
tr({src}{fromstr}{tostr})   文字列  {src}中に現れる文字{fromstr}{tostr}
                                        に変換する
trim({text} [, {mask} [, {dir}]])
                                文字列  {text} から {mask} 内の文字を切り取る
trunc({expr})                   浮動小数点数    浮動小数点数{expr}を切り詰める
type({expr})                    数値    変数{expr}の型
typename({expr})                文字列  {expr}の型を表す
undofile({name})                文字列  {name}に対するアンドゥファイルの名前
undotree()                      リスト  アンドゥファイルツリー
uniq({list} [, {func} [, {dict}]])
                                リスト  リストから隣接した重複を削除
values({dict})                  リスト  {dict}の値のリスト
virtcol({expr})                 数値    カーソルのスクリーンカラム位置
visualmode([expr])              文字列  最後に使われたビジュアルモード
wildmenumode()                  数値    'wildmenu' モードが有効かどうか
win_execute({id}{command} [, {silent}])
                                文字列  ウィンドウ{id}{command}を実行する
win_findbuf({bufnr})            リスト  {bufnr}を含むウィンドウを見つける
win_getid([{win} [, {tab}]])    数値    {tab}{win}のウィンドウIDを取得
win_gettype([{nr}])             文字列  ウィンドウ {nr} の型
win_gotoid({expr})              数値    ID {expr}のウィンドウに行く
win_id2tabwin({expr})           リスト  ウィンドウIDからタブとウィンドウnr取得
win_id2win({expr})              数値    ウィンドウIDからウィンドウnr取得
win_screenpos({nr})             リスト  ウィンドウ {nr} のスクリーン位置を取得
                                        する
win_splitmove({nr}{target} [, {options}])
                                数値    ウィンドウ {nr} を {target} の分割へ移
                                        動
winbufnr({nr})                  数値    ウィンドウ{nr}のバッファ番号
wincol()                        数値    カーソル位置のウィンドウ桁
winheight({nr})                 数値    ウィンドウ{nr}の高さ
windowsversion()                文字列  MS-Windows OS のバージョン
winlayout([{tabnr}])            リスト  タブ {tabnr} 内のウィンドウの配置
winline()                       数値    カーソル位置のウィンドウ行
winnr([{expr}])                 数値    現在のウィンドウの番号
winrestcmd()                    文字列  ウィンドウサイズを復元するコマンド
winrestview({dict})             なし    現在のウィンドウのビューを復元
winsaveview()                   辞書    現在のウィンドウのビューを保存
winwidth({nr})                  数値    ウィンドウ{nr}の幅を取得
wordcount()                     辞書    バイト/文字/単語の統計情報を取得
writefile({object}{fname} [, {flags}])
                                数値    行の Blob または list をファイルに
                                        書き込む
xor({expr}{expr})             数値    ビット排他的論理和


abs({expr})                                                     abs()
                {expr} の絶対値を返す。{expr} の値が浮動小数点数である場合は浮
                動小数点数を返す。{expr} がNumberに変換可能な場合は数値が戻
                り値になる。それ以外の場合はエラーメッセージを表示し、-1
                を返す。
                例:
                        echo abs(1.456)
                        1.456 
                        echo abs(-5.456)
                        5.456 
                        echo abs(-4)
                        4

                method としても使用できる:
                        Compute()->abs()

                {+float 機能を有効にしてコンパイルしたときのみ有効}


acos({expr})                                                    acos()
                {expr} の逆余弦 (アークコサイン) をラジアンで返す。
                値は [0, pi] の範囲の浮動小数点数 (Float)。
                {expr} は [-1, 1] の範囲の浮動小数点数 (Float) か数値
                (Number) でなければならない。
                例:
                        :echo acos(0)
                        1.570796
                        :echo acos(-0.5)
                        2.094395

                method としても使用できる:
                        Compute()->acos()

                {+float 機能を有効にしてコンパイルしたときのみ有効}


add({object}{expr})                                   add()
                List または Blob {object}の末尾に項目{expr}を追加する。結
                果の List か Blob を返す。例:
                        :let alist = add([1, 2, 3], item)
                        :call add(mylist, "woodstock")
                Note {expr}がリストのときは、1個の要素として追加される。リスト
                を連結するにはextend()を使う。
                {object}が Blob の場合、{expr}は数値でなければならない。
                他の位置に要素を追加するにはinsert()を使う。

                method としても使用できる:
                        mylist->add(val1)->add(val2)


and({expr}{expr})                                     and()
                二つの引数のビット論理積。引数は数値に変換される。リスト、辞
                書、浮動小数点数を指定するとエラーになる。
                例:
                        :let flag = and(bits, 0x80)


append({lnum}{text})                                  append()
                {text}がリストListのときは、各要素をカレントバッファの{lnum}
                行目以降にテキストとして追加する。
                リストでないときは、{text}をテキストとしてカレントバッファの
                {lnum}行目以降にテキストとして追加する。
                要素としてどの型でも受け入れて文字列に変換される。
                {lnum}は0でもよく、その場合は1行目の前に行を挿入する。
                {lnum}getline()と同様に扱われる。
                失敗した場合は1を返す({lnum}が不正な範囲であるか、メモリ不足)。
                成功なら0を返す。例:
                        :let failed = append(line('$'), "# THE END")
                        :let failed = append(0, ["Chapter 1", "the beginning"])

                リストの後に method としても使用でき、ベースは第2引数として
                渡される:
                        mylist->append(lnum)

appendbufline({expr}{lnum}{text})                   appendbufline()
                append() と同様、ただしバッファ {expr} にテキストを追加する。

                この関数は、ロードされたバッファに対してのみ機能する。必要であ
                れば、最初に bufload() を呼び出すこと。

                {expr} の使い方については bufname() を参照。

                {lnum} は append() と同様に扱われる。Noteline() の使用
                は、追加対象のバッファではなくカレントバッファに適用される。
                バッファの最後に追加するには "$" を使用する。

                成功時には 0 が返り、失敗時には 1 が返る。

                {expr} が有効なバッファでない、もしくは {lnum} が有効でない場
                合、エラーメッセージが与えられる。例:
                        :let failed = appendbufline(13, 0, "# THE START")

                リストの後に method としても使用でき、ベースは第2引数として
                渡される:
                        mylist->appendbufline(buf, lnum)

                                                        *argc()*
argc([{winid}])
                引数リスト内の、ファイルの数を返す。arglistを参照。
                {winid} が指定されていない場合は、カレントウィンドウの引数リス
                トが使われる。
                {winid} が -1 の場合、グローバル引数リストが使われる。
                もしくは、{winid} は、引数リストが使用されるウィンドウを指定す
                る: ウィンドウ番号またはウィンドウID。引数{winid} が無効な場合
                は -1 を返す。

                                                        argidx()
argidx()        引数リスト内の現在のインデックスを返す。最初のファイルは0とな
                る。argc() - 1が最後のファイルとなる。arglistを参照。

                                                        arglistid()
arglistid([{winnr} [, {tabnr}]])
                引数リストの ID を返す。値は引数リストを区別するための数値であ
                る。ゼロはグローバル引数リストを意味する。arglist 参照。
                引数が無効な場合は -1 を返す。

                引数を指定しなかった場合はカレントウィンドウが使われる。
                {winnr} を指定した場合はカレントタブページ内のウィンドウが使わ
                れる。
                {winnr} と {tabnr} を指定した場合は指定したタブページ内のウィ
                ンドウが使われる。
                {winnr} にはウィンドウ番号またはwindow-IDが使える。

                                                        argv()
argv([{nr} [, {winid}]])
                結果は引数リスト内の、{nr}番目のファイル。arglist を参照。
                "argv(0)" は一番最初のファイルを示す。例:
        :let i = 0
        :while i < argc()
        :  let f = escape(fnameescape(argv(i)), '.')
        :  exe 'amenu Arg.' . f . ' :e ' . f . '<CR>'
        :  let i = i + 1
        :endwhile
                引数{nr} が指定されなかった場合、または、-1 の場合、引数リス
                ト arglist 全体を返す。

                引数{winid} はウィンドウIDを指定する。
                Vimのコマンドライン引数については、v:argv を参照。

asin({expr})                                            asin()
                {expr} の逆正弦 (アークサイン) をラジアンで返す。
                値は [-pi/2, pi/2] の範囲の浮動小数点数 (Float)。
                {expr} は [-1, 1] の範囲の浮動小数点数 (Float) か数値
                (Number) でなければならない。
                例:
                        :echo asin(0.8)
                        0.927295
                        :echo asin(-0.5)
                        -0.523599

                method としても使用できる:
                        Compute()->asin()

                {+float 機能つきでコンパイルされたときのみ有効}


assert_ 関数群はここに文書化されている: assert-functions-details



atan({expr})                                            atan()
                {expr} の逆正接(アークタンジェント)の主値を浮動小数点数
                Float で返す。主値はラジアンで[-pi/2, +pi/2]の範囲内にある。
                {expr} は Float か Number に評価されなければならない。
                例:
                        :echo atan(100)
                        1.560797
                        :echo atan(-4.01)
                        -1.326405

                method としても使用できる:
                        Compute()->atan()

                {+float 機能つきでコンパイルされたときのみ有効}


atan2({expr1}{expr2})                                 atan2()
                {expr1} / {expr2} の逆正接 (アークタンジェント) をラジアンで返
                す。値は [-pi, pi] の範囲の浮動小数点数 (Float)。
                {expr1} と {expr2} は浮動小数点数 (Float) か数値 (Number)
                でなければならない。
                例:
                        :echo atan2(-1, 1)
                        -0.785398
                        :echo atan2(1, -1)
                        2.356194

                method としても使用できる:
                        Compute()->atan(1)

                {+float 機能を有効にしてコンパイルしたときのみ有効}

balloon_gettext()                                       balloon_gettext()
                バルーン内の現在のテキストを返す。文字列に対してのみ使用され、
                リストには使用されない。

balloon_show({expr})                                    balloon_show()
                {expr} をバルーン内に表示する。GUI では {expr} は文字列として
                扱われる。端末では {expr} をバルーンの行を含むリストとしてもよ
                い。{expr} がリストでない場合、balloon_split() で分割される。
                {expr} が空文字列の場合、既存のバルーンは削除される。

                例:
                        func GetBalloonContent()
                           " ... 内容の取得を開始
                           return ''
                        endfunc
                        set balloonexpr=GetBalloonContent()

                        func BalloonCallback(result)
                          call balloon_show(a:result)
                        endfunc
                method としても使用できる:
                        GetText()->balloon_show()

                想定される使用方法は、バルーンの内容の取得が 'balloonexpr' か
                ら開始されることである。そこから非同期メソッドを呼び出し、コー
                ルバックから balloon_show() を呼び出す。'balloonexpr' 自身は
                空文字列かプレースホルダーを返すことができる。

                バルーンを表示できないときは何も起こらず、エラーメッセージも表
                示されない。
                {Vimが +balloon_eval もしくは +balloon_eval_term 機能付き
                でコンパイルされたときのみ有効}

balloon_split({msg})                                    balloon_split()
                {msg} をバルーン内で表示される行に分割する。カレントウィンドウ
                サイズ用に分割され、デバッガ出力を表示するために最適化される。
                分割された行の List を返す。
                method としても使用できる:
                        GetText()->balloon_split()->balloon_show()

                {+balloon_eval_term 機能付きでコンパイルされたときのみ有効}

                                                        browse()
browse({save}{title}{initdir}{default})
                ファイル選択ダイアログを起動。"has("browse")" がTRUEを返すと
                き (幾つかのGUIバージョンに限定)だけ利用可能。
                入力フィールドの意味は:
                    {save}      TRUEならば書込み用ファイルの選択
                    {title}     ダイアログのタイトル
                    {initdir}   ダイアログの始まるディレクトリ
                    {default}   ファイル名の省略値
                ダイアログがキャンセルされるか、何かエラーがあるか、もしくはブ
                ラウジングが不可能ならば、空文字列が戻ってくる。

                                                        browsedir()
browsedir({title}{initdir})
                ディレクトリ選択ダイアログを起動。"has("browse")" がTRUEを返
                すとき(幾つかのGUIバージョンに限定)だけ利用可能。
                ディレクトリ選択ダイアログがないシステムにおいてはファイル選択
                ダイアログが使われる。その場合は、指定したいディレクトリの中の
                ファイルを選択すること。
                入力フィールドの意味は:
                    {title}     ダイアログのタイトル
                    {initdir}   ダイアログの始まるディレクトリ
                ダイアログがキャンセルされるか、何かエラーがあるか、もしくはブ
                ラウジングが不可能ならば、空文字列が戻ってくる。

bufadd({name})                                          bufadd()
                バッファリストに {name} という名前でバッファを追加する。
                もし、ファイル {name} 用のバッファが既に存在した場合、そのバッ
                ファの番号を返す。そうでなければ、新しく作られたバッファの番号
                を返す。{name} が空の文字列だったときは新しいバッファが常に作
                成される。
                バッファには 'buflisted' が設定されず、まだロードされない。
                バッファにテキストを追加するにはこれを使用する:
                        let bufnr = bufadd('someName')
                        call bufload(bufnr)
                        call setbufline(bufnr, 1, ['some', 'text'])
                method としても使用できる:
                        let bufnr = 'somename'->bufadd()

bufexists({expr})                                       bufexists()
                結果は数値で、{expr}と呼ばれるバッファが存在すればTRUEとな
                る。
                {expr}が数値の場合、バッファ番号とみなされる。数値の 0 はカレ
                ントウィンドウの代替バッファである。

                {expr}が文字列の場合、バッファ名に正確にマッチしなければな
                らない。名前として以下のものが許される:
                - カレントディレクトリからの相対パス。
                - フルパス。
                - 'buftype' が "nofile" であるバッファの名前
                - URL名。
                バッファリストにないバッファも検索される。
                Note :buffersの出力で、ヘルプファイルは短い名前でリストされ
                ているが、bufexists()は長い名前でないと見つけることができない。
                ある名前を bufexists() に与えて非零になったとしても、その名前
                をコマンド :buffer に与える際には expand() を使って展開し
                なければならない場合がある。特に MS-Windows の "c:\DOCUME~1"
                という 8.3 名形式において。
                代替ファイル名が存在するかを判定するには "bufexists(0)" を使う。

                method としても使用できる:
                        let exists = 'somename'->bufexists()

                                                        buffer_exists()
                以前の名前: buffer_exists().

buflisted({expr})                                       buflisted()
                戻り値は数値で、{expr}と呼ばれるバッファが存在しリストされてい
                る ('buflisted' オプションがオンになっている) ならば結果は
                TRUEとなる。引数{expr}bufexists()と同じように扱われる。

                method としても使用できる:
                        let listed = 'somename'->buflisted()

bufload({expr})                                         bufload()
                バッファ{expr}がロードされていることを保証する。バッファの名前
                が既存のファイルを参照しているときは、そのファイルが読み込まれ
                る。そうでなければバッファは空になる。もし既にバッファが読み込
                まれていれば、変更はない。
                バッファのファイルに対して既存のスワップファイルがある場合、ダ
                イアログなしで、バッファはロードされる。
                引数{expr}bufexists()と同じように扱われる。

                method としても使用できる:
                        eval 'somename'->bufload()

bufloaded({expr})                                       bufloaded()
                戻り値は数値で、{expr}と呼ばれるバッファが存在しロード済み(
                ウィンドウに表示されているか、隠されているかは問わない)ならば
                結果はTRUEとなる。引数{expr}bufexists()と同じように扱わ
                れる。

                method としても使用できる:
                        let loaded = 'somename'->bufloaded()

bufname([{expr}])                                       bufname()
                戻り値はバッファの名前。バッファ名はコマンド :ls で表示され
                るものとほとんど同じだが、例えば "[No Name]" などの特殊名は使
                用しない。
                {expr}が省略された場合は、カレントバッファが使われる。
                {expr}が数値ならば、その番号のバッファ名が返される。0は現在の
                ウィンドウの代替バッファを意味する。{expr}が文字列ならば、バッ
                ファ名に対してファイル名マッチング file-pattern を行うパター
                ンとなる。このマッチングは常に、'magic' をセットし 'cpoptions'
                を空にした状態で行われる。複数マッチしてしまった場合には空文字
                列が返される。
                "" や "%" は現在のバッファを意味し、"#" は代替バッファを意味す
                る。
                完全マッチのものが優先され、完全マッチがなければ、バッファ名の
                先頭でのマッチ、末尾でのマッチ、中間でのマッチが探される。完全
                マッチのみを探すには、パターン先頭に "^" を、末尾に "$" をつけ
                る。
                まずバッファリストにあるバッファが探される。そこで1個だけマッ
                チが見つかればそれを返す。次にバッファリストにないものが探され
                る。
                {expr}が文字列のときに、それをバッファ番号として使いたいなら
                ば、0を足すことによって強制的に数値にすることができる:
                        echo bufname("3" + 0)
                method としても使用できる:
                        echo bufnr->bufname()

                バッファが存在しないか名前を持っていない場合には、空文字列が返
                される。
  bufname("#")                  alternate buffer name
  bufname(3)                    name of buffer 3
  bufname("%")                  name of current buffer
  bufname("file2")              name of buffer where "file2" matches.
                                                        buffer_name()
                以前の名前: buffer_name().

                                                        bufnr()
bufnr([{expr} [, {create}]])
                結果はバッファの番号。バッファ番号はコマンド :ls で表示され
                るものと同様。{expr}の使い方は前述の bufname() を参照。

                バッファが存在しない場合-1が返される。ただし、{create}が与えら
                れて真であるときは、バッファリストに載せない新しいバッファを作
                成し、その番号を返す。例:
                        let newbuf = bufnr('Scratch001', 1)
                空の名前を使用すると、カレントバッファが使用される。空の名前で
                新しいバッファを作成するには、bufadd() を使用する。

                bufnr("$")は最後のバッファを意味する:
                        :let last_buffer = bufnr("$")
                結果は存在しているバッファのうちで、もっとも大きなバッファ番号
                となる。Note そのバッファ番号より小さいバッファ番号を持つ(ハズ
                の)バッファが、必ずしも全て存在するとは限らない。なぜなら
                ":bwipeout" がバッファを消すことができるからだ。バッファが存在
                するかテストするにはbufexists()を使う。

                method としても使用できる:
                        echo bufref->bufnr()

                以前の名前: buffer_number().            buffer_number()
                                                        last_buffer_nr()
                bufnr("$")の以前の名前: last_buffer_nr().

bufwinid({expr})                                        bufwinid()
                その結果は数値で、バッファ{expr}に関連付けられた最初のウィンド
                ウのwindow-ID{expr}の使い方は前述のbufname()を参照。バッ
                ファ{expr}が存在しないか、ウィンドウが無い場合は、-1が返され
                る。例:

        echo "A window containing buffer 1 is " . (bufwinid(1))

                現在のタブページのみを処理する。

                method としても使用できる:
                        FindBuffer()->bufwinid()

bufwinnr({expr})                                        bufwinnr()
                結果は数値で、バッファ{expr}に関連付けられた最初のウィンドウの
                番号。{expr}の使い方は前述のbufname()を参照。バッファ{expr}
                が存在しないか、ウィンドウが無い場合には-1を返す。例:

        echo "A window containing buffer 1 is " . (bufwinnr(1))

                この番号はCTRL-W_wや ":wincmd w" :wincmdで使える。

                method としても使用できる:
                        FindBuffer()->bufwinnr()

byte2line({byte})                                       byte2line()
                カレントバッファの先頭から{byte}番目の文字が、何行目に含まれる
                かを返す。これにはカレントバッファの 'fileformat' に依存した、
                改行文字も含まれる。先頭の文字にはバイトカウント1が与えられる。
                line2byte()go:gotoも参照。

                method としても使用できる:
                        GetOffset()->byte2line()

                {+byte_offset 機能付きでコンパイルされたときのみ有効}

byteidx({expr}{nr})                                   byteidx()
                文字列{expr}{nr}番目の文字のバイトインデックスを返す。最初の
                文字の{nr}は0であり、そして戻り値は0となる。
                マルチバイト文字がない時は{nr}に等しい値を返す。
                合成文字はまとめて計算される。合成文字のバイト数はそれが合成さ
                れているベース文字のバイト数に合算される。合成文字を別々に数え
                るには byteidxcomp() を参照。
                例 :
                        echo matchstr(str, ".", byteidx(str, 3))
                は4文字目を表示する。次も同じことをする:
                        let s = strpart(str, byteidx(str, 3))
                        echo strpart(s, 0, byteidx(s, 1))
                strgetchar() と strcharpart() も参照。
                {expr}{nr}文字以下の場合は-1を返す。
                {expr}がちょうど{nr}文字の場合は文字列の長さ(バイト単位)を返す。

                method としても使用できる:
                        GetName()->byteidx(idx)

byteidxcomp({expr}{nr})                                       byteidxcomp()
                byteidx() と同じだが、合成文字は個別にカウントされる。例:
                        let s = 'e' . nr2char(0x301)
                        echo byteidx(s, 1)
                        echo byteidxcomp(s, 1)
                        echo byteidxcomp(s, 2)
                1 番目と 3 番目は 3 が出力される ('e' の長さと合成文字の長さを
                足すと 3 バイト)。2 番目は 1 が出力される ('e' は 1 バイト)。
                'encoding' に Unicode が設定されているときのみ byteidx() と違っ
                た動作になる。

                method としても使用できる:
                        GetName()->byteidxcomp(idx)

call({func}{arglist} [, {dict}])                      call() E699
                リストList{arglist}の要素を引数として関数{func}を呼ぶ。
                {func}Funcrefでも関数の名前でもよい。
                a:firstlineとa:lastlineにはカレント行が代入される。
                呼び出した関数の戻り値を返す。
                {dict}は "dict" 属性つきの関数用で、これがローカル変数 "self"
                に代入される。Dictionary-functionを参照。

                method としても使用できる:
                        GetFunc()->call([arg, arg], dict)

ceil({expr})                                                    ceil()
                {expr} 以上となる最小の整数を浮動小数点数 Float で返す
                (切り上げる)。
                {expr} は Float か Number に評価されなければならない。
                例:
                        echo ceil(1.456)
                        2.0 
                        echo ceil(-5.456)
                        -5.0 
                        echo ceil(4.0)
                        4.0

                method としても使用できる:
                        Compute()->ceil()

                {+float 機能つきでコンパイルされたときのみ有効}


ch_ 関数群はここに文書化されている: channel-functions-details


changenr()                                              changenr()
                最も最近の変更の番号を返す。:undolistで表示される番号と同じ
                であり、:undoコマンドの引数として使うことができる。
                変更を行った直後ではその変更の番号となる。redoを行った直後は
                redoされた変更の番号となる。undoを行った直後はundoされた変更よ
                り1小さい番号になる。

char2nr({expr} [, {utf8}])                                      char2nr()
                {expr}の最初の文字のASCIIコードを返す。例:
                        char2nr(" ")            returns 32
                        char2nr("ABC")          returns 65
                {utf8} を省略、またはゼロを指定すると、現在の 'encoding' が適
                用される。"utf-8" の場合の例:
                        char2nr("á")            returns 225
                        char2nr("á"[0])         returns 195
                {utf8} に真を指定すると、常に utf-8 文字として扱われる。
                合成文字は個別の文字として扱われる。
                nr2char() はこの逆を行う。
                文字列を文字の番号のリストに変換するには:
                    let str = "ABC"
                    let list = map(split(str, '\zs'), {_, val -> char2nr(val)})
                結果: [65, 66, 67]

                method としても使用できる:
                        GetChar()->char2nr()


charclass({string})                                     charclass()
                {string} 内の最初の文字の文字クラスを返す。
                文字クラスは次のいずれか:
                        0       空白
                        1       区切り文字
                        2       単語文字
                        3       絵文字
                        その他  Unicode 固有のクラス
                クラスはパターンと単語単位の移動で使われる。

                                                        charcol()
charcol({expr}col() と同様だが {expr} で返す桁位置がバイトインデックスでは
                なく文字インデックスになる。

                例:
                5行目のテキスト "여보세요" の '세' にカーソルがある状態:
                        charcol('.')            returns 3
                        col('.')                returns 7

                |method| としても使用できる: >
                        GetPos()->col()

                                                        charidx()
charidx({string}{idx} [, {countcc}])
                {string} 内の {idx} バイト目の文字インデックスを返す。最初の文
                字のインデックスは0。
                マルチバイト文字がない時は {idx} に等しい値を返す。
                {countcc} がないもしくは FALSE の場合、合成文字は分割して文
                字としてカウントせず、先行する基底文字に合成文字のバイト長が足
                される。
                {countcc} が TRUE の場合、合成文字は分割した文字としてカウン
                トされる。
                引数が不正であるか {idx} が {string} の最後のバイトより大きい
                場合-1が返る。最初の引数が文字列でない、2番目の引数が数値でな
                い、もしくは3番目の引数ありで0でも1でもない場合はエラーとなる。
                文字インデックスからバイトインデックスを得るには byteidx()
                と byteidxcomp() を参照。
                例:
                        echo charidx('áb́ć', 3)          returns 1
                        echo charidx('áb́ć', 6, 1)       returns 4
                        echo charidx('áb́ć', 16)         returns -1

                method としても使用できる:
                        GetName()->charidx(idx)

chdir({dir})                                            chdir()
                {dir}は文字列でなければならない。
                現在の作業ディレクトリを {dir} に変更する。ディレクトリの変更
                範囲は、カレントウィンドウのディレクトリによって異なる:
                        - カレントウィンドウにウィンドウローカルディレクトリ
                          (:lcd)がある場合は、ウィンドウローカルディレクトリ
                          を変更する。
                        - それ以外の場合、カレントタブページにローカルディレク
                          トリ(:tcd)がある場合は、タブページのローカルディレ
                          クトリを変更する。
                        - それ以外の場合、グローバルディレクトリを変更する。
                成功した場合は、前の作業ディレクトリを返す。ディレクトリを復元
                するには、これを別の chdir() に渡すこと。
                失敗した場合は、空の文字列を返す。

                例:
                        let save_dir = chdir(newdir)
                        if save_dir != ""
                           " ... いくつかの作業をおこなう
                           call chdir(save_dir)
                        endif

                method としても使用できる:
                        GetDir()->chdir()

cindent({lnum})                                         cindent()
                'cindent' で使われるのと同じC言語用のインデント規則に従った場
                合の{lnum}行目のインデント量を返す。
                インデント量はスペースで数えられ、'tabstop' の値は関係ない。
                {lnum}getline()の場合と同様に扱われる。
                {lnum}が無効な値のときや+cindent機能なしでコンパイルされてい
                るときは-1を返す。
                C-indentingを参照。

                method としても使用できる:
                        GetLnum()->cindent()

clearmatches([{win}])                                   clearmatches()
                matchadd() と コマンド :match によりカレントウィンドウに定
                義されたマッチをすべて消去する。
                {win} が指定されれば、カレントウィンドウではなく指定されたウィ
                ンドウあるいはウィンドウID を対象にする。

                method としても使用できる:
                        GetWin()->clearmatches()

                                                        col()
col({expr})     戻り値は数値で、{expr}で与えられる位置の桁番号(バイトインデッ
                クス)。有効な位置は:
                    .       現在の位置
                    $       カレント行の末尾(カレント行のバイト数+1を返す)
                    'x      マークxの位置(マークが設定されていない場合0)
                    v       ビジュアルモードでは: ビジュアル選択領域の開始行
                            (カーソルがその端)。ビジュアルモード以外ではカーソ
                            ル位置を返す。すぐに更新される点が '< と違う。
                さらに {expr} は [lnum, col] という行番号と桁番号のリストで
                あってもよい。col に "$" を指定して、ある行の最後の桁を取得す
                るのにとても便利である。"lnum" か "col" が範囲外である場合は
                0 を返す。
                行番号を取得するにはline()を使う。行番号と桁番号両方を取得す
                るにはgetpos()を使う。
                画面上の桁番号を取得するにはvirtcol()を使う。文字の位置を取
                得するには charcol() を使う。
                Note 現在のファイルのマークしか使えないことに注意。
                例:
                        col(".")                カーソルの桁
                        col("$")                カレント行の長さ+1
                        col("'t")               マークtの桁
                        col("'" . markname)     マークmarknameの桁
                先頭の桁は1になる。戻り値0はエラーを意味する。
                大文字のマークは他のバッファを指しているかもしれない。
                'virtualedit' が有効なとき、カーソルが行末を越えていると、桁番
                号は行の長さより1大きい値を返す。挿入モードで桁番号を取得する
                には次のマップが使える:
                        :imap <F2> <C-O>:let save_ve = &ve<CR>
                                \<C-O>:set ve=all<CR>
                                \<C-O>:echo col(".") . "\n" <Bar>
                                \let &ve = save_ve<CR>

                method としても使用できる:
                        GetPos()->col()

complete({startcol}{matches})                 complete() E785
                挿入モード補完の候補を設定する。
                挿入モードでのみ使用できる。CTRL-R = (i_CTRL-R を参照)と組み
                合わせてマッピングを作る必要がある。CTRL-Oの後や、<expr>マッピ
                ングの中では正しく動作しない。
                {startcol}は補完すべき単語の開始位置を示す、行内のバイトオフセッ
                トである。その位置からカーソルまでのテキストが補完すべき単語と
                なる。
                {matches}はリストListでなければならない。リストの各要素が1つ
                の候補となる。この要素として許される値については
                complete-itemsを参照。
                Note この関数を呼んだ後は補完を停止させるようなテキストの挿入
                をしないように注意しなければならない。
                この関数で設定した候補は普通の挿入モード補完と同じ様にCTRL-N
                CTRL-Pで選択できる。設定されていればポップアップメニューが表示
                される。ins-completion-menuを参照。
                例:
        inoremap <F5> <C-R>=ListMonths()<CR>
        func! ListMonths()
          call complete(col('.'), ['January', 'February', 'March',
                \ 'April', 'May', 'June', 'July', 'August', 'September',
                \ 'October', 'November', 'December'])
          return ''
        endfunc
                この例はそれほど役には立たないが、使い方を示している。Note 0が
                挿入されてしまわないように空文字列を返していることに注意。

                method としても使用でき、ベースは第2引数として渡される:
                        GetMatches()->complete(col('.'))

complete_add({expr})                            complete_add()
                候補のリストに{expr}を追加する。'completefunc' で指定された関
                数の中でのみ使われる。
                失敗したときは0を返す(空文字列かメモリ不足)。候補が追加された
                ときは1を返し、その候補が既にリストに存在するときは2を返す。
                {expr}の説明についてはcomplete-functionsを参照。'omnifunc'
                が返すリストと同じである。

                method としても使用できる:
                        GetMoreMatches()->complete_add()

complete_check()                                complete_check()
                補完候補を探している間にキーがタイプされたかどうか確認する。補
                完の検索に時間がかかる場合に使われる。候補の検索を中断しようと
                しているときはTRUEを返す。そうでないときは0を返す。
                'completefunc' で指定された関数の中でのみ使われる。

                                                        complete_info()
complete_info([{what}])
                挿入モードの補完に関する情報を辞書 Dictionary で返す。
                ins-completion を参照。
                要素は以下の通り:
                   mode         現在の補完モード名の文字列。
                                値は complete_info_mode を参照。
                   pum_visible  ポップアップメニューが表示されているなら TRUE
                                pumvisible() を参照。
                   items        補完マッチのリスト。各要素は "word", "abbr",
                                "menu", "kind", "info", "user_data" を含む辞書。
                                complete-items を参照。
                   selected     選択された補完候補のインデックス。最初のイン
                                デックスが 0。どの補完候補も選択されていなけれ
                                ば -1 (入力したテキストのみ表示、もしくは <Up>
                                や <Down> キーを利用した最後の補完後に選択しな
                                かった場合)。
                   inserted     入力された文字列。[現時点では未実装]

                                                        complete_info_mode
                mode の値は:
                   ""                補完モードでない
                   "keyword"         キーワード補完 i_CTRL-X_CTRL-N
                   "ctrl_x"          CTRL-X のみが入力された i_CTRL-X
                   "whole_line"      行全体補完 i_CTRL-X_CTRL-L
                   "files"           ファイル名補完 i_CTRL-X_CTRL-F
                   "tags"            タグ補完 i_CTRL-X_CTRL-]
                   "path_defines"    定義補完 i_CTRL-X_CTRL-D
                   "path_patterns"   インクルード補完 i_CTRL-X_CTRL-I
                   "dictionary"      辞書補完 i_CTRL-X_CTRL-K
                   "thesaurus"       同義語補完 i_CTRL-X_CTRL-T
                   "cmdline"         Vim コマンドライン補完 i_CTRL-X_CTRL-V
                   "function"        ユーザー定義補完 i_CTRL-X_CTRL-U
                   "omni"            オムニ補完 i_CTRL-X_CTRL-O
                   "spell"           スペル補完 i_CTRL-X_s
                   "eval"            complete() 補完
                   "unknown"         その他の内部モード

                オプショナル引数としてリスト {what} が与えられると、 {what} に
                ある項目のみが返る。{what} 内のサポートされていない項目は無視
                される。

                ポップアップメニューの位置とサイズを取得するには、
                pum_getpos() を参照。CompleteChanged イベント中に v:event
                でも利用可能である。

                例:
                        " 全ての項目を取得
                        call complete_info()
                        " 'mode' のみを取得
                        call complete_info(['mode'])
                        " 'mode' と 'pum_visible' のみを取得
                        call complete_info(['mode', 'pum_visible'])

                method としても使用できる:
                        GetItems()->complete_info()

                                                        confirm()
confirm({msg} [, {choices} [, {default} [, {type}]]])
                confirm()はユーザーに選択させるためのダイアログを提供する。戻
                り値は選択した番号になる。最初の選択肢が1である。
                Note: confirm()は、ダイアログサポートを有効にしてコンパイルし
                た時にだけ動作する。+dialog_con+dialog_guiを参照。

                ダイアログには{msg}に加えて{choices}の選択肢が表示される。
                {choices}が指定されない、または空の場合は選択肢 "&OK" が表示さ
                れる(使用している言語に翻訳される)。
                {msg}は文字列で '\n' を改行として使用できる。幾つかのシステム
                では、長すぎる行は自動的に折り返される。

                {choices}は文字列で、個々の選択肢は '\n' によって区切られる。
                例:
                        confirm("Save changes?", "&Yes\n&No\n&Cancel")
                '&' の後の文字は選択肢のショートカットキーになる。この場合
                "Cancel" を選択するのに 'c' をタイプすることができる。ショート
                カットキーは最初の文字である必要は無い:
                        confirm("file has been modified", "&Save\nSave &All")
                コンソールでは、デフォルトのショートカットキーとして、各選択肢
                の最初の文字が使われる。大文字小文字は区別されない。

                省略可能な引数{default}<CR>キーを叩いた時に選択される選択肢
                の番号を指定する。最初の選択肢をデフォルトにするならば1を使用
                する。デフォルトを設定したくないのならば0を使用する。
                {default}を省略した場合、1が使用される。

                省略可能な引数{type}はダイアログの種類を指定する。これは GTK,
                Mac, Motif, Win32 の GUI でアイコンを指定するのに使われる。
                "Error", "Question", "Info", "Warning", "Generic" のうちどれか
                一つを指定する。以上のうちの先頭の文字だけで指定できる。{type}
                が省略された場合、"Generic" が使用される。

                ユーザーが<Esc>CTRL-Cや、その他の割りこみキーでダイアログを
                中断した場合、confirm()は0を返す。

                例:
   :let choice = confirm("What do you want?", "&Apples\n&Oranges\n&Bananas", 2)
   :if choice == 0
   :    echo "make up your mind!"
   :elseif choice == 3
   :    echo "tasteful"
   :else
   :    echo "I prefer bananas myself."
   :endif
                GUIのダイアログではボタンが使用される。ボタンの配置は
                'guioptions' の 'v' フラグに依存する。もしも 'v' フラグが含ま
                れているのなら、ボタンは常に垂直に配置される。そうでなければ水
                平に配置しようと試みられる。水平配置がうまくマッチしない場合
                は、垂直配置が使われる。幾つかのシステムでは常に水平配置が使わ
                れる。

                method としても使用できる:
                        BuildMessage()->confirm("&Yes\n&No")

                                                        copy()
copy({expr})    {expr}のコピーを作る。数値と文字列の場合は、{expr}そのものとコ
                ピーの間に違いはない。
                {expr}がリストListの場合は浅いコピーを作る。つまり元のリスト
                を変更してもコピーは変更されず、逆も同じである。しかし要素は共
                通で、片方の要素に対し変更を加えると、もう一方の要素も変更され
                る。
                辞書はリストと同様な方法でコピーされる。
                deepcopy()も参照。
                method としても使用できる:
                        mylist->copy()

cos({expr})                                             cos()
                {expr} の余弦(コサイン)をラジアンで浮動小数点数 Float で返す。
                {expr} は Float または Number に評価されなければならない。
                例:
                        :echo cos(100)
                        0.862319
                        :echo cos(-4.01)
                        -0.646043

                method としても使用できる:
                        Compute()->cos()

                {+float 機能つきでコンパイルされたときのみ有効}


cosh({expr})                                            cosh()
                {expr} の双曲線余弦 (ハイパボリックコサイン) を返す。
                値は [1, inf] の範囲の浮動小数点数 (Float)。
                {expr} は浮動小数点数 (Float) か 数値 (Number) でなければ
                ならない。
                例:
                        :echo cosh(0.5)
                        1.127626
                        :echo cosh(-0.5)
                        -1.127626

                method としても使用できる:
                        Compute()->cosh()

                {+float 機能を有効にしてコンパイルしたときのみ有効}


count({comp}{expr} [, {ic} [, {start}]])                      count()
                文字列String、リストListまたは辞書Dictionary {comp} の中
                に値 {expr} が何回現れるかを返す。

                {start} が指定されたときはそのインデックスの要素から検索を開始
                する。{start} は {comp} がリストの場合のみ使用できる。

                {ic} が指定され、TRUEの場合は大文字・小文字は区別されない。

                {comp} が文字列の場合、オーバーラップしていない {expr} の回数
                が返される。{expr} が空文字列の場合は 0 が返る。

                method としても使用できる:
                        mylist->count(val)

                                                        cscope_connection()
cscope_connection([{num} , {dbpath} [, {prepend}]])
                cscope接続が存在するかどうか判定する。引数が1個も指定されな
                かった場合、戻り値は以下のようになる:
                        0, cscopeが利用できない(コンパイル時に無効化されている)
                           またはcscope接続が存在しない場合
                        1, 1個以上のcscope接続が存在する場合

                引数が与えられた場合は次のようになる。{num}は、接続の存在を確
                認する際のマッチング方法を指定する。

                {num}   存在確認の方法
                -----   ------------------------------
                0       引数なしの場合と同じ (例: "cscope_connection()")。
                1       {prepend}を無視し、{dbpath}に部分マッチを行う。
                2       {prepend}を無視し、{dbpath}に部分マッチを行う。
                3       {prepend}を使用し、{dbpath}{prepend}に部分マッチを行
                        う。
                4       {prepend}を使用し、{dbpath}{prepend}に完全マッチを行
                        う。

                Note: 以上のどの場合も文字列の比較は大文字・小文字を区別する。

                例: ":cs show" の表示が以下のようになったとする:

  # pid    database name                        prepend path
  0 27664  cscope.out                           /usr/local

                実行                                            戻り値
                ----------                                      ----------
                cscope_connection()                                     1
                cscope_connection(1, "out")                             1
                cscope_connection(2, "out")                             0
                cscope_connection(3, "out")                             0
                cscope_connection(3, "out", "local")                    1
                cscope_connection(4, "out")                             0
                cscope_connection(4, "out", "local")                    0
                cscope_connection(4, "cscope.out", "/usr/local")        1

cursor({lnum}{col} [, {off}])                         cursor()
cursor({list})
                {lnum}行目の{col}桁目(バイトで数える)にカーソルを移動させる。
                桁番号{col}は1から始まる。

                引数に {list} が 1 つだけ指定された場合は、それは要素が 2 個か
                3 個、または 4 個の List として解釈される:
                        [{lnum}{col}]
                        [{lnum}{col}{off}]
                        [{lnum}{col}{off}{curswant}]
                これは getpos() や getcurpos() の戻り値とほぼ同じである。
                違いは最初の要素がないこと。

                カーソルを文字数でカウントして位置させるには、
                setcursorcharpos() を使う。

                この関数を呼んでもジャンプリストは変更されない。
                {lnum}getline()と同様に扱われる。
                {lnum}がバッファの行数よりも大きい場合は、最後の行へ移動する。
                {lnum}が0の場合はカレント行に留まる。
                {col}がその行のバイト数より大きい場合は、その行の最後の文字へ
                移動する。
                {col}が0の場合は、カレント桁に留まる。
                {curswant} が与えられた場合は、縦方向移動の優先的列番号として
                使われる。指定がない場合は {col} が使われる。

                'virtualedit' が有効のとき、{off}は文字の先頭からの画面上のオ
                フセットを指定する。例えば、<Tab>の中の位置や最後の文字より後
                などへも移動できる。
                カーソルを移動できたときは 0 を、できなかったときは-1 を返す。

                method としても使用できる:
                        GetCursorPos()->cursor()

debugbreak({pid})                                       debugbreak()
                主にデバッグしているプログラムに割り込むために使用される。プロ
                セス {pid} に対して SIGTRAP を発生させる。関係のないプロセスへ
                の振る舞いは未定義である。terminal-debugger を参照。
                {MS-Windows 上でのみ有効}

                method としても使用できる:
                        GetPid()->debugbreak()

deepcopy({expr} [, {noref}])                            deepcopy() E698
                {expr}のコピーを作る。数値と文字列の場合は、{expr}そのものとコ
                ピーの間に違いはない。
                {expr}がリストListの場合は完全なコピーを作る。つまり元のリス
                トを変更してもコピーは変更されず、逆も同じである。要素の1つが
                リストまたは辞書であるときは、再帰的にコピーが作成される。
                よってコピーの要素に変更を加えても元のリストの要素は変更を受け
                ない。
                辞書はリストと同様な方法でコピーされる。

                {noref}が省略された、または0のとき、含まれているリストや辞書は
                1度だけコピーされる。全ての参照はこのただ1つのコピーを指す。
                {noref}が1の場合、リストや辞書は現れるたびに新しいコピーが作ら
                れる。そのため循環参照があるとdeepcopy()は失敗する。
                                                                E724
                ネストは100レベルまで可能である。それ以上参照を繰り返している
                要素があると、{noref}が1の場合は失敗する。
                copy()も参照。

                method としても使用できる:
                        GetObject()->deepcopy()

delete({fname} [, {flags}])                                     delete()
                {flags}を指定しないもしくは{flags}を空で指定した場合: ファイル
                {fname}を削除する。
                これは{fname}がシンボリックリンクの時でも動作する。

                {flags}が "d" の場合: ディレクトリ{fname}を削除する。
                これはディレクトリ{fname}が空でない場合は失敗する。

                {flags}が "rf" の場合: ディレクトリ{fname}、その中に含むすべて
                のものを再帰的に削除する。気をつけて!
                Note: MS-Windowsでは、使用中のディレクトリを削除することはでき
                ない。

                シンボリックリンクは、それが示すものではなく、リンク自身が削除
                される。

                結果は数値であり、削除に成功すれば 0/false、削除に(部分的にで
                も)失敗すれば -1/true である。

                リスト List から項目を削除するには remove() を使う。
                バッファから行を削除するには:deleteもしくはdeletebufline()
                を使う。

                method としても使用できる:
                        GetName()->delete()

deletebufline({expr}{first} [, {last}])               deletebufline()
                {first} から {last} (を含む) までの行をバッファ {expr} から削
                除する。{last} が省略されている場合、{first} 行だけを削除する。
                成功時には 0 が返され、失敗時には 1 が返される。

                この関数は、ロードされたバッファに対してのみ機能する。必要であ
                れば、最初に bufload() を呼び出すこと。

                {expr} の使い方は前述の bufname() を参照。

                {first} および {last} は getline() と同様に扱われる。Note:
                line() の使用はカレントバッファを参照する。バッファ {expr}
                内の最後の行を参照するには "$" を使用する。

                method としても使用できる:
                        GetBuffer()->deletebufline(1)

                                                        did_filetype()
did_filetype()  autocommandが実行されFileTypeイベントが一度でも起こっていれば、
                TRUEが返る。スクリプトのFileTypeイベントが、複数回呼び出され
                るのを回避するのに使える。 FileType
                :setf FALLBACK が使用されている場合は FALSE を返す。
                他のファイルへ移動すると、このカウンタはリセットされる。よって
                実際は、カレントバッファに対してFileTypeイベントが発生したかど
                うかを判定する。他のバッファを開く自動コマンドの中でこの関数を
                使って 'filetype' を設定し、構文ファイルを読み込むために使え
                る。

diff_filler({lnum})                                     diff_filler()
                {lnum}行目より上にある削除行の数を返す。削除行とは、差分モード
                で他方のウィンドウにテキストが挿入されていることを表す行のこと
                である。削除行は表示はされているが、実際にはバッファに存在しな
                い。
                {lnum}getline()と同様に扱われる。つまり "." はカレント行と
                なり、"'m" はマークmを表す。
                カレントウィンドウが差分モードでないときは0を返す。

                method としても使用できる:
                        GetLnum()->diff_filler()

diff_hlID({lnum}{col})                                diff_hlID()
                差分モードで{lnum}{col}桁(バイト単位)の位置のハイライトIDを
                返す。カレント行に変更がないときは0を返す。
                {lnum}getline()と同様に扱われる。つまり "." はカレント行と
                なり、"'m" はマークmを表す。
                先頭の桁の{col}は1となり、最初の行の{lnum}は1となる。
                ハイライトIDはsynIDattr()を使って構文情報を得るために使える。

                method としても使用できる:
                        GetLnum()->diff_hlID(col)


digraph_get({chars})                                    digraph_get() E1214
                {chars} のダイグラフを返す。これは正確に2文字の文字列である必
                要がある。もし {chars} が2文字ちょうどでない、もしくは {chars}
                のダイグラフがないなら、エラーとなり空文字列を返す。

                必要であれば文字はUnicodeから 'encoding' に変換される。変換が
                利用可能である必要があり、失敗することがある。

                digraph_getlist() も参照。

                例:
                " 組み込みのダイグラフの取得
                :echo digraph_get('00')         " '∞' が返る

                " ユーザー定義のダイグラフの取得
                :call digraph_set('aa', 'あ')
                :echo digraph_get('aa')         " 'あ' が返る

                method としても使用できる:
                        GetChars()->digraph_get()

                この関数は +digraphs 機能付きでコンパイルされたときのみ動作
                する。機能が無効の場合、この関数はエラーメッセージを表示する。


digraph_getlist([{listall}])                            digraph_getlist()
                ダイグラフのリストを返す。引数 {listall} が真で与えられたとき、
                デフォルトのダイグラフを含む全ダイグラフを返す。それ以外はユー
                ザー定義のダイグラフのみを返す。

                必要であれば文字はUnicodeから 'encoding' に変換される。変換が
                利用可能である必要があり、失敗することがある。

                digraph_get() も参照。

                例:
                " ユーザー定義のダイグラフの取得
                :echo digraph_getlist()

                " デフォルトを含む全ダイグラフの取得
                :echo digraph_getlist(1)

                method としても使用できる:
                        GetNumber()->digraph_getlist()

                この関数は +digraphs 機能付きでコンパイルされたときのみ動作
                する。機能が無効の場合、この関数はエラーメッセージを表示する。


digraph_set({chars}{digraph})                         digraph_set() E1205
                ダイグラフ {chars} をリストに追加する。{chars} は2文字の文字列
                の必要がある。{digraph} はUTF-8でエンコードされた1文字の文字
                列。合成文字は無視されないことに注意。この関数は :digraphs
                と同様だがスペース始まりのダイグラフを登録するのに便利である。

                この関数はダイグラフ digraph は登録されたなら v:true を返す。
                もし失敗したなら、エラーメッセージとともに v:false を返す。

                一度に複数のダイグラフを登録したいなら、digraph_setlist() が
                使える。

                例:
                        call digraph_set('  ', 'あ')

                method としても使用できる:
                        GetString()->digraph_set('あ')

                この関数は +digraphs 機能付きでコンパイルされたときのみ動作
                する。機能が無効の場合、この関数はエラーメッセージを表示する。


digraph_setlist({digraphlist})                          digraph_setlist()
                digraph_set() と同じだが複数のダイグラフを一度に追加できる。
                {digraphlist} はリストのリストで、各リストは digraph_set()
                と同じ {chars} と {digraph} の2つの文字列を持つ。
                例:
                    call digraph_setlist([['aa', 'あ'], ['ii', 'い']])

                これは以下と似ている:
                    for [chars, digraph] in [['aa', 'あ'], ['ii', 'い']]
                          call digraph_set(chars, digraph)
                    endfor
                しかし、この関数は最初のエラーでリターンし、それ以降のダイグラ
                フは追加されない点が異なる。

                method としても使用できる:
                    GetList()->digraph_setlist()

                この関数は +digraphs 機能付きでコンパイルされたときのみ動作
                する。機能が無効の場合、この関数はエラーメッセージを表示する。


echoraw({expr})                                         echoraw()
                {expr}を表示不可能な文字を含み、そのまま出力する。これは端末
                コードを出力するために使える。例えば、modifyOtherKeysを無効に
                するためには:
                        call echoraw(&t_TE)
                さらに再度有効にするためには:
                        call echoraw(&t_TI)
                この方法でターミナルを壊すことができるため、気を付けて取り扱う
                こと。

empty({expr})                                           empty()
                {expr}が空なら1を、そうでなければ0を返す。
                - リストListまたは辞書Dictionaryは要素を1個も持たないとき
                  空とみなされる。
                - 文字列 String はその長さが0のとき空とみなされる。
                - 数値と浮動小数点数は値が0のとき空とみなされる。
                - v:falsev:nonev:null は空であり、v:true は空では
                  ない。
                - ジョブ Job は開始に失敗したときは空である。
                - チャネル Channel は閉じられていると空である。
                - Blob はその長さが0のときは空である。

                長いリストに対しては長さを0と比較するよりこちらの方がずっと高
                速である。

                method としても使用できる:
                        mylist->empty()

environ()                                               environ()
                すべての環境変数を辞書として返す。このように環境変数が存在する
                かどうかを確認できる:
                        :echo has_key(environ(), 'HOME')
                Note 変数名はキャメルケース(CamelCase)でも構わない。大文字と小
                文字を区別しないためにこれを使用すること:
                        :echo index(keys(environ()), 'HOME', 0, 1) != -1

escape({string}{chars})                               escape()
                {string}内に現れる{chars}の文字をバックスラッシュでエスケープ
                する。例:
                        :echo escape('c:\program files\vim', ' \')
                結果:
                        c:\\program\ files\\vim
                shellescape() および fnameescape() も参照。

                method としても使用できる:
                        GetText()->escape(' \')

                                                        eval()
eval({string})  {string}を評価し、値を返す。string()の戻り値を元の値に戻すの
                に非常に便利である。数値、浮動小数点数、文字列、Blob およびそ
                れらの複合に対して動作する。実際に存在する関数への Funcref
                に対しても動作する。

                method としても使用できる:
                        argv->join()->eval()

eventhandler()                                          eventhandler()
                イベントハンドラの中では1を返す。つまり、ユーザーの文字入力を
                待っている間に、ファイルをドラッグ&ドロップするなど割り込みさ
                れたことを表す。このときは対話的なコマンドは使えない。イベント
                ハンドラの中でないときは0を返す。

executable({expr})                                      executable()
                {expr}という名前の実行可能ファイルが存在するかどうか判定する。
                {expr}は引数を何もつけないプログラム名でなければならない。
                executable()は$PATHと通常のプログラム検索ディレクトリを参照す
                る。                                    PATHEXT
                MS-Windowsでは ".exe"、".bat" などの拡張子は含めても含めなくて
                もよい。省略された場合は$PATHEXTの拡張子を検索する。よって
                "foo.exe" が存在しなければ "foo.exe.bat" が見つかることもあり
                うる。$PATHEXTが存在しなければ ".com;.exe;.bat;.cmd" が使われ
                る。$PATHEXTにドットだけを含めると拡張子なしの名前を検索するこ
                とができる。'shell' がUnixシェルのように思われるときは、{expr}
                の後に拡張子をつけない名前も検索される。
                MS-Windowsではファイルが存在するかどうかだけを判定し、それが
                ディレクトリでないことや、それが本当に実行可能であるかどうかは
                判定されない。
                MS-WindowsではVimと同じディレクトリにある実行ファイルは必ず発
                見できる。Vimがこのディレクトリを$PATHに加えるためである。
                win32-PATH
                戻り値は数値:
                        1       存在する
                        0       存在しない
                        -1      このシステム上では実装されていない
                exepath() は、実行ファイルの絶対パスを取得するのに使用するこ
                とができる。

                method としても使用できる:
                        GetCommand()->executable()

execute({command} [, {silent}])                                 execute()
                単一あるいは複数のExコマンドを実行して、出力を文字列として返
                す。
                {command} は文字列かリストを使える。リストの場合はそれらの行は
                一行ずつ実行される。
                以下と同等である:
                        redir => var
                        {command}
                        redir END

                オプションの {silent} の引数は以下の値を取ることができる:
                        ""              :silent を使わない
                        "silent"        :silent を使う
                        "silent!"       :silent!を使う
                デフォルトは "silent" である。Note "silent!" は redir とは異
                なり、エラーメッセージは削除されることに注意すること。もし外部
                コマンドを使って画面がおかしくなる様であれば、代わりに
                system()を使うことができる。
                                                        E930
                {command} の中のどこかで:redirを使うことができない。

                行のリストを得るために、出力にsplit()を使うことができる:

                        split(execute('args'), "\n")

                現在のウィンドウとは別のウィンドウでコマンドを実行するには
                win_execute() を使用すること。

                再帰的に使用されると、再帰呼び出しの出力は、上位呼び出しの出力
                に含まれない。

                method としても使用できる:
                        GetCommand()->execute()

exepath({expr})                                         exepath()
                {expr} が実行ファイルで、それが絶対パス、相対パス、または
                $PATH の中に存在する場合は、そのフルパスを返す。
                Note{expr} が "./" で開始している場合はカレントディレクトリ
                が使われる。Vim のパスを得る場合に問題になるかもしれない:
                        echo exepath(v:progpath)
                {expr} が $PATH の中に見つからないか、それが実行ファイルではな
                かった場合は空文字列が返る。

                method としても使用できる:
                        GetCommand()->exepath()

                                                        exists()
exists({expr})  結果は数値で、変数{expr}が存在すればTRUEとなり、そうでなけれ
                ば0となる。
                Note: コンパイルされる :def 関数内のローカル変数と引数は
                exists() からは見えない。

                ある機能がサポートされているか判定するにはhas()を使う。
                ファイルが存在するかを判定するにはfilereadable()を使う。

                引数{expr}は文字列で次のうちいずれかである。
                        &option-name    Vimオプション(存在するかだけを判定し、
                                        本当に動作するかは判定しない)
                        +option-name    動作するVimオプション
                        $ENVNAME        環境変数(空文字列と比較することでも判
                                        定できる)
                        *funcname       組み込み関数(functions参照)かユーザー
                                        が定義した関数(user-functions参照)の
                                        内、実装済みのもの。また Funcref であ
                                        る変数に対しても動作する。
                        ?funcname       実装されているかもしれない組み込み関数。
                                        "funcname" が有効かチェックするのに利
                                        用できる。
                        varname         内部変数(internal-variables)
                                        curly-braces-namesDictionaryの要
                                        素、Listの要素などに対しても動作する。
                                        コンパイルされる :def 関数内のローカ
                                        ル変数には動作しない。
                                        インデックスの評価で無効な式であるとエ
                                        ラーメッセージが出る可能性があることに
                                        注意。例:
                                           :let l = [1, 2, 3]
                                           :echo exists("l[5]")
                                           0
                                           :echo exists("l[xx]")
                                           E121: Undefined variable: xx
                                           0
                        :cmdname        exコマンド: 組み込みコマンド、ユーザー
                                        定義コマンド、コマンド修飾子:command
                                        戻り値:
                                        1  コマンド名の先頭に一致
                                        2  コマンド名に完全一致
                                        3  複数のユーザー定義コマンドに一致
                                        コマンドが定義されているかどうかを判定
                                        するには、必ず戻り値が2であるかを確認
                                        すること。
                        :2match         :2matchのコマンド。
                        :3match         :3matchのコマンド。
                        #event          このイベントに対する自動コマンド定義
                        #event#pattern  このイベントとパターンに対する自動コマ
                                        ンド定義(パターンは文字そのままに解釈
                                        され、自動コマンドのパターンと1文字ず
                                        つ比較される)
                        #group          自動コマンドグループが存在するか
                        #group#event    このグループとイベントに対して自動コマ
                                        ンドが定義されているか
                        #group#event#pattern
                                        このグループ、イベント、パターンに対す
                                        る自動コマンド定義
                        ##event         このイベントに対する自動コマンドがサ
                                        ポートされているか

                例:
                        exists("&shortname")
                        exists("$HOSTNAME")
                        exists("*strftime")
                        exists("*s:MyFunc")
                        exists("bufcount")
                        exists(":Make")
                        exists("#CursorHold")
                        exists("#BufReadPre#*.gz")
                        exists("#filetypeindent")
                        exists("#filetypeindent#FileType")
                        exists("#filetypeindent#FileType#*")
                        exists("##ColorScheme")
                シンボルである&/$/*と名前の間には、空白文字があってはならな
                い。
                ある少数の場合では無視されるが、名前の後に余計な文字があっては
                ならない。将来はもっと厳格になる可能性があるので、現在許される
                からといって頼ってはならない。
                正しい例:
                        exists(":make")
                正しくない例:
                        exists(":make install")

                Note 引数は変数そのものではなく、文字列でなければならない。例
                えば、次は動作しない:
                        exists(bufcount)
                これは変数 "bufcount" の存在を判定するのではなく、bufcountの値
                を渡し、それが存在するかどうか判定してしまう。

                method としても使用できる:
                        Varname()->exists()

exp({expr})                                             exp()
                {expr} の指数を返す。
                値は [0, inf] の範囲の浮動小数点数 (Float)。
                {expr} は浮動小数点数 (Float) か数値 (Number) でなければな
                らない。
                例:
                        :echo exp(2)
                        7.389056
                        :echo exp(-1)
                        0.367879

                method としても使用できる:
                        Compute()->exp()

                {+float 機能を有効にしてコンパイルしたときのみ有効}


expand({expr} [, {nosuf} [, {list}]])                           expand()
                ワイルドカードと{expr}内の特殊なキーワードを展開する。
                'wildignorecase' が適用される。

                {list} が指定されその値がTRUEなら、結果はリストで返される。
                そうでない場合は結果は文字列で返される。その場合、複数のマッチ
                があるときはそれらは文字 <NL> で区切られる。[Note: バージョン
                5.0 では空白文字が用いられ、スペースを含むファイル名について問
                題を引き起こしていた]

                展開が失敗した場合、結果は空文字列となる。{expr} が '%'、'#'、
                '<' で始まらない限り、存在しないファイル名というのは、結果の文
                字列には含まれない。下記を参照のこと。

                {expr} が '%' か '#' か '<' で始まる場合には、展開は
                cmdline-specialのように、変換子を受け付け、それらに関連付け
                られた変換が施される。ここに簡単な概略を示す:

                        %               現在のファイル名
                        #               代替バッファのファイル名
                        #n              n番の代替バッファのファイル名
                        <cfile>         カーソルの下のファイル名
                        <afile>         autocmdのファイル名
                        <abuf>          autocmdのバッファ名
                        <amatch>        autocmdのマッチした名称
                        <cexpr>         カーソル下のC言語の式
                        <sfile>         取り込み(source)中のファイル名、関数名
                        <slnum>         取り込み(source)中の行番号または関数内
                                        の行番号
                        <sflnum>        スクリプトファイルの行番号。関数内でも
                                        同様。
                        <SID>           "<SNR>123_"  ここで "123" は現在のスク
                                        リプトのID <SID>
                        <stack>         コールスタック
                        <cword>         カーソル下の単語(word)
                        <cWORD>         カーソル下の単語(WORD)
                        <client>        最後に受け取ったメッセージの{clientid}
                                        server2client()
                変換子:
                        :p              フルパス名を展開
                        :h              ヘッド(ディレクトリ)
                        :t              テイル(ファイル名だけ)
                        :r              拡張子が削除される
                        :e              拡張子だけ

                例:
                        :let &tags = expand("%:p:h") . "/tags"
                '%' や '#' や '<' で始まる文字列を展開する時には、それに続くテ
                キストは無視されることに注意。従ってこれは正しくない:
                        :let doesntwork = expand("%:h.bak")
                こうすると良い:
                        :let doeswork = expand("%:h") . ".bak"
                "<cfile>" やそれらを展開する時には、戻り値が完全な展開をされな
                い参照名であることにも注意が必要。もしも "<cfile>" が
                "~/.cshrc" であった場合、"~/" を展開してホームディレクトリにす
                るために、もう一度expand()を呼び出す必要がある:
                        :echo expand(expand("<cfile>"))

                変数と変換子の間には空白文字があってはならない。関数
                fnamemodify()が通常のファイル名の変換には使用可能である。

                カレントバッファや代替バッファの名前が未定義のときに '%' や
                '#' を使うと空文字列になる。"%:p" を名無しのバッファに使用した
                場合、結果はカレントディレクトリに '/' が付加されたものになる。

                '%' や '#' や '<' で始まらない{expr}は、コマンドラインのファイ
                ル名と同じように展開される。{nosuf}引数にTRUEを指定しない限
                り、'suffixes' と 'wildignore' が使用される。
                存在しないファイルの名前も結果の文字列に含まれる。"**" を使う
                とディレクトリツリーを検索できる。例えば、カレントディレクトリ
                以下にある全ての "README" を見つけるには次のようにする:
                        :echo expand("**/README")

                expand() はシェルの持っている変数や環境変数を展開できる。しか
                し展開のためにシェルを起動するかもしれないので速度が遅くなるこ
                とがある。expr-env-expand 参照。
                展開された変数はファイル名のリストのように扱われる。環境変数を
                展開できないときはそのままになる。よって、
                ":echo expand('$FOOBAR')" の結果は "$FOOBAR" となる。

                存在するファイルを探すにはglob()を参照。外部コマンドの「生
                の」実行結果を扱うにはsystem()を参照。

                method としても使用できる:
                        Getpattern()->expand()

expandcmd({expr})                                       expandcmd()
                :edit などのExコマンドに対しておこなわれているように、{expr}
                の特殊な項目を展開する。これは {expr} の中のどこでも、
                expand() のような特殊なキーワードと環境変数を展開する。
                "~user" および "~/path" は冒頭でのみ展開される。展開された文字
                列を返す。例:
                        :echo expandcmd('make %<.o')

                method としても使用できる:
                        GetCommand()->expandcmd()

extend({expr1}{expr2} [, {expr3}])                    extend()
                {expr1}{expr2}は両方ともリストListであるか、両方とも辞書
                Dictionariesでなければならない。

                両方ともリストであるなら、{expr2}{expr1}に付け加える。
                {expr3}が指定された場合は、{expr1}の第{expr3}番目の要素の前に
                {expr2}の要素を挿入する。{expr3}が0のときは最初の要素の前に挿
                入する。{expr3}がlen({expr1})に等しいときは末尾に{expr2}が付け
                加えられる。
                例:
                        :echo sort(extend(mylist, [7, 5]))
                        :call extend(mylist, [2, 3], 1)
                {expr1} が {expr2} と同じリストである場合、コピーされる要素の
                数はリストの元の長さと同じである。
                例として {expr3} が 1 のとき、最初の要素の N 個の新しいコピー
                が挿入される(ここで N はリストの元の長さ)。
                リストに1個の要素を加えるにはadd()を使う。2つのリストを連結
                して新しいリストを作るには演算子+を使う:
                        :let newlist = [1, 2, 3] + [4, 5]

                両方とも辞書である場合:
                {expr2}の全要素を{expr1}に加える。
                {expr1}{expr2}で共通のキーがある場合は、{expr3}によって動作
                が決まる:
                {expr3} = "keep" の場合: {expr1}の値そのままにする
                {expr3} = "force" の場合: {expr2}の値で上書きする
                {expr3} = "error" の場合: エラーメッセージを表示する    E737
                {expr3}が省略された場合は "force" と同じになる。

                {expr2}が空でないならば{expr1}が変更される。必要ならば最初に
                {expr1}のコピーを作ること。
                {expr2}は変更されない。
                {expr1} がロックされていて、かつ {expr2} が空でない場合は操作
                は失敗する。
                {expr1}を返す。

                method としても使用できる:
                        mylist->extend(otherlist)


extendnew({expr1}{expr2} [, {expr3}])                 extendnew()
                extend() と同様だが、{expr1} へ要素を追加する代わりに、新し
                いリストまたは辞書が作成されて返される。{expr1} は変更されな
                い。要素は引き続き {expr2} で変更できるが、そうしたくないなら
                最初に deepcopy() を利用すること。


feedkeys({string} [, {mode}])                           feedkeys()
                {string}中の各文字を、あたかもマッピングまたはユーザーによって
                タイプされたかのように、処理キューに入れる。

                デフォルトではこれらの文字は先行入力バッファの末尾に付け足され
                る。そのためマッピングを展開している途中であれば、これらの文字
                はマッピングを展開した後に来ることになる。他の文字の前に挿入す
                るには、'i' フラグを使用する。それらはマッピングからの任意の文
                字の前の挿入の次に実行される。

                この関数は、{string}中の文字が処理されるまでは待たない。

                特殊なキーを{string}に含めるにはダブルクォートと "\..." 記法を
                使う(expr-quoteを参照)。例えば、feedkeys("\<CR>")は<Enter>
                キーの押下をシミュレートする。しかしfeedkeys('\<CR>')とすると、
                この文字の通り5文字を挿入する。
                役に立つかもしれない特別なコードは <Ignore> だ。それは何もせず
                に文字の待機を終了する。  <Ignore>

                {mode}は以下の文字フラグを含む文字列:
                'm'     キーをマップ展開する。これが既定である。{mode}が省略さ
                        れたときは、挿入されたキーはマップ展開の対象になる。
                'n'     キーをマップ展開しない。
                't'     キーをタイプされたかのように扱う。そうでない場合は
                        マッピングから展開されたかのように扱われる。これは
                        undoや折り畳みの展開などで違いが現れる。
                'L'     低レベル入力。UnixまたはGUIを使用している場合にのみ機
                        能する。キーは端末から来ているかのように使われる。他の
                        フラグは使用されない。  E980
                        CTRL-C で割り込み時、かつ 't' が含まれていると内部
                        "got_int" フラグが設定される。
                'i'     追加する代わりに文字を挿入する。(上記参照)
                'x'     先行入力が空になるまでコマンドを実行する。
                        これは ":normal!" を使うのと似ている。
                        'x' なしで数回feedkeys()を呼んだ後、'x' ありで1回
                        ({string}が空でも可能) feedkeys()を呼ぶことで先行入力
                        をすべて実行できる。Note Vimが挿入モードを終了したとき
                        は、スクリプト続行前の文字入力待ちによる立ち往生を避け
                        るために、<Esc>が入力されたかのように振る舞う。
                        Note コマンドの実行中に feedkeys() を再帰的に呼び出し
                        た場合、最後の呼び出しですべての先行入力が消費される。
                '!'     'x' と一緒に使用すると挿入モードを終了しない。タイマー
                        が少し後で挿入モードを終了するように設定されているとき
                        にテストで使用できる。CursorHoldIのテストに便利である。

                戻り値は常に0。

                method としても使用できる:
                        GetInput()->feedkeys()

                                                        filereadable()
filereadable({file})
                結果は数値で、{file}というファイルが存在し、読み込むことが可能
                ならばTRUEとなる。ファイル{file}が存在しないかディレクトリ
                だった場合には、結果はFALSEとなる。引数{file}は文字列として
                使えればどのような表現でもよい。
                ファイルが読み込み可能でなくてもよい場合にはglob()を使う。
                {file} はそのまま使用されるため、最初にワイルドカードを展開す
                ることを推奨する:
                        echo filereadable('~/.vimrc')
                        0
                        echo filereadable(expand('~/.vimrc'))
                        1

                method としても使用できる:
                        GetName()->filereadable()
                                                        file_readable()
                以前の名前: file_readable().

filewritable({file})                                    filewritable()
                結果は数値で、{file}というファイルが存在し、書き込むことが可能
                ならば1となる。ファイル{file}が存在しないか書き込み不可能であ
                る場合には、結果は0となる。{file}がディレクトリであり、書き込
                み可能な場合、結果は2となる。

                method としても使用できる:
                        GetName()->filewritable()


filter({expr1}{expr2})                                        filter()
                {expr1}はリストListBlob、辞書Dictionaryでなければなら
                ない。
                {expr1}の各要素に対して{expr2}を評価し、その結果が0ならばリス
                トまたは辞書からその要素を削除する。Blob であればそのバイト
                を削除する。

                {expr2}は文字列stringまたは関数参照Funcrefでなければならな
                い。

                {expr2}が文字列の場合、{expr2}の内部ではv:valが現在の要素の
                値を保持している。辞書の場合はv:keyが現在の要素のキーを保持
                しており、リストの場合はv:keyが現在の要素のインデックスを保
                持している。Blob の場合は v:key が現在のバイトのインデック
                スになる。
                例:
                        call filter(mylist, 'v:val !~ "OLD"')
                は要素 "OLD" を削除する。
                        call filter(mydict, 'v:key >= 8')
                は8未満のキーを持つ要素を削除する。
                        call filter(var, 0)
                は全要素を削除する。つまりリストまたは辞書をクリアする。

                Note {expr2}は式を表す文字列である。バックスラッシュを二重に
                しなくても済むようにliteral-stringを使うとよいだろう。ただし
                その場合はシングルクォートを二重にしなければならない。

                {expr2}Funcrefの場合は、2つの引数で呼び出される:
                        1. 現在の要素のキーまたはインデックス。
                        2. 現在の要素の値。
                関数は、その要素を保持すべきときはTRUEを返さなければならな
                い。リストの奇数版目の要素を保持する例:
                        func Odd(idx, val)
                          return a:idx % 2 == 1
                        endfunc
                        call filter(mylist, function('Odd'))
                lambda を使えばより短く書ける:
                        call filter(myList, {idx, val -> idx * val <= 42})
                "val" を使わない場合は省略できる:
                        call filter(myList, {idx -> idx % 2 == 1})

                この操作はその場で(in-place)行われる。リストや辞書を変更したく
                ない場合は最初にコピーを作ること:
                        :let l = filter(copy(mylist), 'v:val =~ "KEEP"')

                {expr1}のリスト ListBlob、 または辞書 Dictionary をフ
                ィルターした結果を返す。{expr2}を評価している最中にエラーが発
                生した場合は、{expr1}内のそれ以降の要素の処理は行われない。
                {expr2}が関数参照の場合、関数が "abort" フラグつきで定義されて
                いない限り、関数内のエラーは無視される。

                method としても使用できる:
                        mylist->filter(expr2)

finddir({name} [, {path} [, {count}]])                          finddir()
                {path}から{name}という名前のディレクトリを探す。ディレクトリを
                上方・下方のどちらにも再帰的に検索できる。{path}の記法について
                はfile-searchingを参照。
                最初に見つかったディレクトリのパスを返す。そのディレクトリがカ
                レントディレクトリの下にある場合は相対パスを返す。そうでなけれ
                ば絶対パスを返す。
                {path}が省略されたとき、または空のときはオプション 'path' の値
                が使われる。
                省略可能な引数{count}が指定されたときは、最初に見つかったディ
                レクトリでなく、{count}番目に見つかったディレクトリを返す。
                {count}が負の場合は、見つかったディレクトリ全てのリストList
                を返す。これはexコマンド:findによく似ている。
                {+file_in_path 機能付きでコンパイルされたときのみ利用可能}

                method としても使用できる:
                        GetName()->finddir()

findfile({name} [, {path} [, {count}]])                         findfile()
                finddir()と同様だが、ディレクトリでなくファイルを検索する。
                'suffixesadd' が適用される。
                例:
                        :echo findfile("tags.vim", ".;")
                この例は、カレントファイルがあるディレクトリから上方に
                "tags.vim" を見つけるまで再帰的に検索する。

                method としても使用できる:
                        GetName()->findfile()

flatten({list} [, {maxdepth}])                                  flatten()
                リスト {list} を {maxdepth} の深さまで平坦化する。{maxdepth}
                が無い場合の結果は {maxdepth} が非常に巨大な数であるのように、
                リスト List からネストを除去する。
                {list} は変更が入るので、それを望まないなら flattennew() を
                使うこと。
                Vim9 script では flatten() は使用できないため、常に
                flattennew() を使う必要がある。
                                                                E900
                {maxdepth} はリストのネストをどれだけ深く変更するかを意味する。
                {maxdepth} が0なら {list} は変更されない。
                {maxdepth} は正の数でなければならない。

                エラーがあったときは数値の0を返す。

                例:
                        :echo flatten([1, [2, [3, 4]], 5])
                        [1, 2, 3, 4, 5]
                        :echo flatten([1, [2, [3, 4]], 5], 1)
                        [1, 2, [3, 4], 5]

flattennew({list} [, {maxdepth}])                       flattennew()
                flatten() と同様だが最初に {list} のコピーを作る。


float2nr({expr})                                        float2nr()
                {expr} の小数点以下を切り捨てて Number に変換する。
                {expr} は Float または Number に評価されなければならない。
                {expr} の値が Number の範囲外の場合、結果は 0x7fffffff また
                は -0x7fffffff になる(64ビット数値が有効化されている場合は
                0x7fffffffffffffff または -0x7fffffffffffffff)。
                NaN は -0x80000000 になる(64ビット数値が有効化されている場合は
                -0x8000000000000000)。
                例:
                        echo float2nr(3.95)
                        3 
                        echo float2nr(-23.45)
                        -23 
                        echo float2nr(1.0e100)
                        2147483647  (または 9223372036854775807)
                        echo float2nr(-1.0e150)
                        -2147483647  (または -9223372036854775807)
                        echo float2nr(1.0e-100)
                        0

                method としても使用できる:
                        Compute()->float2nr()

                {+float 機能つきでコンパイルされたときのみ有効}


floor({expr})                                                   floor()
                {expr} 以下の最大の整数を Float で返す(切り捨て)。
                {expr} は Float または Number に評価されなければならな
                い。
                例:
                        echo floor(1.856)
                        1.0 
                        echo floor(-5.456)
                        -6.0 
                        echo floor(4.0)
                        4.0

                method としても使用できる:
                        Compute()->floor()

                {+float 機能つきでコンパイルされたときのみ有効}


fmod({expr1}{expr2})                                  fmod()
                {expr1} / {expr2} の余りを返す (割り算が表現できなくても)。
                {expr2} が非ゼロなら {expr1} - i * {expr2} の結果を返す (i は
                戻り値が {expr1} と同じ符号を持ちその絶対値が {expr2} よりも小
                さくなるような値)。{expr2} がゼロならゼロが返る。戻り値の型は
                浮動小数点数 (Float)。
                {expr1} と {expr2} は浮動小数点数 (Float) か数値 (Number)
                でなければならない。
                例:
                        :echo fmod(12.33, 1.22)
                        0.13
                        :echo fmod(-12.33, 1.22)
                        -0.13

                method としても使用できる:
                        Compute()->fmod(1.22)

                {+float 機能を有効にしてコンパイルしたときのみ有効}


fnameescape({string})                                   fnameescape()
                コマンド引数のファイル名として使うために {string} をエスケープ
                する。'%' や '|' など特別な意味を持つ全ての文字がバックスラッ
                シュでエスケープされる。
                特別な文字とは、ほとんどのシステムにおいて
                " \t\n*?[{`$\\%#'\"|!<" である。ファイル名にバックスラッシュが
                現れるシステムにおいては 'isfname' の値に依存する。
                先頭の '+' と '>' もエスケープされる(:edit と :write の引
                数では特別な意味を持つ)。{string} が "-" である場合もエスケー
                プされる(:cd の引数では意味を持つ)。
                例:
                        :let fname = '+some str%nge|name'
                        :exe "edit " . fnameescape(fname)
                上記は次と同じ結果になる:
                        edit \+some\ str\%nge\|name

                method としても使用できる:
                        GetName()->fnameescape()

fnamemodify({fname}{mods})                            fnamemodify()
                ファイル名{fname}{mods}にしたがって変更する。{mods}はコマン
                ドラインで使われるのと同様な文字列である。詳細は
                filename-modifiersを参照。
                例:
                        :echo fnamemodify("main.c", ":p:h")
                結果:
                        /home/mool/vim/vim/src/
                {mods} が空なら {fname} を返す。
                Note{fname}の中の環境変数は展開されない。環境変数を展開させ
                るにはexpand()を使うこと。

                method としても使用できる:
                        GetName()->fnamemodify(':p:h')

foldclosed({lnum})                                      foldclosed()
                結果は数値。{lnum}行目が閉じた折り畳みの中にあるなら、その折り
                畳みを構成する最初の行の行番号を返す。{lnum}行目が閉じた折り畳
                みに入っていないなら-1を返す。
                {lnum} は getline() と同様に扱われる。例えば "." は現在の行、
                "'m" は m でマークした行、など。

                method としても使用できる:
                        GetLnum()->foldclosed()

foldclosedend({lnum})                                   foldclosedend()
                結果は数値。{lnum}行目が閉じた折り畳みの中にあるなら、その折り
                畳みを構成する最後の行の行番号を返す。{lnum}行目が閉じた折り畳
                みに入っていないなら-1を返す。
                {lnum} は getline() と同様に扱われる。例えば "." は現在の行、
                "'m" は m でマークした行、など。

                method としても使用できる:
                        GetLnum()->foldclosedend()

foldlevel({lnum})                                       foldlevel()
                カレントバッファの{lnum}行目の折り畳みレベルを表す数値を返す。
                折り畳みがネストしているときは一番下のレベルを返す。{lnum}行目
                に折り畳みがまったくないときは0を返す。折り畳みが開いているか
                閉じているかは関係ない。('foldexpr' の中で)折り畳みを更新して
                いる最中に呼ぶと、まだ折り畳みを更新していなく、折り畳みレベル
                が未知の行に対しては-1を返す。特別な場合として、普通は1行前の
                レベルは取得できる。
                {lnum} は getline() と同様に扱われる。例えば "." は現在の行、
                "'m" は m でマークした行、など。

                method としても使用できる:
                        GetLnum()->foldlevel()

                                                        foldtext()
foldtext()      閉じた折り畳みに表示する文字列を返す。これはオプション
                'foldtext' のデフォルトの関数であり、'foldtext' を評価している
                ときにだけ呼ぶようにすべきである。この関数は変数v:foldstart,
                v:foldendv:folddashesを使用する。
                戻り値の文字列は次のようになる:
                        +-- 45 lines: abcdef
                先導するダッシュ(-)の数は折り畳みレベルによって決まる。"45" は
                その折り畳みに含まれている行数である。"abcdef" はその折り畳み
                の中の最初の空行でない行のテキストである。行頭の空白と、"//"
                や "/*"、'foldmarker' と'commentstring' に設定されている文字列
                は削除される。
                実際に折り畳みテキストを表示するときには、行の残りは
                'fillchars' で設定した折り畳み用の文字で埋められる。
                {+folding機能付きでコンパイルされたときのみ利用可能}

foldtextresult({lnum})                                  foldtextresult()
                {lnum}行目の閉じた折り畳みに表示される文字列を返す。'foldtext'
                を適切なコンテキストの中で評価する。{lnum}行目に閉じた折り畳み
                がないときは空文字列を返す。
                {lnum}getline()のときと同様に扱われる。つまり "." はカレン
                ト行、"'m" はマークmを表す。
                折り畳まれたテキストをHTMLなどにエクスポートするときに有用。
                {+folding機能付きでコンパイルされたときのみ利用可能}


                method としても使用できる:
                        GetLnum()->foldtextresult()

                                                        foreground()
foreground()    Vimのウィンドウを前面に移動する。この関数はクライアントからVim
                サーバーへ送ると便利である。remote_send()
                Win32では自分自身のウィンドウを前面に持ってくることが必ずしも
                許可されていないので、動作しないかもしれない。そのときは代わり
                にremote_foreground()を使うこと。
                {Win32, Athena, Motif, GTKいずれかのGUI版とWin32コンソール版で
                のみ利用できる}

fullcommand({name})                                             fullcommand()
                短縮コマンド名から完全なコマンド名を取得する。コマンドの短縮名
                については 20.2 を参照。

                {name} は : から始まっても [range] を含んでよいが、それらは
                スキップされ戻り値には含まない。
                コマンドが存在しないか、曖昧になってしまう場合空文字列を返す
                (ユーザー定義関数用)。

                例えば fullcommand('s')、 fullcommand('sub')
                fullcommand(':%substitute') はすべて "substitute" を返す。

                method としても使用できる:
                        GetName()->fullcommand()

                                                funcref()
funcref({name} [, {arglist}] [, {dict}])
                function()と同様である。ただし、返されたFuncrefは、関数を名
                前ではなく参照で検索する。これは関数{name}が後で再定義されると
                きに重要である。

                function()とは違い、{name}はユーザー定義関数として存在してい
                なければならない。また、autoload関数についても同様である。
                {name}は組込み関数であってはならない。

                method としても使用できる:
                        GetFuncname()->funcref([arg])

                                function() partial E700 E922 E923
function({name} [, {arglist}] [, {dict}])
                関数{name}を参照するFuncrefの変数を返す。{name}はユーザー定義
                関数でも組み込み関数でもよい。

                ここで{name}は関数の参照、もしくは部分適用である。部分適用であ
                るとき、それに格納されている辞書が使用され、{dict}引数が使用で
                きない。例:
                        let FuncWithArg = function(dict.Func, [arg])
                        let Broken = function(dict.Func, [arg], dict)

                Funcrefが利用されるとき、その関数は{name}から見つけられる。こ
                れは後で再定義された場合も同様である。常に同じ関数を見つけるた
                めにはfuncref()を使うこと。

                {arglist}もしくは{dict}が与えられると、関数の部分適用が作られ
                る。すなわち引数のリスト及び/または辞書はFuncrefに格納され、
                そのFuncrefが呼ばれるときに使用される。

                格納された引数は他の引数よりも前に関数に渡される。しかし、メ
                ソッドからの任意の引数の後になる。例えば:
                        func Callback(arg1, arg2, name)
                        ...
                        let Partial = function('Callback', ['one', 'two'])
                        ...
                        call Partial('name')
                関数は次のように呼び出す:
                        call Callback('one', 'two', 'name')

                method の場合:
                        func Callback(one, two, three)
                        ...
                        let Partial = function('Callback', ['two'])
                        ...
                        eval 'one'->Partial('three')
                次のように関数を呼び出す:
                        call Callback('one', 'two', 'three')

                function()はFuncrefにより多くの引数を加えるためにネストして呼
                び出すことができる。余分な引数は、引数のリストに追加される。
                例えば:
                        func Callback(arg1, arg2, name)
                        ...
                        let Func = function('Callback', ['one'])
                        let Func2 = function(Func, ['two'])
                        ...
                        call Func2('name')
                これは次のように関数を呼び出す:
                        call Callback('one', 'two', 'name')

                辞書は "dict" 関数を呼び出すときのみ有用である。この場合、
                {dict}は "self" として渡される。例えば:
                        function Callback() dict
                           echo "called for " . self.name
                        endfunction
                        ...
                        let context = {"name": "example"}
                        let Func = function('Callback', context)
                        ...
                        call Func()     " will echo: called for example
                余分な引数がない場合、function()は必要ない。以下の二つは同等で
                ある:
                        let Func = function('Callback', context)
                        let Func = context.Callback

                引数のリストと辞書を同時に使用することもできる:
                        function Callback(arg1, count) dict
                        ...
                        let context = {"name": "example"}
                        let Func = function('Callback', ['one'], context)
                        ...
                        call Func(500)
                これは次のように関数を呼び出す:
                        call context.Callback('one', 500)

                method としても使用できる:
                        GetFuncname()->function([arg])

garbagecollect([{atexit}])                              garbagecollect()
                循環参照を持ち、使われていないリストList、辞書
                Dictionaries、チャネルChannels、ジョブJobs をクリーン
                アップする。

                これはメモリ不足に陥ったときや、'updatetime' 経過後ユーザーの
                キー入力を待っているときに自動的に行われるので、この関数を呼ぶ
                必要があることはほとんどない。循環参照を持たない要素は、使われ
                なくなったとき必ず解放される。長時間実行されるスクリプトの中で
                循環参照を持つ非常に大きなリストや辞書を削除したときに有用であ
                る。

                省略可能な引数 {atexit} に 1 を指定すると、Vim を終了するとき
                にもガーベッジコレクションが行われる。これはメモリリークを発見
                するのに役に立つ。

                ガーベッジコレクションはすぐには実行されず、安全な場合のみ実行
                される。これはユーザーが文字を入力するのを待っているときであ
                る。ガーベッジコレクションを強制するには、すぐに
                test_garbagecollect_now()を使用すること。

get({list}{idx} [, {default}])                        get()
                リストList {list}から{idx}番目の要素を取得する。この要素を取
                得できないときは{default}を返す。{default}が省略されたときは0
                を返す。
                method として使用したいなら:
                        mylist->get(idx)
get({blob}{idx} [, {default}])
                Blob {blob}から{idx}番目のバイトを取得する。このバイトを取得
                できないときは{default}を返す。{default}が省略されたときは -1
                を返す。
                method として使用したいなら:
                        myblob->get(idx)
get({dict}{key} [, {default}])
                辞書Dictionary {dict}からキー{key}に関連づけられた値を取得す
                る。この要素を取得できないときは{default}を返す。{default}が省
                略されたときは0を返す。便利な例:
                        let val = get(g:, 'var_name', 'default')
                g:var_nameの値が存在する場合はこれを取得し使用するが、存在しな
                い場合は 'default' を返す。
                method として使用したいなら:
                        mydict->get(key)
get({func}{what})
                Funcref {func}から項目を取得する。{what}の可能な値は:
                        "name"  関数名
                        "func"  関数
                        "dict"  辞書
                        "args"  引数リスト
                method として使用したいなら:
                        myfunc->get(what)

                                                        getbufinfo()
getbufinfo([{expr}])
getbufinfo([{dict}])
                バッファの情報を辞書のリストとして取得する。

                引数なしの場合、すべてのバッファに関する情報が返される。

                引数が辞書 Dictionary の場合、指定された条件を満たすバッファ
                のみが返される。{dict}には以下のキーを指定できる:
                        buflisted       リストされたバッファのみを含む。
                        bufloaded       ロードされたバッファのみを含む。
                        bufmodified     修正されたバッファのみを含む。

                それ以外の場合、{expr}は情報を返す特定のバッファを指定する。
                {expr}の使用については、上記のbufname()を参照。バッファが見
                つかった場合、返されるListには1つの項目がある。それ以外の場合、
                結果は空のリストになる。

                返される各List項目は、次のエントリを持つ辞書である:
                        bufnr           バッファ番号。
                        changed         バッファが変更されている場合はTRUE。
                        changedtick     バッファに加えられた変更の数。
                        hidden          バッファが隠されている場合はTRUE。
                        lastused        バッファが最後に使用されたときの
                                        localtime() のような秒単位のタイムス
                                        タンプ。
                                        {+viminfo 機能付きでコンパイルされた
                                        ときのみ有効}
                        listed          バッファがリストされている場合はTRUE。
                        lnum            バッファがカレントウィンドウに表示され
                                        ていたときの現在行の行番号。
                                        過去にバッファがカレントウィンドウに表
                                        示されていた場合にのみ有効である。特定
                                        のウィンドウの最後のカーソル位置の行番
                                        号が必要な場合は line() を使うこと:
                                                :echo line('.', {winid}))

                        linecount       バッファ内の行数 (ロードされているとき
                                        のみ有効)
                        loaded          バッファがロードされている場合はTRUE。
                        name            バッファ内のファイルへのフルパス。
                        signs           バッファに設置された目印のリスト。
                                        各リスト項目は、次のフィールドを含む辞
                                        書である:
                                            id    目印ID
                                            lnum  行番号
                                            name  目印名
                        variables       バッファローカル変数の辞書への参照。
                        windows         バッファを表示するwindow-IDのリスト
                        popups          バッファを表示するpopupwindow-idのリ
                                        スト

                例:
                        for buf in getbufinfo()
                            echo buf.name
                        endfor
                        for buf in getbufinfo({'buflisted':1})
                            if buf.changed
                                ....
                            endif
                        endfor

                バッファローカルオプションを取得するには:
                        getbufvar({bufnr}, '&option_name')

                method としても使用できる:
                        GetBufnr()->getbufinfo()


                                                        getbufline()
getbufline({expr}{lnum} [, {end}])
                バッファ{expr}{lnum}行目から{end}行目まで(両端含む)の行から
                なるリストListを返す。{end}が省略されたときは{lnum}行目だけ
                からなるリストを返す。

                {expr}の指定の仕方についてはbufname()を参照。

                {lnum}{end}では "$" でバッファの最後の行を表すことができる。
                それ以外は数値でなければならない。

                {lnum}が1より小さいときや、バッファの行数より大きいときは空リ
                ストを返す。

                {end}がバッファの行数より大きいときは、バッファの行数が設定さ
                れたものとして扱う。{end}{lnum}行目より前に設定された場合は
                空リストを返す。

                この関数は読み込まれているバッファに対してのみ動作する。既にア
                ンロードされているバッファや存在しないバッファに対しては空リス
                トを返す。

                例:
                        :let lines = getbufline(bufnr("myfile"), 1, "$")

                method としても使用できる:
                        GetBufnr()->getbufline(lnum)

getbufvar({expr}{varname} [, {def}])                          getbufvar()
                バッファ{expr}のオプションの値やバッファローカル変数{varname}
                の値を返す。Note "b:" をつけない変数名を指定すること。
                {varname} が空文字列の場合、全てのバッファローカル変数からなる
                辞書 Dictionary を返す。
                {varname} が "&" に等しいとき、すべてのバッファローカルオプショ
                ンを持つ辞書 Dictionary を返す。
                そうでなく、{varname} が "&" で始まるとき、バッファローカルオ
                プションの値を返す。
                グローバルオプション、バッファローカルオプションのどちらに対し
                ても動作するが、グローバル変数、ウィンドウローカル変数、ウィン
                ドウローカルオプションに対しては動作しない。
                {expr}の指定の仕方についてはbufname()を参照。
                バッファや変数が存在しないときは{def}または空文字列を返し、エ
                ラーメッセージは表示されない。
                例:
                        :let bufmodified = getbufvar(1, "&mod")
                        :echo "todo myvar = " . getbufvar("todo", "myvar")

                method としても使用できる:
                        GetBufnr()->getbufvar(varname)

getchangelist([{expr}])                                 getchangelist()
                バッファ {expr} の changelist を返す。{expr} の使い方は前述
                の bufname() を参照。バッファ {expr} が存在しない場合、空の
                リストが返される。

                返されるリストは 2 つのエントリを含む: 変更位置のリストと、リ
                スト内の現在地。変更リスト内のそれぞれの項目は、以下の項目を含
                む辞書になっている:
                        col             列番号
                        coladd          'virtualedit' 用の列のオフセット
                        lnum            行番号
                バッファ {expr} がカレントバッファの場合、現在地はリスト内の位
                置を指す。それ以外のバッファではリストの長さに設定される。

                method としても使用できる:
                        GetBufnr()->getchangelist()

getchar([expr])                                         getchar()
                ユーザーまたは入力ストリームから1文字を取得する。
                [expr] が省略された場合、1文字を取得できるまで待つ。
                [expr] が0の場合、1文字を取得できる時だけ取得する。取得できな
                        い時は0を返す。
                [expr] が1の場合は、1文字を取得できるかを判定するだけである。
                        入力は消費されない。取得できないと判定された時は0を返
                        す。
                常に文字列として取得したい場合は getcharstr() を使用する。

                [expr] が省略されたときや [expr] が0のときは、文字全体または特
                殊キーを返す。それが1文字なら戻り値は数値である。これを文字列
                に戻すにはnr2char()を使う。それ以外の場合にはエンコードして文
                字列にして返す。
                特殊キーとは0x80(10進数で128)で始まるバイト列からなる文字列で
                ある。これは文字列 "\<Key>" と同じ値である(例: "\<Left>")。戻
                り値は文字列であり、修飾キー(shift, control, alt)は含まれない。

                [expr] が0や Esc が入力された場合は、これがエスケープシーケン
                スの始まりであるかどうかをVimが知るために待つ間、短い遅延があ
                るだろう。

                [expr] が1のときは最初のバイトだけを返す。1バイト文字の場合、
                これはその文字そのものを表す数値である。これを文字列に変換する
                にはnr2char()を使う。

                修飾キーを取得するには getcharmod() を使う。

                ユーザーがマウスをクリックしたときはマウスイベントを返す。クリッ
                クした位置はv:mouse_colv:mouse_lnumv:mouse_winid,
                v:mouse_winで得られる。getmousepos() も使える。マウスの移
                動イベントは無視される。
                以下の例は、普通にマウスがクリックされたときと同じようにカーソ
                ルを移動させる。
                        let c = getchar()
                        if c == "\<LeftMouse>" && v:mouse_win > 0
                          exe v:mouse_win . "wincmd w"
                          exe v:mouse_lnum
                          exe "normal " . v:mouse_col . "|"
                        endif

                bracketed pasteを使用しているときは最初の文字のみが返され、ペー
                ストされた残りのテキストは切り捨てられる。
                xterm-bracketed-paste.

                この関数を呼んだときプロンプトは表示されない。文字入力を待って
                いることをなんらかの方法でユーザーがわかるようにしなければなら
                ないだろう。画面は再描画されない、例えばウィンドウのリサイズ。
                ポップアップウィンドウを使っているなら popup-filter を使うと
                よりよく動作する。
                入力された文字に対してマッピングは適用されない。
                キーコードは置換される。つまりユーザーが<Del>を押した場合、
                「生の」文字シーケンスでなく<Del>キーに対応するコードが得られ
                る。
                例:
                        getchar() == "\<Del>"
                        getchar() == "\<S-Left>"
                以下の例は大文字・小文字を区別しないように "f" を再定義する:
                        :nmap f :call FindChar()<CR>
                        :function FindChar()
                        :  let c = nr2char(getchar())
                        :  while col('.') < col('$') - 1
                        :    normal l
                        :    if getline('.')[col('.') - 1] ==? c
                        :      break
                        :    endif
                        :  endwhile
                        :endfunction

                あなたは<CursorHold>のような合成文字も取得するかもしれない。
                多くの場合、あなたはこれを無視して別の文字を取得することにな
                る:
                        :function GetKey()
                        :  let c = getchar()
                        :  while c == "\<CursorHold>"
                        :    let c = getchar()
                        :  endwhile
                        :  return c
                        :endfunction

getcharmod()                                            getcharmod()
                最後にgetchar()などで得た文字に対する修飾キーの状態を表す数値
                を返す。以下の値の和となる:
                        2       shift
                        4       control
                        8       alt (meta)
                        16      meta (ALT と META が区別される場合)
                        32      マウスのダブルクリック
                        64      マウスのトリプルクリック
                        96      マウスのクアドラプルクリック (== 32 + 64)
                        128     command (Macintosh のみ)
                文字自身に含まれていない修飾キーのみ取得できる。つまり、
                Shift-aは修飾キーなしの "A" となる。

                                                        getcharpos()
getcharpos({expr})
                {expr} の位置を得る。getpos() と同様だが返すリスト内の桁番号
                はバイトインデックスの代わりに文字インデックスになっている。
                getpos() が 2147483647 のような非常に大きな桁番号を返す場合、
                getcharpos() は最後の文字の文字インデックスを返す。

                例:
                5行目のテキスト "여보세요" の '세' にカーソルがある状態:
                        getcharpos('.')         returns [0, 5, 3, 0]
                        getpos('.')             returns [0, 5, 7, 0]

                method としても使用できる:
                        GetMark()->getcharpos()

getcharsearch()                                         getcharsearch()
                現在の文字検索の情報である{dict}を返し、この辞書は下記のエント
                リを持つ:

                    char        文字検索(tfTF)で以前に使われた文
                                字。
                                もし文字検索が実行されていないなら空文字列。
                    forward     文字検索の方向。1は前方、0は後方。
                    until       文字検索の種類。1はtもしくはTの文字検索、0は
                                fもしくはFの文字検索。

                下記の設定は前回の文字検索の方向にかかわらず、; で前方検索、
                , で後方検索を常に行えるようになり便利である:
                        :nnoremap <expr> ; getcharsearch().forward ? ';' : ','
                        :nnoremap <expr> , getcharsearch().forward ? ',' : ';'
                setcharsearch()も参照。

getcharstr([expr])                                      getcharstr()
                ユーザーまたは入力ストリームから1文字を文字列として取得する。
                [expr] が省略された場合、1文字を取得できるまで待つ。
                [expr] が0もしくは偽の場合、1文字を取得できる時だけ取得する。
                        取得できない時は空文字列を返す。
                [expr] が1もしくは真の場合は、1文字を取得できるかを判定するだ
                        けである。入力は消費されない。取得できないと判定された
                        時は空文字列を返す。
                結果の数値が文字列に変換される以外は getchar() と同様に動作
                する。

getcmdline()                                            getcmdline()
                現在のコマンドラインの内容を取得する。コマンドラインを編集して
                いるときのみ動作する。つまりc_CTRL-\_eまたはc_CTRL-R_=を使っ
                ているときのみ有効。
                例:
                        :cmap <F7> <C-\>eescape(getcmdline(), ' \')<CR>
                getcmdtype()getcmdpos()setcmdpos()も参照。
                パスワードを入力する時や inputsecret() を使う時は空文字列を
                返す。

getcmdpos()                                             getcmdpos()
                コマンドラインにおけるカーソル位置をバイト単位で取得する。最初
                の桁は1となる。コマンドラインを編集しているときのみ動作する。
                つまりc_CTRL-\_eまたはc_CTRL-R_=または式マッピングを使って
                いるときのみ有効。そうでないときは 0 を返す。
                getcmdtype()setcmdpos()getcmdline()も参照。

getcmdtype()                                            getcmdtype()
                現在のコマンドラインの種類を返す。戻り値は次のいずれか:
                    :   通常のexコマンド
                    >   デバッグモードコマンド debug-mode
                    /   前方検索コマンド
                    ?   後方検索コマンド
                    @   input() コマンド
                    -   :insert または :append コマンド
                    =   i_CTRL-R_=
                コマンドラインを編集しているときのみ動作する。つまり
                c_CTRL-\_eまたはc_CTRL-R_=または式マッピングを使っていると
                きのみ有効。そうでないときは空文字列を返す。
                getcmdpos()setcmdpos()getcmdline()も参照。

getcmdwintype()                                         getcmdwintype()
                現在のコマンドラインウィンドウ (command-line-window) の種類
                を返す。戻り値の意味は getcmdtype() と同じ。コマンドライン
                ウィンドウでなければ空文字列を返す。

getcompletion({pat}{type} [, {filtered}])             getcompletion()
                コマンドライン補完のマッチするリストを返す。{type}は何のための
                ものかを指定する。次の補完タイプがサポートされている:

                arglist         引数リスト内のファイル名
                augroup         自動コマンドグループ
                buffer          バッファ名
                behave          :behaveサブオプション
                color           カラースキーム
                command         Exコマンド (および引数)
                cmdline         cmdline-completion の結果
                compiler        コンパイラ
                cscope          :cscopeのサブオプション
                diff_buffer     :diffget と :diffput の補完
                dir             ディレクトリ名
                environment     環境変数名
                event           自動コマンドのイベント
                expression      Vim式
                file            ファイルおよびディレクトリ名
                file_in_path    'path'のファイルおよびディレクトリ名
                filetype        ファイルタイプ名 'filetype'
                function        関数名
                help            ヘルプ項目
                highlight       ハイライトグループ
                history         :historyサブオプション
                locale          ロケール名 (locale -aの出力)
                mapclear        バッファ引数
                mapping         マッピング名
                menu            メニュー
                messages        :messagesサブオプション
                option          オプション
                packadd         任意パッケージ pack-add 名
                shellcmd        シェルコマンド
                sign            :signサブオプション
                syntax          構文ファイル名 'syntax'
                syntime         :syntimeサブオプション
                tag             タグ
                tag_listfiles   タグ、ファイル名
                user            ユーザー名
                var             ユーザー変数

                {pat}が空文字列の場合、すべてのマッチが返される。それ以外の場
                合、{pat}と一致する項目のみが返される。{pat}での特殊文字の使用
                については、wildcardsを参照。

                オプションの{filtered}フラグが1に設定されている場合、結果をフィ
                ルタリングするために 'wildignore'が適用される。そうでなければ、
                すべての一致が返される。'wildignorecase'オプションは常に適用さ
                れる。

                {type}が "cmdline" ならば cmdline-completion の結果が返され
                る。
                例えば、":call" コマンドの後で補完できる値は:
                        echo getcompletion('call ', 'cmdline')

                一致するものがなければ、空のリストが返される。{type}の値が無効
                だと、エラーが発生する。

                method としても使用できる:
                        GetPattern()->getcompletion('color')

                                                        getcurpos()
getcurpos([{winid}])
                カーソルの位置を返す。これは getpos('.') に似ているが、追加の
                "curswant" 情報を含む:
                    [0, lnum, col, off, curswant]
                "curswant" は縦方向移動の優先的列番号である。
                getcursorcharpos() と getpos() も参照。
                最初の "bufnum" は常に0である。カーソルのバイトでの位置は
                'col' に返される。文字の位置を得るには getcursorcharpos() を
                使う。

                オプションの {winid} 引数はウィンドウを指定する。これはウィン
                ドウ番号か window-ID である。最後のカーソル位置を返すが、こ
                れはバッファがカレントウィンドウでない場合、現在の値は無効にな
                りうる。
                {winid} が無効の場合、値がゼロのリストを返す。

                次のようにしてカーソル位置の保存と復元ができる:
                        let save_cursor = getcurpos()
                        MoveTheCursorAround
                        call setpos('.', save_cursor)
                Note: これはウィンドウ内でのみ機能する。より多くの状態を復元す
                る方法については winrestview() を参照。

                method としても使用できる:
                        GetWinid()->getcurpos()

                                                        getcursorcharpos()
getcursorcharpos([{winid}])
                getcurpos() と同様だが返すリスト内の桁番号はバイトインデック
                スの代わりに文字インデックスになっている。

                Example:
                3行目のテキスト "여보세요" の '보' にカーソルがある状態:
                        getcursorcharpos()      returns [0, 3, 2, 0, 3]
                        getcurpos()             returns [0, 3, 4, 0, 3]

                method としても使用できる:
                        GetWinid()->getcursorcharpos()

                                                        getcwd()
getcwd([{winnr} [, {tabnr}]])
                結果は現在の作業ディレクトリ名の文字列である。

                {winnr} が指定された場合、現在のタブページ内の {winnr} のウィ
                ンドウのローカルカレントディレクトリを返す。{winnr} にはウィン
                ドウ番号またはwindow-IDが使える。
                {winnr} が -1 の場合、グローバル作業ディレクトリ名を返す。
                haslocaldir() も参照。

                {winnr}{tabnr}が指定された場合、{tabnr}のタブページ内の
                {winnr}のウィンドウのローカルカレントディレクトリを返す。
                {winnr}が -1 の場合、タブページの作業ディレクトリを返す。
                {winnr}が 0 の場合、カレントウィンドウを使用し、{tabnr}が 0 の
                場合はカレントタブページを使用する。
                引数なしの場合は、カレントウィンドウの作業ディレクトリを返す。
                もし引数が不正の場合、空文字列を返す。

                例:
                        " カレントウィンドウの作業ディレクトリを取得
                        :echo getcwd()
                        :echo getcwd(0)
                        :echo getcwd(0, 0)
                        " タブページ2のウィンドウ3の作業ディレクトリを取得
                        :echo getcwd(3, 2)
                        " グローバル作業ディレクトリを取得
                        :echo getcwd(-1)
                        " タブページ3の作業ディレクトリを取得
                        :echo getcwd(-1, 3)
                        " カレントタブページの作業ディレクトリを取得
                        :echo getcwd(-1, 0)

                method としても使用できる:
                        GetWinnr()->getcwd()

getenv({name})                                          getenv()
                環境変数{name}の値を返す。
                変数が存在しない場合は v:null が返される。これは、空の文字列
                に設定された変数とは異なるが、一部のシステムは空の値を削除され
                る変数として解釈する。expr-env も参照。

                method としても使用できる:
                        GetVarname()->getenv()

getfontname([{name}])                                   getfontname()
                引数なしで使われた場合には現在の通常のフォント名を返す。ハイラ
                イトグループNormalに対して使われるものと同様hl-Normal
                引数が指定された場合には{name}が有効なフォント名であるか判定さ
                れる。有効でないときは空文字列を返す。
                有効なときは実際のフォント名を返す。またはGUIが実際の名前の取
                得をサポートしていないときは{name}をそのまま返す。
                GUIモードで実行しているときのみ動作する。よってvimrcやgvimrcの
                中では使えない。GUIモードが起動した直後にこの関数を呼ぶには、
                自動コマンドGUIEnterを使うこと。
                Note GTKのGUIはどんなフォント名でも受け付けてしまうため、名前
                が有効であるかのチェックは機能しない。

                method としても使用できる:
                        mydict->has_key(key)

getfperm({fname})                                       getfperm()
                {fname}で指定されたファイルの読み込み、書き込み、実行の許可属
                性を示す文字列を返す。
                {fname}が存在しない、またはそのディレクトリが読み込み不可能な
                ときは空文字列を返す。
                戻り値は "rwxrwxrwx" の形で、"rwx" フラグの各グループは順にファ
                イルの所有者、ファイルが所属するグループ、その他のユーザーを表
                す。許可属性が与えられていないフラグは "-" で置き換えられる。
                例:
                        :echo getfperm("/etc/passwd")
                        :echo getfperm(expand("~/.vimrc"))
                この例は、(セキュリティの観点から望ましい設定がされているなら
                ば) "rw-r--r--" あるいは "rw-------" と表示する。

                method としても使用できる:
                        GetFilename()->getfperm()

                許可属性を設定するにはsetfperm()を使用する。

getfsize({fname})                                       getfsize()
                結果は数値で、{fname}で指定されるファイルのサイズをバイト単位
                で返す。
                {fname}がディレクトリのときは0を返す。
                ファイル{fname}が見つからないときは-1を返す。
                {fname} のサイズが Number の範囲外の場合は -2 を返す。

                method としても使用できる:
                        GetFilename()->getfsize()

getftime({fname})                                       getftime()
                結果は{fname}で与えられたファイルの、最終更新時間を示す数値。
                1970年1月1日からの経過時間(秒)で、strftime()に渡すことができる
                だろう。localtime()strftime()も参照。
                ファイル{fname}が見つからなかった場合には-1を返す。

                method としても使用できる:
                        GetFilename()->getftime()

getftype({fname})                                       getftype()
                {fname}で指定されたファイルの種別を示す文字列を返す。
                {fname}が存在しないときは空文字列を返す。
                ファイルの種別とそれらの結果の表を以下に示す:
                        通常ファイル            "file"
                        ディレクトリ            "dir"
                        シンボリックリンク      "link"
                        ブロックデバイス        "bdev"
                        キャラクタデバイス      "cdev"
                        ソケット                "socket"
                        FIFO                    "fifo"
                        それ以外                "other"
                例:
                        getftype("/home")
                Note "link" などの種別はそれをサポートしているシステムでのみ返
                される。"dir" と "file" しか返らないシステムもある。
                MS-Windowsでは、ディレクトリへのシンボリックリンクは "link" の
                代わりに "dir" を返す。

                method としても使用できる:
                        GetFilename()->getftype()

getimstatus()                                           getimstatus()
                結果は数値で、IMEステータスがアクティブの場合は TRUE である。
                'imstatusfunc' を参照。

getjumplist([{winnr} [, {tabnr}]])                      getjumplist()
                指定されたウィンドウの jumplist を返す。

                引数なしの場合、カレントウィンドウを使用する。
                {winnr} のみの場合、現在のタブページのこのウィンドウを使用す
                る。{winnr} には window-ID も使用できる。
                {winnr} と {tabnr} 両方の場合、指定されたタブページのウィンド
                ウを使用する。

                返されるリストは 2 つのエントリを含む: ジャンプ位置のリストと、
                リスト内の最後に使われたジャンプ位置番号。ジャンプ位置リスト内
                のそれぞれの項目は、以下の項目を含む辞書になっている:
                        bufnr           バッファ番号
                        col             列番号
                        coladd          'virtualedit' 用の列のオフセット
                        filename        利用可能ならばファイル名
                        lnum            行番号

                method としても使用できる:
                        GetWinnr()->getjumplist()

                                                        getline()
getline({lnum} [, {end}])
                {end}が指定されない場合は、カレントバッファの{lnum}行目の内容
                を文字列にして返す。例:
                        getline(1)
                {lnum}が数字ではない文字で始まる文字列であった場合、line()
                よってその文字列が数字に変換される。よって、カーソルのある行の
                文字列を取得するには:
                        getline(".")
                {lnum}が1より小さいかバッファの行数よりも大きい数値の場合、空
                文字列が返される。

                {end}が指定された場合は、カレントバッファの{lnum}行目から
                {end}行目までを要素とするリストListを返す。
                {end}{lnum}と同様に解釈される。
                存在しない行は省略され、エラーメッセージは表示されない。
                {end}{lnum}より前になる場合は空リストを返す。
                例:
                        :let start = line('.')
                        :let end = search("^$") - 1
                        :let lines = getline(start, end)

                method としても使用できる:
                        ComputeLnum()->getline()

                他のバッファの行を取得するにはgetbufline()を参照。

getloclist({nr} [, {what}])                             getloclist()
                ウィンドウ{nr}のlocationリストの全項目からなるリスト List を
                返す。{nr} にはウィンドウ番号または window-ID が使える。{nr}
                に0を指定するとカレントウィンドウになる。

                locationリストウィンドウに対して使用すると、そこに表示されてい
                るlocationリストが返る。ウィンドウ番号{nr}が無効な場合は、空リ
                ストが返る。それ以外は getqflist() と同じ。

                オプションの{what}辞書引数が指定されている場合、{what}にリスト
                されている項目を辞書として返す。{what}のサポートされている項目
                については、getqflist()を参照。

                getqflist() の{what}でサポートされている項目に加え、
                getloclist() では次の項目もサポートされている:

                        filewinid       ロケーションリストからファイルを表示す
                                        るのに使われているウィンドウのID。この
                                        フィールドはロケーションリストウィンド
                                        ウから呼び出されたときのみ適用される。
                                        詳細は location-list-file-window を
                                        参照。

                ウィンドウ {nr} にlocationリストがないなら、デフォルト値の辞書
                Dictionary を返す。
                ウィンドウが存在しない場合、空の辞書を返す。

                例 (getqflist-examples もまた参照):
                        :echo getloclist(3, {'all': 0})
                        :echo getloclist(5, {'filewinid': 0})


getmarklist([{expr}])                                   getmarklist()
                {expr} 引数が無い場合は全グローバルマークについての情報のリス
                トを返す。mark

                オプショナル引数 {expr} が指定されている場合、{expr} で指定
                されたバッファのローカルマークの値を返す。{expr} の使い方は
                bufname() を参照。

                戻り値のリストの各要素は以下の内容の辞書Dictになっている:
                    mark   接頭辞 "'" が付いたマークの名前
                    pos    マークの位置のリストList:
                                [bufnum, lnum, col, off]
                       詳細は getpos() を参照。
                    file   ファイル名

                特定のマークについて取得した情報の詳細は getpos() を参照。

                method としても使用できる:
                        GetBufnr()->getmarklist()

getmatches([{win}])                                     getmatches()
                matchadd() と :match によりカレントウィンドウに定義された
                全てのマッチの List を返す。setmatches() は getmatches()
                で保存されたマッチのリストを復元できるので、getmatches() と
                setmatches() は組み合わせて使うと便利である。
                {win} が指定されたなら、カレントウィンドウの代わりに指定された
                番号かウィンドウIDのウィンドウを使う。
                例:
                        :echo getmatches()
                        [{'group': 'MyGroup1', 'pattern': 'TODO',
                        'priority': 10, 'id': 1}, {'group': 'MyGroup2',
                        'pattern': 'FIXME', 'priority': 10, 'id': 2}]
                        :let m = getmatches()
                        :call clearmatches()
                        :echo getmatches()
                        []
                        :call setmatches(m)
                        :echo getmatches()
                        [{'group': 'MyGroup1', 'pattern': 'TODO',
                        'priority': 10, 'id': 1}, {'group': 'MyGroup2',
                        'pattern': 'FIXME', 'priority': 10, 'id': 2}]
                        :unlet m

getmousepos()                                           getmousepos()
                マウスの最新の位置を示す辞書 Dictionary を返す。マウスクリッ
                クのマッピングやポップアップウィンドウのフィルターで使うことが
                できる。辞書の要素は:
                        screenrow       画面行
                        screencol       画面桁
                        winid           クリックされたウィンドウ ID
                        winrow          "winid" 内の行
                        wincol          "winid" 内の桁
                        line            "winid" 内のテキスト行
                        column          "winid" 内のテキスト桁
                全ての数値は 1 ベースである。

                ウィンドウの上ではない場合、例えばコマンドラインの中などでは
                "screenrow" と "screencol" のみが有効で、残りは 0 になる。

                ウィンドウの下のステータスラインやウィンドウの右の垂直セパレー
                ターの場合、"line" と "column" は 0 になる。

                位置がテキストより後の場合、"column" はテキストのバイト長+1に
                なる。

                マウスがポップアップウィンドウの上の場合、そのウィンドウが使わ
                れる。

                getchar() を使ったとき、Vim 変数 v:mouse_lnum,
                v:mouse_col と v:mouse_winid もこれらの値を提供する。

                                                        getpid()
getpid()        Vim のプロセス ID を数値で返す。Unix と MS-Windows では Vim が
                終了するまでこれは一意な数値である。

                                                        getpos()
getpos({expr})  {expr}の位置を返す。{expr}として指定できる値については
                line()を参照。カーソル位置を得るには getcurpos() を参照。
                結果は次の4個の要素を持つリストList:
                    [bufnum, lnum, col, off]
                "bufnum" は、'0 や 'A のようなマークが指定されたときは、その
                マークのバッファ番号となる。それ以外では0となる。
                "lnum" と "col" はバッファ中の位置。桁番号は1から始まる。
                "off" の値は、'virtualedit' がオフのときは常に0で、オンのとき
                はその文字の始点からの画面上の桁のオフセットである。つまり、
                カーソルが<Tab>の中や、その行の最後の文字より後にあるとき意味
                を持つ。
                Note: ビジュアルモードの '< と '> について: ビジュアルモードが
                "V" (行選択モード) のとき、'< の桁番号はゼロ、'> の桁番号は大
                きな値になる。
                桁番号は行内のバイト位置のリストとして返される。行内の文字での
                位置を取得するなら、getcharpos() を使う。
                桁番号は 2147483647 のような非常に大きな値になり得る。これは
                "行末の後" を意味する。
                この関数はマークの位置を保存し、復元するために使われる:
                        let save_a_mark = getpos("'a")
                        ...
                        call setpos("'a", save_a_mark)
                getcharpos() と getcurpos() そして setpos() も参照。

                method としても使用できる:
                        GetMark()->getpos()

getqflist([{what}])                                     getqflist()
                現在の全quickfixエラーのリスト List を返す。リストの各要素は
                辞書で、以下の要素を持つ:
                        bufnr   ファイル名を持つバッファの番号。その名前を取得
                                するにはbufname()を使う。
                        module  モジュール名
                        lnum    バッファ中の行番号(最初の行は1)
                        end_lnum
                                項目が複数行のときの最後の行番号
                        col     桁番号(最初の桁は1)
                        end_col 項目が範囲を持つときの最後の桁番号
                        vcol    TRUE: "col" は画面上の桁
                                FALSE: "col" はバイトインデックス
                        nr      エラー番号
                        pattern エラーの位置を特定するために使う検索パターン
                        text    エラーの説明
                        type    エラーメッセージの種類。'E', '1' など。
                        valid   TRUE: エラーメッセージが認識されている

                エラーリストがまったくないか、空であるときは空リストを返す。
                quickfixリストの項目が存在しないバッファ番号とともに返る場合は
                "bufnr" を0にして返される。(Note: いくつかの関数はバッファ番号
                0を代替バッファとして受け付けるので、明確に0チェックを行う必要
                がある)。

                役に立つ応用例: 複数のファイルから正規表現検索を行い、見つかっ
                たものに対してなんらかの操作をする:
                        :vimgrep /theword/jg *.c
                        :for d in getqflist()
                        :   echo bufname(d.bufnr) ':' d.lnum '=' d.text
                        :endfor

                オプションの{what}辞書引数が指定されている場合は、{what}にリス
                トされている項目のみを辞書として返す。{what}では、以下の文字列
                項目がサポートされている:
                        changedtick     リストに行われた変更の総数を取得
                                        quickfix-changedtick
                        context quickfix-context を取得
                        efm     "lines" をパースするときに使われるエラーフォー
                                マット。存在しない場合はオプション
                                'errorformat' の値が使用される。
                        id      quickfix-IDに対応するquickfixリストの情報を
                                取得。0 は現在のリストもしくは "nr" で指定され
                                たリストのidを意味する
                        idx     'id' または 'nr' で指定されたquickfixリスト内
                                の情報を取得した最後のエントリのインデックス。
                                もし0なら、カレントのエントリが使われる。
                                quickfix-index を参照
                        items   quickfixリストのエントリ
                        lines   'efm' を使用して行のリストをパースし、結果のエ
                                ントリを返す。List 型のみを受け付ける。現在
                                のquickfixリストは変更を受けない。
                                quickfix-parseを参照。
                        nr      このquickfixリストの情報を取得。0 は現在の
                                quickfixリストを意味し、"$" は最後のquickfixリ
                                ストを意味する
                        qfbufnr quickfixウィンドウに表示されているバッファの番
                                号。quickfixバッファが存在しないなら 0 が返る。
                                quickfix-buffer を参照。
                        size    quickfixリスト内のエントリの数
                        title   リストタイトルを取得 quickfix-title
                        winid   quickfixのwindow-IDを取得
                        all     上記のquickfixのすべてのプロパティ
                {what} の文字列以外の項目は無視される。特定の項目の値を取得す
                るには 0 を設定する。
                "nr" が存在しない場合、現在のquickfixリストが使用される。"nr"
                と 0 でない "id" が両方とも指定されていた場合、"id" で指定され
                たリストが使用される。
                quickfixスタック内のリストの数を取得するには、{what} 内で "nr"
                に "$" を設定する。返される辞書内の "nr" の値がquickfixスタッ
                クサイズである。
                "lines" が指定された場合、"efm" を除くその他すべての項目は無視
                される。返される辞書は、エントリのリストからなるエントリ
                "items" を含む。

                返される辞書には、次のエントリが含まれる:
                        changedtick     リストに行われた変更の総数
                                        quickfix-changedtick
                        context quickfixリストコンテキスト。quickfix-context
                                を参照。存在しない場合、"" に設定される。
                        id      quickfixリストID quickfix-ID。存在しない場
                                合、0 に設定される。
                        idx     リスト内のquickfixのエントリのインデックス。
                                存在しない場合、0 に設定される。
                        items   quickfixリストのエントリ。存在しない場合、空リ
                                ストに設定される。
                        nr      quickfixリスト番号。存在しない場合、0 に設定さ
                                れる。
                        qfbufnr quickfixウィンドウに表示されているバッファの番
                                号。存在しない場合、0 に設定される。
                        size    quickfixリスト内のエントリの数。存在しない場
                                合、0 に設定される。
                        title   quickfixリストのタイトルテキスト。存在しない場
                                合、"" に設定される。
                        winid   quickfixのwindow-ID。存在しない場合、0 に設
                                定される。

                例 (getqflist-examplesも参照):
                        :echo getqflist({'all': 1})
                        :echo getqflist({'nr': 2, 'title': 1})
                        :echo getqflist({'lines' : ["F1:10:L10"]})

getreg([{regname} [, 1 [, {list}]]])                    getreg()
                レジスタ{regname}の中身を文字列にして返す。例:
                        :let cliptext = getreg('*')
                {regname} がセットされていないときは、結果は空文字列となる。
                getreg('=')は最後に評価した式レジスタの値を返す。(マップの中で
                使用する)。
                getreg('=', 1)はその式そのものを返す。これを使ってsetreg()
                復元することができる。他のレジスタの場合は、この引数は無視され
                るので、常に指定していても害はない。
                {list} が指定され、その値がTRUEのときは、戻り値はリスト
                (List) になる。リストの各要素はテキスト 1 行である。これはレ
                ジスタの中に値ゼロのバイトが含まれる場合に使用する。{list} を
                指定しなかった場合は NL 文字と値ゼロのバイトは両方とも NL 文字
                として扱われる (NL-used-for-Nul 参照)。
                指定したレジスタがセットされていないときは、空のリストが返され
                る。
                {regname}を指定しないときはv:registerが使われる。
                Vim9-script では {regname} は1文字でなくてはならない。

                method としても使用できる:
                        GetRegname()->getreg()

getreginfo([{regname}])                                 getreginfo()
                レジスタ {regname} についての詳細情報として次の項目を持つ辞書
                を返す:
                        regcontents     レジスタ {regname} に格納されている行
                                        の、getreg({regname}, 1, 1) と同様の
                                        リスト。
                        regtype         レジスタ {regname} の getregtype()
                                        相当の種別。
                        isunnamed       真偽値フラグ、v:true は現在指している
                                        レジスタが無名レジスタであることを示
                                        す。
                        points_to       無名レジスタであれば、現在指しているレ
                                        ジスタを示す単一文字 (quotequoteを参
                                        照)。
                                        例えば、行を dd で削除後、このフィー
                                        ルドは "1" となりそのレジスタには削除
                                        したテキストが入る。

                {regname} が不正なレジスタ名もしくは未設定の場合、空の辞書が返
                される。
                {regname} が未指定の場合、v:register が使われる。
                戻り値の辞書は setreg() に渡すことができる。
                Vim9-script では {regname} は1文字でなくてはならない。

                method としても使用できる:
                        GetRegname()->getreginfo()

getregtype([{regname}])                                 getregtype()
                レジスタ{regname}の種類を表す文字列を返す。
                戻り値は次のいずれかとなる:
                    "v"                 文字単位characterwiseの場合
                    "V"                 行単位linewiseの場合
                    "<CTRL-V>{width}"   矩形blockwise-visualの場合
                    ""                  空、または未知のレジスタの場合
                <CTRL-V>は値0x16の1文字である。
                {regname}を指定しないときはv:registerが使われる。
                Vim9-script では {regname} は1文字でなくてはならない。

                method としても使用できる:
                        GetRegname()->getregtype()

gettabinfo([{tabnr}])                                   gettabinfo()
                {tabnr}を指定しないと、すべてのタブページに関する情報がリスト
                List として返される。各リスト項目は辞書 Dictionary である。
                それ以外の場合、{tabnr} はタブページ番号を指定し、それに関する
                情報が返される。タブページが存在しない場合、空のリストが返され
                る。

                各リストアイテムは、次のエントリを持つ辞書 Dictionary である:
                        tabnr           タブページ番号。
                        variables       タブページローカル変数の辞書への参照。
                        windows         タブページのwindow-IDのリスト。

                method としても使用できる:
                        GetTabnr()->gettabinfo()

gettabvar({tabnr}{varname} [, {def}])                         gettabvar()
                タブページ {tabnr} のタブローカル変数 {varname} を取得する。
                t:var
                タブの番号は 1 から始まる。
                {varname} が空のときは全タブローカル変数からなる辞書を返す。
                Note: 指定する変数名は "t:" を除いた名前。
                タブや変数が存在しないときは{def}または空文字列を返し、エラー
                メッセージは表示されない。

                method としても使用できる:
                        GetTabnr()->gettabvar(varname)

gettabwinvar({tabnr}{winnr}{varname} [, {def}])             gettabwinvar()
                タブページ{tabnr}内のウィンドウ{winnr}のウィンドウローカル変数
                {varname}の値を取得する。
                {varname}が空のときは全ウィンドウローカル変数からなる辞書を返
                す。
                {varname}が "&" と等しい場合はすべてのウィンドウローカルオプ
                ションの値を辞書 Dictionary に入れて返す。
                {varname}が文字 "&" で始まるときはウィンドウローカルオプション
                の値を取得する。
                Note {varname}は "w:" をつけずに指定しなければならない。
                タブページ番号は1から始まる。カレントタブページを指定するには
                getwinvar()を指定する。
                {winnr} にはウィンドウ番号またはwindow-IDが使える。
                {winnr}が0のときはカレントウィンドウとなる。
                グローバルオプション、バッファローカルオプション、ウィンドウ
                ローカルオプションに対しても動作するが、グローバル変数やバッ
                ファローカル変数に対しては動作しない。
                ウィンドウやタブや変数が存在しないときは{def}または空文字列を
                返し、エラーメッセージは表示されない。
                例:
                        :let list_is_on = gettabwinvar(1, 2, '&list')
                        :echo "myvar = " . gettabwinvar(3, 1, 'myvar')

                すべてのウィンドウローカル変数を取得するには:
                        gettabwinvar({tabnr}, {winnr}, '&')

                method としても使用できる:
                        GetTabnr()->gettabwinvar(winnr, varname)

gettagstack([{winnr}])                                  gettagstack()
                結果は辞書で、それはウィンドウ{winnr}のタグスタックである。
                {winnr}にはウィンドウ番号または window-ID を指定できる。
                {winnr}を指定しない時は、カレントウィンドウが使用される。
                ウィンドウ{winnr}が存在しない場合、空の辞書が返される。

                返される辞書には、次のエントリが含まれる:
                        curidx          スタック内の現在のインデックス。スタッ
                                        クの最上部にあるときは、(length + 1)
                                        に設定される。スタックの最下部のイン
                                        デックスは1である。
                        items           スタック内の項目のリスト。各項目は、以
                                        下で説明するエントリを含む辞書である。
                        length          スタック内の項目数

                スタック内の各項目は、次のエントリを持つ辞書である:
                        bufnr           現在のジャンプのバッファ番号
                        from            タグジャンプの前のカーソル位置。返され
                                        るリストの形式は getpos() を参照。
                        matchnr         現在の一致するタグ番号。名前に一致する
                                        複数のタグが見つかった場合に使用され
                                        る。
                        tagname         タグの名前

                タグスタックについての詳細は、tagstack を参照。

                method としても使用できる:
                        GetWinnr()->gettagstack()


gettext({text})                                         gettext()
                可能であれば {text} を翻訳する。
                これは主に配布する Vim script で使う。
                メッセージの翻訳を生成するときに {text} が xgettext によって抽
                出され、翻訳者が .po ファイルで翻訳済みメッセージを追加でき
                Vim は gettext() が呼ばれた時に翻訳を検索する。
                {text} はダブルクォートの文字列が望しい、なぜなら xgettext は
                シングルクォートの文字列でのエスケープを理解しないため。


getwininfo([{winid}])                                   getwininfo()
                ウィンドウに関する情報を、辞書のリスト List として返す。

                {winid}が与えられた場合、そのIDを持つウィンドウに関する情報が
                リスト List として1項目にして返される。ウィンドウが存在しな
                い場合、結果は空のリストになる。

                {winid}がなければすべてのタブページのすべてのウィンドウに関す
                る情報が返される。

                リストの各項目は次のエントリを持つ辞書 Dictionary である:
                        botline         最下の完全に表示されたバッファ行
                        bufnr           ウィンドウ内のバッファ番号
                        height          ウィンドウの高さ (winbarを除く)
                        loclist         locationリストを表示してる場合は1
                                        {Vimが+quickfix機能付きでコンパイル
                                        されたときのみ有効}
                        quickfix        quickfixまたはlocationリストウィンドウ
                                        の場合は1
                                        {Vimが+quickfix機能付きでコンパイル
                                        されたときのみ有効}
                        terminal        端末ウィンドウの場合は 1
                                        {Vimが+terminal機能付きでコンパイル
                                        されたときのみ有効}
                        tabnr           タブページ番号
                        topline         最上に表示されたバッファ行
                        variables       ウィンドウローカル変数の辞書への参照
                        width           ウィンドウ幅
                        winbar          ウィンドウがツールバーを持っていれば
                                        1、そうでなければ 0
                        wincol          ウィンドウの最も左のスクリーン列、
                                        win_screenpos() の "col"
                        winid           window-ID
                        winnr           ウィンドウ番号
                        winrow          ウィンドウの最も上のスクリーン行、
                                        win_screenpos() の "row"

                method としても使用できる:
                        GetWinnr()->getwininfo()

getwinpos([{timeout}])                                  getwinpos()
                結果は、getwinposx() と getwinposy() の結果が組み合わされ
                た 2 つの数字のリスト List:
                        [x-pos, y-pos]
                {timeout} は端末からの応答をどれくらい待つかを、ミリ秒単位で指
                定するのに使われる。省略された場合は 100 ミリ秒が使用される。
                リモート端末にはより長い時間を指定すること。
                10 より小さい値が使用され、かつその時間内に応答を受け取らなかっ
                た場合、利用可能であれば前に報告された位置が返される。これは位
                置をポーリングし、同時に何かを行う場合に使用することができる:
                        while 1
                          let res = getwinpos(1)
                          if res[0] >= 0
                            break
                          endif
                          " Do some work here
                        endwhile


                method としても使用できる:
                        GetTimeout()->getwinpos()

                                                        getwinposx()
getwinposx()    結果はGUIのVimウィンドウの左端の、デスクトップ上でのX座標値(数
                値)。xtermでも機能する (100 ミリ秒のタイムアウトを使用して)。
                情報が存在しない(コンソールの)場合は-1となる。
                この値は :winpos でも使用される。

                                                        getwinposy()
getwinposy()    結果はGUIのVimウィンドウの上端の、デスクトップ上でのY座標値(数
                値)。xtermでも機能する (100 ミリ秒のタイムアウトを使用して)。
                情報が存在しない(コンソールの)場合は-1となる。
                この値は :winpos でも使用される。

getwinvar({winnr}{varname} [, {def}])                         getwinvar()
                カレントタブページに対するgettabwinvar()と同様。
                例:
                        :let list_is_on = getwinvar(2, '&list')
                        :echo "myvar = " . getwinvar(1, 'myvar')

                method としても使用できる:
                        GetWinnr()->getwinvar(varname)

glob({expr} [, {nosuf} [, {list} [, {alllinks}]]])              glob()
                {expr}内のファイル名のワイルドカードを展開する。特殊文字につい
                てはwildcardsを参照。

                {nosuf} にTRUEを指定しない限り、'suffixes' と 'wildignore'
                が適用される。つまり 'wildignore' のパターンにマッチする名前は
                スキップされ、'suffixes' がマッチの順番に影響を与える。
                'wildignorecase' は常に適用される。

                {list} が指定されその値がTRUEなら、マッチしたすべてのファイ
                ルがリスト List として返される。リストを使うことで、改行を含
                むファイル名があっても結果を正しく受け取ることができる。
                そうでない場合は結果は文字列で返される。その場合、複数のマッチ
                があるときはそれらは文字 <NL> で区切られる。

                展開が失敗した場合、空の文字列またはリストが返される。

                マッチの数を制限するなど、複雑なことをする必要がある場合にも
                readdir() を使用することができる。

                存在しないファイル名は結果に含まれない。シンボリックリンクは、
                それが存在するファイルを指す場合のみ含まれる。
                ただし、{alllinks} 引数が存在し、それがTRUEである場合はすべ
                てのシンボリックリンクが含まれる。

                多くのシステムではバッククォート(「`」という文字のこと)を、外
                部コマンドの実行結果からファイル名を取得するために使用できる。
                例:
                        :let tagfiles = glob("`find . -name tags -print`")
                        :let &tags = substitute(tagfiles, "\n", ",", "g")
                バッククォート内のプログラムの実行結果は、一行に一つずつの項目
                が含まれてなければならない。項目内のスペースは許容される。

                特殊なVimの変数を展開するためにはexpand()を参照。外部コマン
                ドの生の出力を得るためにはsystem()を参照。

                method としても使用できる:
                        GetExpr()->glob()

glob2regpat({expr})                                      glob2regpat()
                glob()に使われるファイルパターンを検索パターンに変換する。
                結果はファイル名の文字列とのマッチに使用できる。例えば、
                        if filename =~ glob2regpat('Make*.mak')
                上記は次と同じである:
                        if filename =~ '^Make.*\.mak$'
                {expr}が空文字列の場合、結果は "^$" で、空文字列にマッチする。
                結果はシステムによって異なることに注意すること。MS-Windowsで
                は、バックスラッシュは通常、パス区切りを意味する。

                method としても使用できる:
                        GetExpr()->glob2regpat()
                                                                globpath()
globpath({path}{expr} [, {nosuf} [, {list} [, {alllinks}]]])
                {path}の中の全ディレクトリで {expr} に対してglob()を実行し、
                結果を連結する。例:
                        :echo globpath(&rtp, "syntax/c.vim")

                {path}はコンマ区切りのディレクトリのリスト。各ディレクトリを
                {expr}の前に付加し、glob()と同様にそれを展開する。必要に応じて
                パスの区切り文字が挿入される。
                ディレクトリ名の中にコンマを含めるには、バックスラッシュでエス
                ケープすること。Note MS-Windowsではディレクトリ名の末尾にバッ
                クスラッシュがつくことがある。その後に区切りのコンマを書くとエ
                スケープと見なされてしまうので、バックスラッシュは削除すること。
                どれかのディレクトリに対して展開が失敗してもエラーメッセージは
                表示されない。

                {nosuf} にTRUEが指定されない限り、オプション 'wildignore' が
                適用される。つまり、'wildignore' のパターンにマッチする名前は
                スキップされる。

                {list} が指定され、その値がTRUEなら、マッチしたすべてのファ
                イルがリスト List として返る。リストとして受け取る利点は、改
                行文字を含んだファイル名も正しく扱えることである。{list} を指
                定しなかった場合は、戻り値は文字列であり、マッチした複数のファ
                イル名は <NL> 文字で連結されてしまう。例:
                        :echo globpath(&rtp, "syntax/c.vim", 0, 1)

                {alllinks} はglob()の場合と同様に扱われる。

                "**" を使ってディレクトリツリーを再帰的に検索することができる。
                例えば、'runtimepath' とそれ以下のディレクトリから全ての
                "README.txt" を探すには次のようにする:
                        :echo globpath(&rtp, "**/README.txt")
                上向き検索と、"**" の深さの限界はサポートされていない。よって
                オプション 'path' の値をそのまま使うとうまく動かないことが
                ある。

                method としても使用でき、ベースは第2引数として渡される:
                        GetExpr()->globpath(&rtp)

                                                        has()
has({feature} [, {check}])
                {check} がない、もしくは0: 結果は機能{feature}がサポートしてい
                る場合1、されない場合0となる。引数{feature}は文字列で大文字/
                小文字の区別が無視される。下記の feature-list を参照。

                {check} があり、0でない: 結果は数値で、機能{feature}が既知であ
                る場合1、そうでない場合0となる。これは {feature} の誤字のチェッ
                クとデッドコードの検知に便利。古いバージョンの Vim は後で追加
                される機能のことは知らず、現在のバージョンの Vim は放棄された
                機能のことを知らないということに注意。

                exists()も参照。

                Note ある機能が無い時に文法エラーとなるコードをスキップするた
                めには、Vim は行の残りをスキップし、後続の endif を見逃すか
                もしれないことに注意。そのためには、endif を独立した行に置く
                :
                        if has('feature')
                          let x = this->breaks->without->the->feature
                        endif
                もし endif を2行目に "| endif" として移動させると見付けられ
                なくなる。

has_key({dict}{key})                                  has_key()
                結果は数値で、辞書Dictionary {dict}がキー{key}の要素を持つな
                ら真、持たないなら偽となる。

                method としても使用できる:
                        mydict->has_key(key)

haslocaldir([{winnr} [, {tabnr}]])                      haslocaldir()
                結果は数値である:
                    1   ウィンドウが :lcd によってローカルディレクトリを設定
                        している時
                    2   タブページが :tcd によってローカルディレクトリを設定
                        している時
                    0   その他

                引数が指定されない場合、現在のウィンドウを対象とする。
                {winnr}が指定された場合、現在のタブページ内の{winnr}のウィンド
                ウを対象とする。
                {winnr}{tabnr}が指定された場合、{tabnr}のタブページ内の
                {winnr}のウィンドウを対象とする。
                {winnr} にはウィンドウ番号またはwindow-IDが使える。
                {winnr}が -1 の場合は無視され、タブページのみが使用される。
                もし引数が不正の場合、0 を返す。

                例:
                        if haslocaldir() == 1
                          " ウィンドウローカルディレクトリの場合
                        elseif haslocaldir() == 2
                          " タブページローカルディレクトリの場合
                        else
                          " グローバルディレクトリの場合
                        endif

                        " カレントウィンドウ
                        :echo haslocaldir()
                        :echo haslocaldir(0)
                        :echo haslocaldir(0, 0)
                        " カレントタブページのウィンドウn
                        :echo haslocaldir(n)
                        :echo haslocaldir(n, 0)
                        " タブページmのウィンドウn
                        :echo haslocaldir(n, m)
                        " タブページm
                        :echo haslocaldir(-1, m)

                method としても使用できる:
                        GetWinnr()->haslocaldir()

hasmapto({what} [, {mode} [, {abbr}]])                  hasmapto()
                結果は数値。右辺側(マップした先)の一部分に{what}を含むマッピン
                グが存在し、それが{mode}で指定されたモードのいずれかで定義され
                ているなら真を返す。
                {abbr}が指定されていてTRUEのときはマッピングでなく短縮入力の
                存在を判定する。挿入モードまたはコマンドモードを指定することを
                忘れないように。
                グローバルマップとバッファローカルマップの両方をチェックする。
                マッピングが1個も見つからなかったときは偽を返す。
                {mode}に対しては以下の文字が利用できる:
                        n       ノーマルモード
                        v       ビジュアルモードおよび選択モード
                        x       ビジュアルモード
                        s       選択モード
                        o       オペレータ待機モード (Operator-pending)
                        i       挿入モード
                        l       Language-Argumentモード ("r", "f", "t" など)
                        c       コマンドラインモード
                {mode}が省略されたときは "nvo" となる。

                この関数はVim scriptの中で、ある関数へのマッピングが既に存在す
                るか判定するために有用である。例:
                        :if !hasmapto('\ABCdoit')
                        :   map <Leader>d \ABCdoit
                        :endif
                この例は、"\ABCdoit" へのマッピングが存在しないときだけ
                "\ABCdoit" へのマッピングを作成する。

                method としても使用できる:
                        GetRHS()->hasmapto()

histadd({history}{item})                              histadd()
                文字列{item}を履歴{history}に追加する。履歴{history}は以下のう
                ちどれか一つから選択:                   hist-names
                        "cmd"    or ":"   コマンドライン履歴
                        "search" or "/"   検索パターン履歴
                        "expr"   or "="   タイプされた式の履歴
                        "input"  or "@"   input()の履歴
                        "debug"  or ">"   デバッグコマンドの履歴
                {history} 文字列はフルネームで指定する必要はありません。頭文字
                だけでも構いません。
                {item}が履歴内に既に存在する場合、それが最新の項目の位置へシフ
                トされる。結果は数値:操作が成功した場合真、そうでなければ偽が
                返る。

                例:
                        :call histadd("input", strftime("%Y %b %d"))
                        :let date=input("Enter date: ")
                サンドボックスsandboxの中では利用できない。

                method としても使用でき、ベースは第2引数として渡される:
                        GetHistory()->histadd('search')

histdel({history} [, {item}])                           histdel()
                {history}の内容を削除する。例えば全てのエントリを消すこともで
                きる。{history}の部分に可能な値はhist-namesを参照。

                パラメーター{item}が文字列に評価される場合、これは正規表現と
                して扱われる。その表現にマッチする全てのエントリがhistoryから
                削除される(複数あっても)。
                "\c" をつけない場合、大文字・小文字が一致しなければならない。
                /\c
                {item}が数値に評価される場合、インデックスとして解釈される。イ
                ンデックスについては:history-indexingを参照。関連するエントリ
                {訳注: The respective entry} も、存在すれば削除される。

                結果は削除に成功すれば真、そうでなければ偽が返る。

                例:
                式レジスタの履歴を削除する:
                        :call histdel("expr")

                検索履歴から、"*" で始まるエントリを全て削除する:
                        :call histdel("/", '^\*')

                次の3つは等価である:
                        :call histdel("search", histnr("search"))
                        :call histdel("search", -1)
                        :call histdel("search", '^'.histget("search", -1).'$')

                最後の検索パターンを削除し、一つ前のパターンを "n" コマンド(次
                のマッチへ移動)と 'hlsearch' の為に設定する:
                        :call histdel("search", -1)
                        :let @/ = histget("search", -1)

                method としても使用できる:
                        GetHistory()->histdel()

histget({history} [, {index}])                          histget()
                結果は{history}の第{index}エントリを表わす文字列。{history} の
                部分に可能な値はhist-namesを、{index}については
                :history-indexingを参照。指定されたエントリが存在しない場合
                は空文字列が返される。{index}が省略された場合には、履歴中の最
                新のエントリが戻り値として使用される。

                例:
                2つ前に行われた検索をやり直す:
                        :execute '/' . histget("search", -2)

                :historyによって出力される{num}番目のエントリを、再度実行す
                るための ":H {num}" というコマンドを定義する。
                        :command -nargs=1 H execute histget("cmd",0+<args>)

                method としても使用できる:
                        GetHistory()->histget()

histnr({history})                                       histnr()
                結果は数値で{history}の現在のエントリ数。{history}の部分に可能
                な値はhist-namesを参照。エラーが起こった場合、-1が返される。

                例:
                        :let inp_index = histnr("expr")

                method としても使用できる:
                        GetHistory()->histnr()

hlexists({name})                                        hlexists()
                結果は数値で、{name}という名のハイライトグループが存在すれば、
                真が返される。これはなんらかの方法でそのグループが既に定義され
                ている時にのみ起こる。これの為に実際に何らかのハイライティング
                アイテムが設定されている必要はなく、単に構文アイテムとしても使
                われるだろう。
                                                        highlight_exists()
                以前の名前: highlight_exists().

                method としても使用できる:
                        GetName()->hlexists()

                                                        hlID()
hlID({name})    結果は数値で、{name}という名前のハイライトグループのID番号。そ
                のハイライトグループが存在しない場合は0が返される。
                これはハイライトグループについての情報を獲得するために使用され
                る。例えば "Comment" グループの背景色を取得するにはこのように
                する:
        :echo synIDattr(synIDtrans(hlID("Comment")), "bg")
                                                        highlightID()
                以前の名前: highlightID()

                method としても使用できる:
                        GetName()->hlID()

hostname()                                              hostname()
                結果は文字列で、現在Vimが実行されているマシンの名前。名前が256
                文字を超える場合、超えた部分は切り捨てられる。

iconv({expr}{from}{to})                             iconv()
                文字列{expr}をエンコーディング{from}からエンコーディング{to}
                変換した文字列を返す。
                変換が完全に失敗したときは空文字列を返す。一部の文字が変換でき
                なかった場合、その文字は "?" に置き換わる。
                エンコーディング名はライブラリ関数iconv()が受け付けるものなら
                なんでもよい。":!man 3 iconv" を参照。
                ほとんどの変換は、Vimが+iconv機能つきでコンパイルされている
                ときのみ利用可能。+iconvつきでないときもUTF-8からlatin1への
                変換とその逆は行える。
                オプション 'encoding' の値に関係なく、特殊な文字を含むメッセー
                ジを表示するために使える。UTF-8でエンコードされたメッセージを
                表示するには次のようにする:
                        echo iconv(utf8_str, "utf-8", &enc)
                Note Vimは全てのUnicodeエンコーディングに対してUTF-8を使う。
                UCS-2との変換を行おうとしても、自動的にUTF-8との変換に変更され
                る。いずれにせよ、UCS-2はNULバイトを含むため、文字列にUCS-2を
                使うことはできない。

                method としても使用できる:
                        GetText()->iconv('latin1', 'utf-8')

                                                        indent()
indent({lnum})  カレントバッファの{lnum}行目のインデント量を数値で返す。この
                インデント量はスペース単位で数えられ、'tabstop' の値が関係する。
                {lnum}getline()の場合と同様に扱われる。
                {lnum}が無効なときは-1を返す。

                method としても使用できる:
                        GetLnum()->indent()

index({object}{expr} [, {start} [, {ic}]])                    index()
                {object}が List の場合は、{expr}に等しい要素の最小のインデッ
                クスを返す。自動的な変換は行われないので、文字列の "4" は数値
                の 4 とは異なると判定される。そして数値の 4 は浮動小数点数の
                4.0 とも異なる。'ignorecase' はここでは適用されず、常に大文字・
                小文字は区別される。

                {object}が Blob の場合は、{expr}に等しいバイト値の最小のイン
                デックスを返す。

                {start}が指定された場合はインデックス{start}から要素の検索を始
                める(負数を指定すると末尾からの相対位置となる)。
                {ic}TRUEが指定された場合、大文字・小文字は区別されない。
                そうでない場合は区別される。
                {object}の中に{expr}が見つからない場合は-1を返す。
                例:
                        :let idx = index(words, "the")
                        :if index(numbers, 123) >= 0

                method としても使用できる:
                        GetObject()->index(what)

input({prompt} [, {text} [, {completion}]])             input()
                結果は文字列で、ユーザーがコマンドラインに入力したものが返され
                る。引数 {prompt} にはプロンプト文字列か空文字列を指定する。空
                文字列の場合はプロンプトなしになる。'\n' を使ってプロンプトに
                改行を含めることができる。
                :echohlによるハイライトの設定がプロンプトに適用される。
                入力はコマンドラインと同様に行え、同じ編集コマンドやキーマップ
                が使用できる。input()に入力された文字列には、他の履歴とは独立
                した履歴が与えられる。
                例:
                        :if input("Coffee or beer? ") == "beer"
                        :  echo "Cheers!"
                        :endif

                省略可能な引数{text}が与えられ、空でないならば、それが入力の初
                期値として、ユーザーが入力したのと同じ様に表示される。例:
                        :let color = input("Color? ", "white")

                省略可能な引数{completion}はこの入力において利用できる補完の種
                類を指定する。この引数がないときは補完は行われない。対応してい
                る補完の種類は、ユーザー定義コマンドにおいて引数 "-complete="
                で指定するものと同じである。詳しくは:command-completionを参
                照。
                例:
                        let fname = input("File: ", "", "file")

                NOTE: この関数はGUIモードしか持たないバージョン(例、Win32 GUI)
                のVimでは、スタートアップファイルの中で使用することはできな
                い。
                NOTE: マッピングの中からinput()を呼ぶと、そのマッピングの残り
                の文字が消費される。マッピングは、その文字が入力されたときと同
                じように処理されるためである。
                これを避けるには、input()の前にinputsave()を呼び、input()の
                後にinputrestore()を呼ぶ。もう1つの対策は、:execute
                :normalを使うなどして、そのマッピングでそれ以上文字を続けな
                いようにすることである。

                マッピングと同時に使う例:
                        :nmap \x :call GetFoo()<CR>:exe "/" . Foo<CR>
                        :function GetFoo()
                        :  call inputsave()
                        :  let g:Foo = input("enter search pattern: ")
                        :  call inputrestore()
                        :endfunction

                method としても使用できる:
                        GetPrompt()->input()

inputdialog({prompt} [, {text} [, {cancelreturn}]])             inputdialog()
                input()と同様。GUIで動作していて、テキストダイアログがサポー
                トされている場合はダイアログを表示してテキストを入力させる。
                例:
                   :let n = inputdialog("value for shiftwidth", shiftwidth())
                   :if n != ""
                   :  let &sw = n
                   :endif
                ダイアログがキャンセルされたときは{cancelreturn}を返す。
                {cancelreturn}が省略されているときは空文字列を返す。
                <Enter>を押すとOKボタンを押すのと同じ動作になる。<Esc>を押すと
                キャンセルボタンを押すのと同じ動作になる。
                NOTE: コマンドライン補完は対応していない。

                method としても使用できる:
                        GetPrompt()->inputdialog()

inputlist({textlist})                                   inputlist()
                {textlist}は文字列のリストListでなければならない。1行につき
                リストの要素を1個表示し、ユーザーに数字を入力するよう促す。入
                力された数字を返す。
                ユーザーは、もしマウスがコマンドラインで有効なら ('mouse' が
                "a" であるか "c" を含む)、マウスで文字列をクリックすることでも
                選択できる。最初の文字列を選択すると0が返る。最初の文字列より
                上をクリックすると負数が返る。プロンプト自身をクリックすると
                {textlist}の長さ+1 が返る。
                {textlist}の要素数はオプション 'lines' の値より少なくなければ
                ならない。そうでないと動作しない。最初の要素にメッセージを書
                き、各文字列の先頭に番号をつけておくとよい。
                例:
                        let color = inputlist(['Select color:', '1. red',
                                \ '2. green', '3. blue'])

                method としても使用できる:
                        GetChoices()->inputlist()

inputrestore()                                          inputrestore()
                前回のinputsave()で保存しておいた先行入力を復元する。
                inputsave()と同じ回数だけ呼ぶようにしなければならない。しかし
                多く呼びすぎても害はない。復元するものがなければ真を、そうでな
                ければ偽を返す。

inputsave()                                             inputsave()
                先行入力(マッピングにより入力された文字も含む)を保存し、クリア
                することにより、これ以降のプロンプトがユーザーからの入力を得る
                ようにする。プロンプトの後で、対応するinputrestore()を呼び出さ
                ねばならない。複数回呼ぶこともできる。ただしその場合は同じ回数
                だけinputrestore()を呼ばなくてはならない。
                メモリ不足のときは真を、そうでなければ偽を返す。

inputsecret({prompt} [, {text}])                        inputsecret()
                input()とほぼ同じだが、以下の2点が異なる:
                a) ユーザーの入力をアスタリスク("*")の列として表示し、入力内容
                を読めないようにする。
                b) ユーザーの入力が入力履歴historyに残らない。
                ユーザーの入力内容を文字列として返す。
                NOTE: コマンドライン補完には対応していない。

                method としても使用できる:
                        GetPrompt()->inputsecret()

insert({object}{item} [, {idx}])                      insert()
                {object}が List か Blob の場合、それの先頭に{item}を挿入す
                る。

                {idx}が指定されたときはインデックス{idx}の要素の前に{item}を挿
                入する。{idx}が0のときは{idx}を省略した場合と同じ様に最初の要
                素の前に挿入する。{idx}は負数でもよい(list-index参照)。-1を
                指定すると最後の要素の前に挿入する。

                挿入した結果の List か Blob を返す。例:
                        :let mylist = insert([2, 3, 5], 1)
                        :call insert(mylist, 4, -1)
                        :call insert(mylist, 6, len(mylist))
                最後の例はadd()を使うともっと簡単に書ける。
                Note {item}がリストの場合は、1個の要素として追加される。リスト
                を連結するにはextend()を使うこと。

                method としても使用できる:
                        mylist->insert(item)

interrupt()                                             interrupt()
                スクリプトの実行を中断する。これは多かれ少なかれ、ユーザーが
                CTRL-C をタイプしたように動作する。多くのコマンドが実行されず、
                制御がユーザーに戻される。これは、自動コマンドの中など下位から
                実行を中断するのに有用である。例:
                :function s:check_typoname(file)
                :   if fnamemodify(a:file, ':t') == '['
                :       echomsg 'Maybe typo'
                :       call interrupt()
                :   endif
                :endfunction
                :au BufWritePre * call s:check_typoname(expand('<amatch>'))

invert({expr})                                          invert()
                ビット反転。引数は数値に変換される。リスト、辞書、浮動小数点数
                を指定するとエラーになる。例:
                        :let bits = invert(bits)
                method としても使用できる:
                        :let bits = bits->invert()

isdirectory({directory})                                isdirectory()
                結果は数値で、{directory}という名前のディレクトリが存在すれば
                TRUEとなる。{directory}が存在しないか、存在したとしても
                ディレクトリではなかった場合には、FALSEが返される。文字列と
                して解釈できるのならば{directory}の表現はどのようなもので
                あってもかまわない。

                method としても使用できる:
                        GetName()->isdirectory()

isinf({expr})                                           isinf()
                {expr}が正の無限大の場合は1、負の無限大の場合は-1を返し、それ
                以外の場合は0を返す。
                        :echo isinf(1.0 / 0.0)
                        1
                        :echo isinf(-1.0 / 0.0)
                        -1

                method としても使用できる:
                        Compute()->isinf()

                {+float 機能を有効にしてコンパイルしたときのみ有効}

islocked({expr})                                        islocked() E786
                結果は数値で、{expr}がロックされている変数の名前ならばTRUE
                返す。
                {expr}は変数の名前、リストの要素、辞書の要素のいずれかでなけれ
                ばならない。変数そのものを指定しないように注意。例:
                        :let alist = [0, ['a', 'b'], 2, 3]
                        :lockvar 1 alist
                        :echo islocked('alist')         " 1
                        :echo islocked('alist[1]')      " 0

                {expr}が存在しない変数のときはエラーメッセージが表示される。変
                数の存在を確認するにはexists()を使う。
                Vim9 script ではローカル変数に対しては動作しない。

                method としても使用できる:
                        GetName()->islocked()

isnan({expr})                                           isnan()
                {expr} が NaN の値を持つ浮動小数点数ならば TRUE を返す。
                        echo isnan(0.0 / 0.0)
                        1

                method としても使用できる:
                        Compute()->isnan()

                {+float 機能を有効にしてコンパイルしたときのみ有効}

items({dict})                                           items()
                {dict}の全要素のキー・値のペアからなるリストを返す。戻り値の各
                要素はリストであり、キーと値の2個の要素を持つ。戻り値のリスト
                の要素の順序は不定である。keys() と values() も参照。
                例:
                        for [key, value] in items(mydict)
                           echo key . ': ' . value
                        endfor

                method としても使用できる:
                        mydict->items()

job_ 関数群はここに文書化されている: job-functions-details

join({list} [, {sep}])                                  join()
                リスト{list}の要素を連結し、1個の文字列にして返す。
                {sep}が指定されたときは、要素の間にそれを挿入する。{sep}が指定
                されなかったときは1個のスペースが使われる。
                Note 末尾には{sep}がつかない。末尾にもつけたければ以下のように
                する:
                        let lines = join(mylist, "\n") . "\n"
                {list}の要素が文字列なら、そのまま使われる。リストと辞書は
                string()を使ったときと同じようにして文字列に変換される。
                この逆を行う関数はsplit()である。

                method としても使用できる:
                        mydict->join()

js_decode({string})                                     js_decode()
                json_decode() に似ているが以下が異なる:
                - オブジェクトのキー名はクォートされてなくてもよい。
                - 文字列はシングルクォートでくくることができる。
                - 配列内の(2つのコンマで区切られた)空アイテムが許可され結果と
                  して v:none のアイテムとなる。

                method としても使用できる:
                        ReadObject()->js_decode()

js_encode({expr})                                       js_encode()
                json_encode() に似ているが以下が異なる:
                - オブジェクトのキー名がクォートされない
                - 配列の中のアイテム v:none はコンマで区切られた空のアイテムに
                  なる。
                例えば Vim オブジェクト:
                        [1,v:none,{"one":1},v:none]
                は以下にエンコードされ:
                        [1,,{one:1},,]
                json_encode() であれば以下にエンコードされる:
                        [1,null,{"one":1},null]
                このエンコードは JavaScript では妥当である。特に配列内でオプ
                ショナルアイテムを扱う場合には JSON より能率的である。

                method としても使用できる:
                        GetObject()->js_encode()

json_decode({string})                                   json_decode()
                これはJSONフォーマットの文字列を解析し、それと同等のVimの値を
                返す。JSONとVimの値の関係はjson_encode()を参照。
                デコードは寛容である:
                - 配列やオブジェクトの末尾コンマは無視される、例えば
                  "[1, 2, ]" と "[1, 2]" は同じである。
                - 整数のキーはオブジェクト内で受け入れられる。例えば、{1:2} は
                  {"1":2} と同じである。
                - 多くの浮動小数点数を認識する。例えば "1." は "1.0" となり、
                  "001.2" は "1.2" となる。特別な浮動小数点の値、"Infinity",
                  "-Infinity" および "NaN" (大文字は無視される) は受け付けられ
                  る。
                - 整数値の先頭に付く 0 は無視される、例えば "012" は "12" とな
                  り、"-012" は "-12" となる。
                - null、true および false の大文字は無視される、例えば "NULL"
                  は "null" となり、"True" は "true" となる。
                - 文字列中でエスケープされない U+0000 から U+001F の制御文字は
                  受け付けられる、例えば "      " (文字列中のタブ文字) は "\t"
                  となる。
                - 空のJSON式、またはスペースのみで構成されているものは受け入れ
                  られ、v:none になる。
                - 無効な 2 文字のシーケンスエスケープ中のバックスラッシュは無
                  視される、例えば "\a" は "a" と解釈される。
                - JSON 文字列中の正しいサロゲートペアは、通常 "\uD834\uDD1E"
                  のような連続した 12 文字でなければならないが、json_decode()
                  は、"\uD834" や "\uD834\u" のような途切れたサロゲートペアを
                  黙って受け付ける。
                                                                E938
                結果は Vim の有効な型でなければならないため、rfc7159 では有効
                なオブジェクト内の重複キーは、json_decode() では受け付けられな
                い、例えばこれは失敗する: {"a":"b", "a":"c"}

                method としても使用できる:
                        ReadObject()->json_decode()

json_encode({expr})                                     json_encode()
                {expr}をJSONフォーマットの文字列にエンコードし、この文字列を返
                す。
                このエンコード方式の詳細はここに記載されている:
                https://tools.ietf.org/html/rfc7159.html
                Vimの値は以下の通りに変換される:
                   数値 Number        10進数
                   浮動小数点数 Float 浮動小数点数
                   浮動小数点数 nan     "NaN"
                   浮動小数点数 inf     "Infinity"
                   浮動小数点数 -inf    "-Infinity"
                   文字列 String      ダブルクォートで括られた文字列(null可)
                   Funcref            不可、エラー
                   リスト List        配列(null可)
                                        再帰的に使用された場合: []
                   辞書 Dict          オブジェクト(null可)
                                        再帰的に使用された場合: {}
                   Blob               個々のバイト配列
                   v:false              "false"
                   v:true               "true"
                   v:none               "null"
                   v:null               "null"
                NaNとInfinityは値として渡されることに注意すること。これはJSON
                標準には存在しないが、いくつかの実装でそれが可能である。そうで
                ない場合、エラーが発生する。

                method としても使用できる:
                        GetObject()->json_encode()

keys({dict})                                            keys()
                {dict}の全キーからなるリスト List を返す。リストの順序は不定
                である。items() と values() も参照。

                method としても使用できる:
                        mydict->keys()

                                                        *len()* *E701*
len({expr})     結果は数値で、引数{expr}の長さ。{expr}が文字列または数値のとき
                はstrlen()と同じようにバイト単位での長さを返す。
                {expr}がリスト List のときは要素数を返す。
                {expr}が Blob の場合、バイト数を返す。
                {expr}が辞書 Dictionary のときは要素数を返す。
                それ以外のときはエラーとなる。

                method としても使用できる:
                        mylist->len()

                                                *libcall()* *E364* *E368*
libcall({libname}{funcname}{argument})
                ランタイムライブラリ{libname}の関数{funcname}を、単一の引数
                {argument}で呼び出す。
                Vimで使うように特別に作ったライブラリの関数を呼ぶために使われ
                る。引数は1個しか指定できないため、普通のライブラリ関数を呼ぶ
                にはかなり制限がある。
                結果には、呼び出した関数から返された文字列が返される。呼び出し
                た関数がNULLを返した場合には、Vimには空文字列 "" が戻される。
                関数の戻り値が数値である場合にはlibcallnr()を使うこと。
                もしも引数が数値ならば、関数にはint型の引数が1つ渡される。引数
                が文字列の場合には、関数にはヌル終端記号を持つ文字列が引数とし
                て渡される。
                restricted-modeの中で呼ぶと失敗する。

                libcall()によってVimを再コンパイルすることなく 'plug-in' と呼
                ばれる独自の拡張を行うことができるようになる。それは (直接) シ
                ステムの関数を呼ぶ、ということではない。システム関数を呼ぶとお
                そらくVimがクラッシュするだろう。

                Win32では、あなたが書いた関数をDLLに置かなければならず、また通
                常のC呼出し規約を使用しなければならない(WindowsのシステムDLLが
                使うPascalではない)。関数は正確に1つのパラメーター、char型ポイ
                ンタもしくはint型を取らなければならず、戻り値としてchar型ポイ
                ンタかNULLを返さなければならない。返されるchar型ポインタは、関
                数終了後も有効なポインタ(例えばDLL内の静的なデータ)を指さなけ
                ればならない。(malloc等で)割り当てられたメモリを保持していた場
                合、それはリークしてしまう。DLL内のスタティックバッファを用い
                る方法は動くかもしれないが、使用済みDLLがメモリから削除される
                と同時に解放されてしまう。

                警告: もしも関数が有効ではないポインタを返すと、Vimはクラッ
                シュしてしまう。関数が数値を返してしまった場合、Vimはそれをポ
                インタとして扱ってしまうので、やはりクラッシュが起こる。
                Win32のシステムでは、{libname}はDLLのファイル名の拡張子 ".DLL"
                を付けてはならない。通常の(パスの通った)場所にDLLがない場合に
                は、フルパスで指定する必要がある。
                Unixでは、独自のプラグインをコンパイルするときはオブジェクト
                コードを位置独立('PIC')としてコンパイルしなければならない。
                {Win32 といくつかの Unix で、+libcall 機能が有効になっている
                ときのみ利用可能}
                例:
                        :echo libcall("libc.so", "getenv", "HOME")

                method としても使用でき、ベースは第3引数として渡される:
                        GetValue()->libcall("libc.so", "getenv")

                                                        libcallnr()
libcallnr({libname}{funcname}{argument})
                libcall()とほぼ同様だが、文字列でなくintを返す関数に使う。
                {Win32と、+libcall機能が有効になっているUnixでのみ利用可能}
                例:
                        :echo libcallnr("/usr/lib/libc.so", "getpid", "")
                        :call libcallnr("libc.so", "printf", "Hello World!\n")
                        :call libcallnr("libc.so", "sleep", 10)

                method としても使用でき、ベースは第3引数として渡される:
                        GetValue()->libcallnr("libc.so", "printf")


line({expr} [, {winid}])                                line()
                結果は数値で、{expr}で与えられた位置のファイル内での行番号。受
                け付けられる位置指定は次の通り:
                    .       カーソルの位置
                    $       現在のバッファの最後の位置
                    'x      マークxの位置(マークが設定されていない場合、0が返
                            る)
                    w0      カレントウィンドウの最上行 (サイレント Ex モードの
                            ように、画面が更新されない場合は 1)
                    w$      カレントウィンドウの最下行 (行が表示されていない場
                            合は "w0" より 1 小さい)
                    v       ビジュアルモードでは: ビジュアル選択領域の開始行
                            (カーソルがその端)。ビジュアルモード以外ではカーソ
                            ル位置を返す。すぐに更新される点が '< と違う。
                Note 他のファイルのマークも使える。その場合、戻り値はそのファ
                イルの行番号となる。
                桁番号を取得するにはcol()を使う。両方を取得するには
                getpos()を使う。
                オプションの {winid} 引数を使用すると、カレントウィンドウの代
                わりにそのウィンドウの値が取得される。
                例:
                        line(".")               カーソルの行番号
                        line(".", winid)        ウィンドウ "winid" で同上
                        line("'t")              マークtの位置の行番号
                        line("'" . marker)      マークmarkerの位置の行番号

                ファイルを開くときに最後の既知の位置にジャンプするには、
                last-position-jump を参照。

                method としても使用できる:
                        GetValue()->line()

line2byte({lnum})                                       line2byte()
                バッファの先頭から、{lnum}行目までのバイト数を返す。これには現
                在のバッファのオプション 'fileformat' に従った、end-of-line(行
                終端)文字も含まれている。最初の行においては1が返る。バイト数は
                'encoding' に基づく。'fileencoding' は無視される。
                次のようにすることで最終行を含むバイトサイズを獲得することがで
                きる:
                        line2byte(line("$") + 1)
                これはバッファの大きさプラス1になる。もし 'fileencoding' が空
                ならその値はファイルの大きさプラス1に等しい。{lnum} は
                getline() と同様に扱われる。{lnum} が無効であるか、
                +byte_offset 機能がコンパイル時に無効にされている場合、-1が
                返される。
                byte2line()go及び:gotoも参照。

                method としても使用できる:
                        GetLnum()->line2byte()

lispindent({lnum})                                      lispindent()
                'lisp' をオンにしたときと同じlisp用のインデント規則に従った場
                合の{lnum}行目のインデント量を返す。
                インデント量はスペースで数えられ、'tabstop' の値は関係ない。
                {lnum}getline()の場合と同様に扱われる。
                {lnum}が無効な値のときや+lispindent機能なしでコンパイルされ
                ているときは-1を返す。

                method としても使用できる:
                        GetLnum()->lispindent()

list2str({list} [, {utf8}])                             list2str()
                {list}の各数値を文字列に変換し、それらすべてを連結する。例:
                        list2str([32])          returns " "
                        list2str([65, 66, 67])  returns "ABC"
                以下で同様のことが(遅く)おこなえる:
                        join(map(list, {nr, val -> nr2char(val)}), '')
                str2list() は反対のことをする。

                {utf8}が省略されているかゼロの場合、現在の 'encoding'が使用さ
                れる。{utf8}が1の場合は、常にutf-8文字列を返す。
                utf-8の合成文字は期待通りに動作する:
                        list2str([97, 769])     returns "á"

                method としても使用できる:
                        GetList()->list2str()

listener_add({callback} [, {buf}])                      listener_add()
                バッファ {buf} に変更が加えられたときに呼び出されるコールバッ
                ク関数を追加する。
                {buf} はバッファ名またはバッファ番号を参照する。許容値について
                は、bufname() を参照。{buf}を省略すると、現在のバッファが使
                用される。
                listener_remove() に渡すことができる一意のIDを返す。

                {callback} は 5 つの引数で呼び出される:
                    a:bufnr     変更されたバッファ
                    a:start     最初に変更された行番号
                    a:end       変更された下の最初の行番号
                    a:added     追加された行数。行が削除された場合は負値
                    a:changes   変更についての詳細を含む項目のリスト

                例:
            func Listener(bufnr, start, end, added, changes)
              echo 'lines ' .. a:start .. ' until ' .. a:end .. ' changed'
            endfunc
            call listener_add('Listener', bufnr)

                リストは変更できない。各リスト項目は、次のエントリを持つ辞書で
                ある:
                    lnum        変更の最初の行番号
                    end         変更された行の下の行
                    added       追加された行数。行が削除された場合は負値
                    col         変更の影響を受けた "lnum" の最初の桁。不明な場
                                合、または行全体が影響を受けた場合は 1。これは
                                バイトインデックスである。最初の文字の値は 1
                                である。
                行が挿入されたときの値は次のとおり:
                    lnum        上に新しい行が追加される行番号
                    end         "lnum" と同じ
                    added       挿入された行数
                    col         1
                行が削除されたときの値は次のとおり:
                    lnum        最初に削除された行番号
                    end         削除が行われる前の、最初に削除された行の下の行
                    added       負値。削除された行数
                    col         1
                行が変更されたときの値は次のとおり:
                    lnum        最初の変更行
                    end         最後に変更された行の下の行
                    added       0
                    col         変更した最初の桁または 1

                エントリは変更が行われた順になっているため、最新の変更は最後に
                なる。行番号はコールバックが呼び出されたときに有効だが、後の変
                更はそれらを無効にするかもしれない。したがって、後のためにコ
                ピーを保持しても機能しないかもしれない。

                {callback} は、listener_flush() が呼び出されたとき、または、
                行数を変更するような変更が行われ、変更リストの行番号が無効に
                なったときに、画面が更新される直前に呼び出される。

                {callback} はテキストをロックした状態で呼び出される。
                textlock を参照。バッファを変更する必要がある場合は、後でこ
                れを実行するためのタイマー timer_start() を使用すること。

                バッファが最初にロードされた時には {callback} は呼び出されな
                い。BufReadPost 自動コマンドイベントを使用して、バッファの初
                期テキストを処理する。
                {callback} はバッファがアンロードされたときにも呼び出されない。
                そのためには BufUnload 自動コマンドイベントを使用すること。

                method としても使用でき、ベースは第2引数として渡される:
                        GetBuffer()->listener_add(callback)

listener_flush([{buf}])                                 listener_flush()
                バッファ {buf} のリスナーコールバックを呼び出す。保留中の変更
                がない場合は、コールバックは呼び出されない。

                {buf} はバッファ名またはバッファ番号を表す。許容値については、
                bufname() を参照。{buf} を省略すると、カレントバッファが使用
                される。

                method としても使用できる:
                        GetBuffer()->listener_flush()

listener_remove({id})                                   listener_remove()
                以前に listener_add() で追加されたリスナーを削除する。
                {id} が見つからなかった場合は偽、{id} が削除された場合は真を返
                す。

                method としても使用できる:
                        GetListenerId()->listener_remove()

localtime()                                             localtime()
                現在の時刻、1970年1月1日からの経過秒数を返す。strftime(),
                strptime() と getftime() も参照。


log({expr})                                             log()
                {expr} の自然対数 (底e) を浮動小数点数 (Float) で返す。
                {expr} は (0, inf] の範囲の浮動小数点数 (Float) か数値
                (Number) でなければならない。
                例:
                        :echo log(10)
                        2.302585
                        :echo log(exp(5))
                        5.0

                method としても使用できる:
                        Compute()->log()

                {+float 機能を有効にしてコンパイルしたときのみ有効}


log10({expr})                                           log10()
                浮動小数点数 {expr} の 10 を底とする対数を Float で返す。
                {expr} は Float または Number に評価されなければならな
                い。
                例:
                        :echo log10(1000)
                        3.0
                        :echo log10(0.01)
                        -2.0

                method としても使用できる:
                        Compute()->log10()

                {+float 機能つきでコンパイルされたときのみ有効}

luaeval({expr} [, {expr}])                                      luaeval()
                Lua の式 {expr} を評価し、その結果を Vim のデータ構造に変換し
                たものを返す。2番目の {expr} は、最初の {expr} の中では _A と
                してアクセスできる追加の引数を保持する。
                文字列はそのまま返される。
                ブーリアンオブジェクトは数値に変換される。
                数値は、vim が +float つきでコンパイルされたときは Float
                値に変換され、そうでなければ数値に変換される。
                vim.eval() で取得される辞書とリストはそのまま返される。
                それ以外のオブジェクトは 0 が返され、エラーにはならない。
                詳細は lua-luaeval を参照。
                Note :def 関数にあるローカル変数は {expr} からは見えない。

                method としても使用できる:
                        GetExpr()->luaeval()

                {+lua 機能つきでコンパイルされたときのみ有効}

map({expr1}{expr2})                                   map()
                {expr1}はリストListBlobまたは辞書Dictionary
                {expr1}の各要素を、{expr2}を評価した結果で置き換える。Blob
                の場合、各バイトを置き換える。
                要素の型を変更したい場合は、mapnew() を使って新しいリストか
                辞書を作る。これは、Vim9 script を使用する場合に必要である。

                {expr2}は文字列stringまたは関数参照Funcrefでなければならな
                い。

                {expr2}が文字列の場合、{expr2}の内部ではv:valが現在の要素の
                値を保持している。辞書の場合はv:keyが現在の要素のキーを保持
                している。リストの場合はv:keyが現在の要素のインデックスを保
                持している。Blob の場合は v:key が現在のバイトのインデック
                スを保持している。
                例:
                        :call map(mylist, '"> " . v:val . " <"')
                これは "mylist" の各要素の前に "> " をつけ、後に " <" をつける。
                Note {expr2}は式を表す文字列である。バックスラッシュを二重に
                しなくても済むようにliteral-stringを使うとよいだろう。ただし
                その場合はシングルクォートを二重にしなければならない。

                {expr2}Funcrefの場合は、2つの引数で呼び出される:
                        1. 現在の要素のキーまたはインデックス。
                        2. 現在の要素の値。
                関数は、その要素の新しい値を返さなければならない。それぞれの値
                を "key-value" に置き換える例:
                        func KeyValue(key, val)
                          return a:key . '-' . a:val
                        endfunc
                        call map(myDict, function('KeyValue'))
                lambda を使えばより短く書ける:
                        call map(myDict, {key, val -> key . '-' . val})
                "val" を使わない場合は省略できる:
                        call map(myDict, {key -> 'item: ' . key})
                "key" を使用しない場合は、短い名前が使用できる:
                        call map(myDict, {_, val -> 'item: ' . val})

                この操作はその場で(in-place)行われる。リストや辞書を変更したく
                ない場合は最初にコピーを作ること:
                        :let tlist = map(copy(mylist), ' v:val . "\t"')

                {expr1}のリスト、Blobまたは辞書に式を適用した結果を返す。
                {expr2}を評価している最中にエラーが発生した場合は、{expr1}内の
                それ以降の要素の処理は行われない。{expr2}が関数参照の場合、関
                数が "abort" フラグつきで定義されていない限り、関数内のエラー
                は無視される。

                method としても使用できる:
                        mylist->map(expr2)


maparg({name} [, {mode} [, {abbr} [, {dict}]]])                 maparg()
                {dict}が省略されたかゼロのとき: モード{mode}におけるキーマップ
                {name}のrhsを返す。結果の文字列内の特殊文字は、":map" コマンド
                でリスト表示した時のように変換される。

                {name} というキーマップが存在しない場合、空文字列が返される。
                {name} というキーマップが空の場合、"<Nop>" が返される。

                {name}には ":map" コマンドで使用可能な、特殊なキー名が指定でき
                る。

                {mode}には次の文字が使用可能:
                        "n"     ノーマル
                        "v"     ビジュアル (選択含む)
                        "o"     オペレータ待機 (Operator-pending)
                        "i"     挿入
                        "c"     コマンドライン
                        "s"     選択
                        "x"     ビジュアル
                        "l"     langmap language-mapping
                        "t"     端末ジョブ
                        ""      ノーマル、ビジュアル、及びオペレータ待機
                {mode}が省略された場合、"" が使用される。

                {abbr}が指定され、TRUEの場合はマッピングでなく短縮入力を対象
                とする。

                {dict} にTRUEが指定されたときはマッピングのすべての情報を含
                んだ辞書が返る:
                  "lhs"         マッピングの {lhs} (入力されたまま)
                  "lhsraw"      マッピングの {lhs} (生のバイト値)
                  "lhsrawalt"   マッピングの {lhs} (生のバイト値の代替形式、
                                "lhsraw" と違う場合のみ存在)
                  "rhs"         マッピングの {rhs} (入力されたまま)
                  "silent"      :map-silent マッピングなら 1。そうでなければ
                                0。
                  "noremap"     マッピングの {rhs} が再マップ可能でないなら 1。
                  "script"      マッピングが <script> でなされていたら 1。
                  "expr"        式マッピング (:map-<expr>) なら 1。
                  "buffer"      バッファローカルマッピング (:map-local) なら
                                1。
                  "mode"        マッピングが定義されているモード。上述のモードに
                                加え、次の文字が使用される:
                                " "     ノーマル、ビジュアル、オペレータ待機
                                "!"     挿入、コマンドラインモード
                                        (mapmode-ic)
                  "sid"         <sid> マッピングで使用されるスクリプトローカル
                                ID (<SID>)。
                  "lnum"        "sid" 内の行番号。不明の場合はゼロ。
                  "nowait"      他の長いマッピングを待たない。
                                (:map-<nowait>)。

                この辞書は mapset() でマッピングを復元するのに使える。

                まずカレントバッファにローカルなマッピングを探し、次のグローバ
                ルマッピングを探す。
                この関数を使うと、あるキーに対して既にマップがされているとき、
                その動作を行いつつ、再マップすることができる。概要:
                        exe 'nnoremap <Tab> ==' . maparg('<Tab>', 'n')

                method としても使用できる:
                        GetKey()->maparg('n')

mapcheck({name} [, {mode} [, {abbr}]])                  mapcheck()
                モード{mode}におけるキーマップ{name}が存在するかチェックする。
                {name}に指定できる特殊文字はmaparg()を参照。
                {abbr}が指定され、TRUEの場合はマッピングでなく短縮入力を対象
                とする。
                マッピングが{name}で始まるとき、またはマッピングが{name}のはじ
                めに等しいときマッチすると見なされる。

                        マッチするか    "a"     "ab"    "abc"
                   mapcheck("a")        yes     yes      yes
                   mapcheck("abc")      yes     yes      yes
                   mapcheck("ax")       yes     no       no
                   mapcheck("b")        no      no       no

                maparg()との違いは、mapcheck()は{name}にマッチするマップを見つ
                けるが、maparg()はぴったり{name}に一致するマッピングのみを見つ
                ける。
                {name}にマッチするキーマップが存在しない時には、空文字列が返さ
                れる。結果が一つならばマップされたRHSが返される。{name} で始ま
                るマッピングが複数見つかった場合には、それらのうちどれか一つの
                RHSが返される。RHS が空の場合は "<Nop>" となる。
                まずカレントバッファにローカルなマッピングを探し、次のグローバ
                ルマッピングを探す。
                この関数はマッピングが曖昧にならないかチェックするために使うこ
                とができる。例:
        :if mapcheck("_vv") == ""
        :   map _vv :set guifont=7x13<CR>
        :endif
                これは、"_vv" というマッピングが "_v" とか "_vvv" といったマッ
                ピングと衝突しないように事前にチェックしている。

                method としても使用できる:
                        GetKey()->mapcheck('n')


mapnew({expr1}{expr2})                                        mapnew()
                map() と同様だが、{expr1} の要素を置き換える代わりに、新しい
                リストまたは辞書が作成されて返される。{expr1} は変更されない。
                要素は引き続き {expr2} で変更できるが、そうしたくないなら最初
                に deepcopy() を利用すること。

mapset({mode}{abbr}{dict})                                  mapset()
                maparg() が返す辞書からマッピングを復元する。
                {mode} と {abbr} は maparg() を呼ぶのと同じ値である必要があ
                る。 E460
                {mode} はマッピングをセットするモードを定義するのに使い、{dict}
                の "mode" エントリは使われない。
                マッピングの保存と復元の例:
                        let save_map = maparg('K', 'n', 0, 1)
                        nnoremap K somethingelse
                        ...
                        call mapset('n', 0, save_map)
                Note いくつかのモードのマップを置き換えようとする場合の注意、
                たとえば :map! とともに実施するとき、違いがある可能性がある
                ので、全部のマッピングを保存する必要がある。


match({expr}{pat} [, {start} [, {count}]])                    match()
                {expr}がリストの場合は、{pat}にマッチする最初の要素のインデッ
                クスを返す。各要素は文字列として扱われる。リストと辞書はechoし
                たときと同じように文字列表現に変換される。

                それ以外の場合は、{expr}は文字列として扱われる。{expr}の中で
                {pat}にマッチするインデックス(バイト単位のオフセット)を表す数
                値を返す。

                最初の文字またはリストの最初の要素にマッチしたときは0を返す。
                マッチがないときは-1を返す。

                サブマッチを取得するには matchlist() を参照。
                例:
                        :echo match("testing", "ing")   " 結果は 4
                        :echo match([1, 'x'], '\a')     " 結果は 1
                {pat}の扱われ方についてはstring-matchを参照。
                                                                strpbrk()
                strpbrk()に相当する関数はVimに存在しない。しかし同じことを次の
                ようにしてできる:
                        :let sepidx = match(line, '[.,;: \t]')
                                                                strcasestr()
                strcasestr()に相当する関数はVimに存在しない。しかし正規表現に
                "\c" をつければ大文字・小文字の違いを無視できる:
                        :let idx = match(haystack, '\cneedle')

                {start}が指定されたときは、文字列のバイトインデックス{start}
                位置、またはリストの{start}の要素から検索を始める。
                その場合も戻り値は最初の文字/要素から数えたインデックスである
                ことに注意。例:
                        :echo match("testing", "ing", 2)
                の結果は "4"。
                        :echo match("testing", "ing", 4)
                の結果は "4"。
                        :echo match("testing", "t", 2)
                の結果は "3"。
                文字列の場合、{start} > 0のときは、その文字列が{start}バイト後
                から始まるかのように扱われる。そのため、"^" は{start}の位置に
                マッチする。ただし{count}が指定されたときは、{start}より前にお
                けるマッチを無視しているかのように振る舞う(これは後方互換性を
                保つのを少々複雑にしている)。
                文字列の場合、{start} < 0のときは{start}に0をセットする。リス
                トの場合は、末尾からインデックスを数えるという意味になる。
                {start}が範囲外の場合(文字列で{start} > strlen({expr})となった
                場合、リストで{start} > len({expr})となった場合)は-1を返す。

                {count}が指定されたときは{count}番目のマッチ位置を返す。文字列
                でマッチが見つかったとき、次のマッチングは1文字先から行われる。
                よって次の例は1を返す:
                        echo match("testing", "..", 0, 2)
                リストの場合は次の要素から検索を続ける。
                Note {count}を指定すると、{start}の扱い方が変わってしまう。
                前の段落を参照。

                受け付ける正規表現についてはpatternを参照。
                オプション 'ignorecase' により、大文字・小文字を区別するかどう
                かを設定できる。'smartcase' は適用されない。マッチングは常に
                'magic' をオン、'cpoptions' を空にした状態で行われる。
                Note マッチの開始が一致することが望しく、パターンで "*" (任意
                の数のマッチ) を使う場合、テキストにある次のマッチ数ではなく、
                0になる傾向があるので注意。

                method としても使用できる:
                        GetList()->match('word')

                                matchadd() E798 E799 E801 E957
matchadd({group}{pattern} [, {priority} [, {id} [, {dict}]]])
                カレントウィンドウで強調表示するパターンを定義する。このパター
                ンのことを「マッチ」と呼ぶ。構文グループ {group}で強調する。戻
                り値は、マッチを識別する ID である。この ID はウィンドウに紐付
                けられている。matchdelete() でこの ID を指定してマッチを削除
                することができる。この ID はウィンドウパターンは大文字小文字を
                区別し、magic (/magic) として解釈される ({pattern} の中で明
                示的に変更しない限り)。オプションの 'magic''smartcase'
                'ignorecase' は使用されない。
                Concealは特別であり、マッチを隠す作用がある。

                省略可能な引数 {priority} はマッチの優先度を指定する。優先度が
                高いマッチは、より低いマッチの強調を上書きする。優先度は整数で
                指定する(負の数も可能)。{priority} が指定されない場合は既定の
                優先度 10 となる。'hlsearch' の優先度はゼロで、したがってゼロ
                より大きい優先度のマッチはすべてそれを上書きする。構文ハイライ
                ト('syntax' を参照)は独立したメカニズムであり、優先度がいくつ
                であろうとマッチは構文ハイライトより優先する。

                {id} は特定のマッチ ID を返すことを要求する。指定された ID が
                すでに使われていたら、エラーメッセージが表示され、そのマッチは
                登録されない。ID は正の整数を指定する(ゼロは除く)。ID 1, 2, 3
                は :match:2match:3match 用に予約されている。{id} が
                指定されないか -1 のときは、matchadd() が自動的に空いている
                ID を取得する。

                省略可能な引数 {dict} はより一層カスタマイズ可能な値を許す。
                現在、これはhl-Concealでハイライトされたマッチをconceal文字で
                表示されるのを明示するために使われる。
                この辞書は下記のメンバを持つことができる:

                        conceal     マッチ(hl-Concealのためだけにハイライトさ
                                    れたマッチ、:syn-ccharを参照)の代わりに
                                    表示する特別な文字
                        window      現在のウィンドウの代わりに、この番号もしく
                                    はウィンドウ ID のウィンドウを使用する

                コマンド :match と異なり、マッチの個数に上限はない。

                例:
                        :highlight MyGroup ctermbg=green guibg=green
                        :let m = matchadd("MyGroup", "TODO")
                このパターンを削除するには:
                        :call matchdelete(m)

                matchadd() と :match で定義したマッチのリストは
                getmatches() で取得できる。全てのマッチを削除するのは
                clearmatches() 一発でできる。

                method としても使用できる:
                        GetGroup()->matchadd('TODO')

                                                        matchaddpos()
matchaddpos({group}{pos} [, {priority} [, {id} [, {dict}]]])
                matchadd() と同じだが、パターンを指定するのではなく、位置の
                リスト {pos} を指定する。このコマンドは正規表現を扱う必要もな
                く、画面更新のためにバッファ行の境界を設定するため、
                matchadd() よりも速い。これは、例えば括弧の対応を強調表示す
                るような、マッチの追加と削除を高速に実行したい状況を想定してい
                る。

                {pos} は位置のリストである。各位置は以下のいずれかである:
                - 数値。指定した行全体が強調表示される。最初の行の行番号は 1
                  である。
                - 数値を 1 つ持ったリスト。例 [23]。指定した行全体が強調表示さ
                  れる。
                - 数値を 2 つ持ったリスト。例 [23, 11]。最初の数値は行番号、2
                  番目の数値は列番号である (最初の列は 1 である。値は col()
                  の戻り値と同じようにバイト単位である)。指定した位置の文字が
                  強調表示される。
                - 数値を 3 つ持ったリスト。例 [23, 11, 3]。数値 2 つの場合と同
                  じだが、3 つ目に強調表示する文字の長さ (バイト単位) を指定す
                  る。

                {pos} で指定できる位置は最大で 8 個である。

                例:
                        :highlight MyGroup ctermbg=green guibg=green
                        :let m = matchaddpos("MyGroup", [[23, 24], 34])
                パターンの削除:
                        :call matchdelete(m)

                matchaddpos() で追加されたマッチは getmatches() で取得でき
                る。

                method としても使用できる:
                        GetGroup()->matchaddpos([23, 11])

matcharg({nr})                                                  matcharg()
                :match:2match:3matchによって設定されているマッチパター
                ンの情報を返す。{nr}が1のときは:matchの情報、2のときは
                :2matchの情報、3のときは:3matchの情報を返す。
                戻り値は次の2個の要素を持つリストである:
                        引数で指定したハイライトグループ名
                        引数で指定した検索パターン
                {nr}が1、2、3のどれでもないときは空リストを返す。
                マッチパターンがセットされていないときは['', '']を返す。
                :match を保存し、復元するのに便利である。
                :match を使った強調は 3 個までに限られている。
                matchadd() にはこの制限はない。

                method としても使用できる:
                        GetMatch()->matcharg()

matchdelete({id}, [, {win}])                   matchdelete() E802 E803
                matchadd() または :match で定義したマッチの中で ID が {id}
                であるものを削除する。成功したときは 0、失敗したときは
                -1 を返す。matchadd() の例を参照。すべてのマッチを削除するの
                は clearmatches() 一発でできる。
                {win} が指定されれば、カレントウィンドウではなく指定されたウィ
                ンドウあるいはウィンドウID を対象にする。

                method としても使用できる:
                        GetMatch()->matchdelete()

matchend({expr}{pat} [, {start} [, {count}]])                 matchend()
                match()と同じだが、返されるのはマッチした部分文字列の終了後の
                インデックスである。例:
                        :echo matchend("testing", "ing")
                結果は "7"。
                                                        strspn() strcspn()
                Vimにはstrspn()やstrcspn()に相当する関数はないが、matchend()を
                使えば同じことができる:
                        :let span = matchend(line, '[a-zA-Z]')
                        :let span = matchend(line, '[^a-zA-Z]')
                ただしマッチがないときには-1を返すところが異なる。

                {start}match()の場合と同じ意味を持つ。
                        :echo matchend("testing", "ing", 2)
                結果は "7"。
                        :echo matchend("testing", "ing", 5)
                結果は "-1"。
                {expr}がリストの場合、戻り値は match() と等しくなる。

                method としても使用できる:
                        GetText()->matchend('word')


matchfuzzy({list}{str} [, {dict}])                    matchfuzzy()
                {list} が文字列のリストの場合、{list} 内のすべての文字列につい
                て {str} でファジーマッチしたリスト List を返す。返したリス
                トの文字列はマッチのスコアを基準としてソートされる。

                オプションの {dict} 引数では常に以下の項目がサポートされる:
                    matchseq    この項目があり、{str} が空白で区切られた複数の
                                単語を含んでいるなら、単語をその並びで持ってい
                                るものだけを返す。

                {list} が辞書のリストなら、オプションの {dict} 引数では追加で
                以下の項目がサポートされる:
                    key         {str} でファジーマッチする対象となる項目の
                                キー。この項目の値は文字列でなくてはならない。
                    text_cb     {list} 内でファジーマッチしたテキストの各項目
                                ごとに Funcref が呼ばれる。
                                これは辞書の項目が引数となり、返すテキストがそ
                                の項目のファジーマッチの結果として受け付ける。

                {str} はリテラルの文字列として扱われ、マッチ用の正規表現はサ
                ポートされない。{str} の長さは最大256までサポートされる。

                {str} が空白で区切られた複数の単語の場合、返すリストはそれらの
                単語すべてを含む文字列になる。

                マッチする文字列がないかエラーとなった場合、空のリストが返され
                る。{str} の長さが256かそれ以上であるなら、空のリストを返す。

                文字列へのファジーマッチについての詳細は fuzzy-match を参照。

                例:
                   :echo matchfuzzy(["clay", "crow"], "cay")
                ["clay"]を返す。
                   :echo getbufinfo()->map({_, v -> v.name})->matchfuzzy("ndl")
                結果は "ndl" とファジーマッチしたバッファ名のリストになる。
                   :echo getbufinfo()->matchfuzzy("ndl", {'key' : 'name'})
                結果は "ndl" とファジーマッチしたバッファ名をもつバッファ情報
                の辞書のリストになる。
                   :echo getbufinfo()->matchfuzzy("spl",
                                                \ {'text_cb' : {v -> v.name}})
                結果は "spl" とファジーマッチしたバッファ名をもつバッファ情報
                の辞書のリストになる。
                   :echo v:oldfiles->matchfuzzy("test")
                結果は "test" とファジーマッチしたファイル名のリストになる。
                   :let l = readfile("buffer.c")->matchfuzzy("str")
                結果は "str" とファジーマッチした "buffer.c" 内の行のリストになる。
                   :echo ['one two', 'two one']->matchfuzzy('two one')
                結果は ['two one', 'one two'] になる。
                   :echo ['one two', 'two one']->matchfuzzy('two one',
                                                \ {'matchseq': 1})
                結果は ['two one'] になる。

matchfuzzypos({list}{str} [, {dict}])                 matchfuzzypos()
                matchfuzzy() と同様だが、マッチした文字列のリスト、{str} と
                マッチした文字列内の文字の位置のリストとマッチのスコアのリスト
                を返す。byteidx() を使うことで文字位置からバイト位置へ変換で
                きる。

                文字列内で {str} が複数回マッチしたときは、最良のマッチとなっ
                た位置だけを返す。

                もし文字列にマッチしないもしくはエラーとなったときは、3つの空
                のリストを項目とするリストを返す。

                例:
                        :echo matchfuzzypos(['testing'], 'tsg')
                結果は [['testing'], [[0, 2, 6]], [99]] になる。
                        :echo matchfuzzypos(['clay', 'lacy'], 'la')
                結果は [['lacy''clay'], [[0, 1], [1, 2]], [153, 133]] にな
                る。
                        :echo [{'text': 'hello', 'id' : 10}]->matchfuzzypos('ll', {'key' : 'text'})
                結果は [[{'id': 10, 'text''hello'}], [[2, 3]], [127]] にな
                る。

matchlist({expr}{pat} [, {start} [, {count}]])                matchlist()
                match() と同じだがリストを返す。リストの最初の要素は、
                matchstr()が返すのと同じマッチした文字列。それ以降の要素は
                :substituteにおける "\1"、"\2" のようなサブマッチである。\1
                から\9までの間で、指定されなかったものは空文字列となる。例:
                        echo matchlist('acd', '\(a\)\?\(b\)\?\(c\)\?\(.*\)')
                結果は['acd', 'a', '', 'c', 'd', '', '', '', '', '']となる。
                マッチしなかったときは空リストを返す。

                method としても使用できる:
                        GetList()->matchlist('word')

matchstr({expr}{pat} [, {start} [, {count}]])                 matchstr()
                match() と同じだが、マッチした文字列を返す。例:
                        :echo matchstr("testing", "ing")
                結果は "ing"。
                マッチしなかったときは "" を返す。
                {start}の意味は match() の場合と同じ。
                        :echo matchstr("testing", "ing", 2)
                結果は "ing"。
                        :echo matchstr("testing", "ing", 5)
                結果は ""。
                {expr}がリストのときはマッチした要素を返す。
                その要素の型は変換されないため、必ずしも文字列であるとは限らな
                い。

                method としても使用できる:
                        GetText()->matchstr('word')

matchstrpos({expr}{pat} [, {start} [, {count}]])              matchstrpos()
                matchstr() と同じだがマッチした文字列とマッチした開始位置と
                終了位置を返す。例:
                        :echo matchstrpos("testing", "ing")
                結果は ["ing", 4, 7] である。
                マッチが無い場合は ["", -1, -1] が返る。
                {start} が指定されている場合は match() と同じ意味になる。
                        :echo matchstrpos("testing", "ing", 2)
                結果は ["ing", 4, 7] である。
                        :echo matchstrpos("testing", "ing", 5)
                結果は ["", -1, -1] である。
                {expr} が List の場合、マッチしたアイテム、{pat} でマッチし
                た最初のインデックス、マッチの開始位置と終了位置が返る。
                        :echo matchstrpos([1, '__x'], '\a')
                結果は ["x", 1, 2, 3] である。
                型は変更されない。必ずしも文字列である必要はない。

                method としても使用できる:
                        GetText()->matchstrpos('word')


                                                        max()
max({expr})     {expr}の全要素の値の最大値を返す。例:
                        echo max([apples, pears, oranges])

                {expr}はリスト List か辞書 Dictionary である。辞書の場合、
                辞書に含まれるすべての値の最大値を返す。
                {expr}がリストでも辞書でもなかったり、要素のどれかが数値に変換
                できない場合はエラーとなる。
                空のリストまたは辞書の場合は0を返す。

                method としても使用できる:
                        mylist->max()


menu_info({name} [, {mode}])                            menu_info()
                {mode} モードのときのメニュー {name} についての情報を返す。メ
                ニュー名はショートカット文字 ('&') を除いたもの。

                {mode} は以下の文字の1つを指定できる:
                        "n"     ノーマル
                        "v"     ビジュアル (選択含む)
                        "o"     オペレータ待機
                        "i"     挿入
                        "c"     コマンドライン
                        "s"     選択
                        "x"     ビジュアル
                        "t"     端末ジョブ
                        ""      ノーマル、ビジュアル、オペレータ待機
                        "!"     挿入、コマンドライン
                {mode} を指定していないときは、モードとして "" が使用される。

                戻り値の辞書Dictionary は以下の項目が含まれる:
                  accel         メニュー項目のアクセラレータテキスト menu-text
                  display       表示名 ('&' を含まない)
                  enabled       v:true ならメニュー項目が有効
                                :menu-enable を参照
                  icon          アイコンファイル名 (ツールバー向け)
                                toolbar-icon
                  iconidx       組み込みアイコンのインデックス
                  modes         メニューを定義しているモード。上で示している
                                モードに追加して、次の文字が使われる:
                                " "     ノーマル、ビジュアル、オペレータ待機
                  name          メニュー項目名。
                  noremenu      v:true ならメニュー項目の {rhs} が再マップ可能
                                でなく、そうでないなら v:false。
                  priority      メニューの順序優先度 menu-priority
                  rhs           メニュー項目の右辺値。":menu" コマンドが出力す
                                る中にあるように変換された特別な文字を持つ文字
                                列を返す。
                                メニュー項目の {rhs} が空の場合、"<Nop>" を返
                                す。
                  script        {rhs} がスクリプトローカルの再マップができるな
                                ら v:true、そうでないなら v:false。
                                :menu-script を参照。
                  shortcut      ショートカットキー (メニュー項目名の '&' 後に
                                ある文字) menu-shortcut
                  silent        メニュー項目が <silent> 付きで作られていたら
                                v:true :menu-silent
                  submenus      名前のあるサブメニューすべてが含まれたリスト
                                List。メニュー項目がサブメニューを持つ場合
                                のみ存在する。

                メニュー項目が見付からない場合は空の辞書を返す。

                例:
                        :echo menu_info('Edit.Cut')
                        :echo menu_info('File.Save', 'n')

                method としても使用できる:
                        GetMenuName()->menu_info('v')


                                                        min()
min({expr})     {expr}の全要素の値の最小値を返す。例:
                        echo min([apples, pears, oranges])

                {expr}はリスト List か辞書 Dictionary である。辞書の場合、
                辞書に含まれるすべての値の最小値を返す。
                {expr}がリストでも辞書でもなかったり、要素のどれかが数値に変換
                できない場合はエラーとなる。
                空のリストまたは辞書の場合は0を返す。

                method としても使用できる:
                        mylist->min()


                                                        mkdir() E739
mkdir({name} [, {path} [, {prot}]])
                ディレクトリ{name}を作成する。

                {path}が "p" のときは必要に応じて途中のディレクトリも作成され
                る。そうでないときは "" にすること。

                {prot}は作成するディレクトリの保護ビット。デフォルトは0o755
                (rwxr-xr-x: 所有者は読み書き可能、他の人は読み込み可能)。
                他の人が読み込めないようにするには0o700とすること。{prot} は
                {name} の最後の部分にのみ適用される。なので、/tmp/foo/bar
                を作成すると /tmp/foo は 0o755 で作成される。
                例:
                        :call mkdir($HOME . "/tmp/foo/bar", "p", 0o700)

                sandboxの中ではこの関数は使用できない。

                ディレクトリが既に存在して、かつフラグ "p" が渡された場合エラー
                は発生しない (パッチ 8.0.1708 より)。ただし、"p" オプション未
                指定だと、呼び出しは失敗する。

                関数の結果は数値である。呼び出しが成功した場合は真、ディレクト
                リの作成に失敗したか部分的に失敗した場合は偽である。

                システムによっては利用できない場合がある。これを確認するには次
                のようにする:
                        :if exists("*mkdir")

                method としても使用できる:
                        GetName()->mkdir()

                                                        mode()
mode([expr])    現在のモードを示す文字列を返す。
                [expr] に 0 でない数値か空でない文字列 (non-zero-arg) を指定
                した場合、フルモードが返される。それ以外の場合は最初の一文字だ
                けが返される。
                state() も参照。

                   n        ノーマル、端末ノーマル
                   no       オペレータ待機
                   nov      オペレータ待機 (強制文字単位 o_v)
                   noV      オペレータ待機 (強制行単位 o_V)
                   noCTRL-V オペレータ待機 (強制ブロック単位 o_CTRL-V);
                                CTRL-V は1文字である
                   niI      Insert-mode で i_CTRL-O を使用したノーマル
                   niR      Replace-mode で i_CTRL-O を使用したノーマル
                   niV      Virtual-Replace-mode で i_CTRL-O を使用したノー
                            マル
                   v        文字単位ビジュアル
                   V        行単位ビジュアル
                   CTRL-V   矩形ビジュアル
                   s        文字単位選択
                   S        行単位選択
                   CTRL-S   矩形選択
                   vs       選択モードで v_CTRL-O を利用した時の文字単位ビ
                            ジュアル
                   Vs       選択モードで v_CTRL-O を利用した時の行単位ビジュ
                            アル
                   CTRL-Vs  選択モードで v_CTRL-O を利用した時の矩形ビジュア
                            ル
                   i        挿入
                   ic       挿入モード補完 compl-generic
                   ix       挿入モード i_CTRL-X 補完
                   R        置換 R
                   Rc       置換モード補完 compl-generic
                   Rv       仮想置換 gR
                   Rx       置換モード i_CTRL-X 補完
                   c        コマンドライン編集
                   cv       Vim Ex モード gQ
                   ce       ノーマル Ex モード Q
                   r        Hit-enter プロンプト
                   rm       -- more -- プロンプト
                   r?       ある種の :confirm 問い合わせ
                   !        シェルまたは外部コマンド実行中
                   t        端末ジョブモード: キー入力がジョブに行く
                これらはオプション 'statusline' の中や、remote_expr() といっ
                しょに使うと便利である。他のほとんどの場所では "c" または "n"
                しか返さない。
                Note: 将来的により多くのモードやより詳細なモードが追加される可
                能性がある。文字列全体を比較するのではなく、先頭の文字だけを比
                較したほうがよい。
                visualmode() も参照。

                method としても使用できる:
                        DoFull()->mode()

mzeval({expr})                                                  mzeval()
                MzScheme の式 {expr} を評価してその結果を Vim の変数に変換した
                結果を返す。
                数値と文字列はそのまま返る。
                ペア (リストと不適切なリスト (improper list) を含む) とベクタ
                は Vim のリスト (Lists) に変換される。
                ハッシュテーブルは Vim の辞書 (Dictionary) に変換され、その
                キーは文字列に変換される。
                その他のすべての型は display 関数を使って文字列に変換される。
                例:
                    :mz (define l (list 1 2 3))
                    :mz (define h (make-hash)) (hash-set! h "list" l)
                    :echo mzeval("l")
                    :echo mzeval("h")

                Note :def 関数にあるローカル変数は {expr} からは見えない。

                method としても使用できる:
                        GetExpr()->mzeval()

                {+mzscheme 機能を有効にしてコンパイルしたときのみ有効}

nextnonblank({lnum})                                    nextnonblank()
                {lnum}行以降({lnum}行を含む)の最初の非空行の行番号を返す。
                例:
                        if getline(nextnonblank(1)) =~ "Java"
                {lnum}が無効なときや、それ以降に非空行がないときは0を返す。
                {lnum}getline()と同様に扱われる。
                prevnonblank()も参照。

                method としても使用できる:
                        GetLnum()->nextnonblank()

nr2char({expr} [, {utf8}])                              nr2char()
                コード{expr}で表される1文字からなる文字列を返す。例:
                        nr2char(64)             "@"を返す
                        nr2char(32)             " "を返す
                {utf8} を省略、またはゼロを指定すると、現在の 'encoding' が適
                用される。"utf-8" の場合の例:
                        nr2char(300)            短音記号つきのIを返す
                {utf8} に 1 を指定すると、常に utf-8 文字が返る。
                Note Vim内部では、ファイル中のNUL文字を改行文字(0x0A)に変換し
                て保持している。そのため、nr2char(10)とすればNUL文字を指定でき
                る。nr2char(0)は真のNUL文字(文字列の終端)となるので、空文字列
                を返す。
                文字の数値のリストを文字列に変換するには:
                    let list = [65, 66, 67]
                    let str = join(map(list, {_, val -> nr2char(val)}), '')
                結果: "ABC"

                method としても使用できる:
                        GetNumber()->nr2char()

or({expr}{expr})                                      or()
                二つの引数のビット論理和。引数は数値に変換される。リスト、辞
                書、浮動小数点数を指定するとエラーになる。
                例:
                        :let bits = or(bits, 0x80)

                method としても使用できる:
                        :let bits = bits->or(0x80)

pathshorten({expr} [, {len}])                           pathshorten()
                パス{expr}におけるディレクトリ名を短縮して返す。拡張子、ファイ
                ル名はそのまま保たれる。パスのその他の構成要素は要素内での長さ
                が {len}文字 に縮められる。{len} が省略された場合もしくは1以下
                のときは1文字が使われる。1文字目の '~' と '.' はそのまま保たれ
                る。例:
                        :echo pathshorten('~/.vim/autoload/myfile.vim')
                        ~/.v/a/myfile.vim

                        :echo pathshorten('~/.vim/autoload/myfile.vim', 2)
                        ~/.vi/au/myfile.vim
                パスが実際に存在するかどうかは関係ない。

                method としても使用できる:
                        GetDirectories()->pathshorten()

perleval({expr})                                        perleval()
                Perl の式 {expr} をスカラーコンテキストで評価して、結果をVimの
                データ形式にして返す。
                もし値が変換できない場合、Perlにおける文字列として返される。
                Note: もし配列かハッシュが必要ならば、{expr}ではそれらへの参照
                を返す必要がある。
                例:
                        :echo perleval('[1 .. 4]')
                        [1, 2, 3, 4]

                Note :def 関数にあるローカル変数は {expr} からは見えない。

                method としても使用できる:
                        GetExpr()->perleval()

                {+perl 機能付きでコンパイルされたときのみ利用可能}

popup_ 関数群はここに文書化されている: popup-functions

pow({x}{y})                                           pow()
                {x} の {y} 乗を Float で返す。{x} と {y} は Float または
                Number に評価されなければならない。
                例:
                        :echo pow(3, 3)
                        27.0
                        :echo pow(2, 16)
                        65536.0
                        :echo pow(32, 0.20)
                        2.0

                method としても使用できる:
                        Compute()->pow(3)

                {+float 機能つきでコンパイルされたときのみ有効}

prevnonblank({lnum})                                    prevnonblank()
                {lnum}行以前({lnum}行を含む)の最初の非空行の行番号を返す。
                例:
                        let ind = indent(prevnonblank(v:lnum - 1))
                {lnum}が無効なときや、それ以前に非空行がないときは0を返す。
                {lnum}getline()と同様に扱われる。
                nextnonblank()も参照。

                method としても使用できる:
                        GetLnum()->prevnonblank()

printf({fmt}{expr1} ...)                              printf()
                {fmt}にしたがって組み立てた文字列を返す。{fmt}中の "%" 変換指
                示子は、対応する引数の値で置き換えられる。例:
                        printf("%4d: E%d %.30s", lnum, errno, msg)
                結果は次のような形になる:
                        "  99: E42 asdfasdfasdfasdfasdfasdfasdfas"

                method としても使用でき、ベースは第2引数として渡される:
                        Compute()->printf("result: %d")

                よく使われる変換指示子は次の通り:
                  %s    文字列
                  %6S   6表示幅で右揃えした文字列
                  %6s   6バイトで右揃えした文字列
                  %.9s  9バイトに切り詰めた文字列
                  %c    1バイト
                  %d    10進数値
                  %5d   スペースで埋めて5文字にした10進数値
                  %x    16進数値
                  %04x  0で埋めて少なくとも4文字にした16進数値
                  %X    16進数値(大文字)
                  %o    8進数値
                  %08b  最低8文字の0埋めされた2進数
                  %f    浮動小数点数。12.23, inf, -inf, nan
                  %F    浮動小数点数。12.23, INF, -INF, NAN
                  %e    浮動小数点数。1.23e3, inf, -inf, nan
                  %E    浮動小数点数。1.23E3, INF, -INF, NAN
                  %g    浮動小数点数。値によって %f または %e となる
                  %G    浮動小数点数。値によって %F または %E となる
                  %%    文字 % そのもの

                変換指示子は '%' で始まり、変換文字で終わる。それ以外の全ての
                文字はそのままになる。

                "%" は変換指示子の開始を意味する。以下の順序で引数を指定できる:

                        %  [flags]  [field-width]  [.precision]  type

                フラグ
                        0個以上の以下のフラグを指定できる

                    #         値を「代替形式」に変換する。変換指示子c, d, sに
                              対してはこのオプションは効果を持たない。変換指示
                              子oに対しては数値の精度を上げ、出力文字列の最初
                              の文字が0になる。(明示的な精度0で値0が表示される
                              ときを除く)
                              変換指示子bとBに対しては、値が0でない場合、文字
                              列 "0b" (変換子Bの場合は "0B")を前につける。
                              変換指示子xとXに対しては、値が0でない場合、文字
                              列 "0x" (変換子Xの場合は "0X")を前につける。

                    0 (zero)  ゼロパディングする。全ての変換に対し、変換された
                              値の左側を空白でなく0で埋める。数値変換(d, b, B,
                              o, x, X)に対して精度が指定されている場合はフラグ
                              0は無視される。

                    -         負のフィールド幅を示す。変換値がフィールド境界に
                              左揃えされる。変換値の左に空白や0がつくのではな
                              く、変換値の右に空白がつく。
                              -と0を両方指定した場合は-が有効になる。

                    ' ' (space)  空白。符号付き変換(d)で作成される正の数値の前
                              に空白が残る。

                    +         +文字。符号付き変換で作成される数値の前に常に符
                              号を付ける。+と' '(space)を両方指定した場合は+が
                              有効になる。

                フィールド幅
                        10進数文字列(省略可)。最低フィールド幅を指定する。変換
                        値のバイト数がこのフィールド幅より少ない場合、左に空白
                        がついて(左揃えフラグを指定した場合は右に空白がついて)
                        フィールドの幅に合わせられる。

                .精度
                        ピリオド '.' の次に数字文字列がつづく形式の精度(省略
                        可)。数字文字列を省略した場合、精度は0になる。d, o, x,
                        X変換における最低桁数を指定する。また、s変換における最
                        大バイト数を指定する。
                        浮動小数点数の場合は小数点以下の桁数。

                型
                        変換の型を指定する1文字。下記を参照。

                フィールド幅と精度には、数字文字列の代わりにアスタリスク '*'
                を指定できる。その場合、対応する数値の引数がフィールド幅または
                精度となる。負のフィールド幅を指定すると、絶対値がフィールド幅
                となり、左揃えフラグがオンになる。負の精度を指定すると、完全に
                無視される。例:
                        :echo printf("%d: %.*s", nr, width, line)
                この例は、テキスト "line" の長さを "width" バイトに制限する。

                変換指示子の意味は以下の通り:

                                printf-d printf-b printf-B printf-o
                                printf-x printf-X
                dbBoxX  数値の引数を符号付き10進数(d)、符号なし2進数(bまたは
                        B)、符号なし8進数(o)、符号なし16進数(xまたはX)の書式に
                        変換する。xの場合は "abcdef" と小文字を使い、Xの場合は
                        "ABCDEF" と大文字を使う。
                        精度が指定されていれば出力する最小桁数を意味する。変換
                        された値を出力するのにそれ以下しか必要としない場合は、
                        左側にゼロを加えて埋める。
                        フィールド幅が存在しない場合や小さすぎる場合でも、数値
                        の幅を切り詰めることは決してない。変換結果がフィールド
                        幅より多くの桁を必要とする場合は、十分な幅に広げられる。
                        モディファイア 'h' は引数が16ビット引数である事を示す。
                        モディファイア 'l' は引数が32ビット引数である事を示す。
                        モディファイア 'L' は引数が64ビット引数である事を示す。
                        一般的にモディファイアは便利ではない。引数から型が分か
                        る時には無視されてしまう。

                i       d のエイリアス
                D       ld のエイリアス
                U       lu のエイリアス
                O       lo のエイリアス

                                                        printf-c
                c       引数の数値を1バイトに変換し、結果の文字列を書き出す。

                                                        printf-s
                s       引数の文字列を出力する。精度を指定した場合、その数値以
                        下のバイト数のみを書き出す。
                        引数が文字列型ではない場合、":echo" と同じ形式のテキス
                        トに自動的に変換される。
                                                        printf-S
                S       引数の文字列を出力する。精度を指定した場合、その数値以
                        下の表示幅のみを書き出す。

                                                        printf-f E807
                f F     Float の引数を 123.456 の形式の文字列に変換する。精度
                        は小数点以下の桁数を指定する。精度が 0 のときは小数点
                        以下は省略される。精度を指定しないときは 6 桁となる。
                        とてつもなく大きい数(範囲外またはゼロによる除算)のとき
                        は %f の場合 "inf" または "-inf" となる (%F の場合は
                        "INF" または "-INF")。"0.0 / 0.0" は %f の場合 "nan"
                        になる (%F の場合は "NAN")。
                        例:
                                echo printf("%.2f", 12.115)
                                12.12
                        丸めはシステムのライブラリに依存する。心配なときは
                        round() を使うこと。

                                                        printf-e printf-E
                e E     Float の引数を 1.234e+03 という形式('E' のときは
                        1.234E+03)の文字列に変換する。精度は 'f' の場合と同じ
                        く小数点以下の桁数を指定する。

                                                        printf-g printf-G
                g G     0.001(を含む)から10000000.0(を除く)の間の場合は 'f' の
                        形式で変換し、この間にない場合は 'g' は 'e'、'G' は 'E'
                        の形式によって変換する。精度が指定されないときは余分な
                        ゼロ(小数点の直後のゼロ以外)と '+' 記号は省かれる。よっ
                        て 10000000.0 は 1.0e7 になる。

                                                        printf-%
                %       単一の '%' を書き出す。引数は変換しない。完全な変換指
                        定は "%%" となる。

                数値の引数を受け取る変換指示子には文字列を与えることもできる。
                変換は自動的に行われる。
                浮動小数点数または文字列の引数を受け取る変換指示子には、数値を
                与えることもできる。変換は自動的に行われる。
                それ以外の型の引数を与えるとエラーメッセージが表示される。

                                                        E766 E767
                {expr1}以降の引数の数と "%" 変換指示子の個数がちょうど一致しな
                ければならない。そうでない場合はエラーとなる。引数は最大18個ま
                で使える。


prompt_getprompt({buf})                                 prompt_getprompt()
                バッファ {buf} で使われているプロンプトテキストを返す。{buf}
                はバッファ名もしくは番号が使える。prompt-buffer を参照。

                バッファが存在しないもしくはプロンプトがバッファにないなら、空
                文字列を返す。

                method としても使用できる:
                        GetBuffer()->prompt_getprompt()

                {+channel 機能つきでコンパイルされたときのみ存在する}


prompt_setcallback({buf}{expr})                       prompt_setcallback()
                バッファ {buf} のプロンプトコールバックを {expr} に設定する。
                {expr} が空文字列の場合、コールバックは取り除かれる。これは
                {buf} の 'buftype' が "prompt" に設定されている場合のみ有効で
                ある。

                このコールバックは Enter を押したときに呼び出される。カレント
                バッファは必ずプロンプトバッファである。コールバックの呼び出し
                の前に次のプロンプト用の新しい行が追加されるので、コールバック
                が呼び出されたプロンプトは最後から 2 番目の行になる。
                コールバックがバッファにテキストを追加する場合、最後の行は現在
                のプロンプトであるため、その上に追加しなければならない。これは
                非同期に行われる可能性がある。
                コールバックは、プロンプトに入力されたテキストを唯一の引数とし
                て呼び出される。ユーザーが Enter のみをタイプした場合は空文字
                となる。
                例:
                   call prompt_setcallback(bufnr(), function('s:TextEntered'))
                   func s:TextEntered(text)
                     if a:text == 'exit' || a:text == 'quit'
                       stopinsert
                       close
                     else
                       call append(line('$') - 1, 'Entered: "' . a:text . '"')
                       " Reset 'modified' to allow the buffer to be closed.
                       set nomodified
                     endif
                   endfunc

                method としても使用できる:
                        GetBuffer()->prompt_setcallback(callback)

                {+channel 機能つきでコンパイルされたときのみ存在する}

prompt_setinterrupt({buf}{expr})                      prompt_setinterrupt()
                バッファ {buf} のコールバックを {expr} に設定する。{expr} が空
                文字列の場合、コールバックは取り除かれる。これは {buf} の
                'buftype' が "prompt" に設定されている場合のみ有効である。

                このコールバックは、挿入モードにおいて CTRL-C を押したときに呼
                び出される。コールバックを設定していない場合、Vim は他のバッ
                ファと同様に挿入モードを終了する。

                method としても使用できる:
                        GetBuffer()->prompt_setinterrupt(callback)

                {+channel 機能つきでコンパイルされたときのみ存在する}

prompt_setprompt({buf}{text})                         prompt_setprompt()
                バッファ {buf} のプロンプトを {text} に設定する。大抵の場合、
                {text} が空白で終わるようにしたいと考えるだろう。
                {buf} の 'buftype' が "prompt" に設定されている場合のみ結果が
                見える。例:
                        call prompt_setprompt(bufnr(), 'command: ')

                method としても使用できる:
                        GetBuffer()->prompt_setprompt('command: ')

                {+channel 機能つきでコンパイルされたときのみ存在する}

prop_ 関数群はここに文書化されている: text-prop-functions

pum_getpos()                                            pum_getpos()
                ポップアップメニュー(ins-completion-menu を参照)が表示されな
                い場合、空の Dictionary を返す。それ以外の場合、以下のキーを
                使用した Dictionary を返す。
                        height          見えている項目数
                        width           画面セル数
                        row             最上位の画面行(最初の行は 0)
                        col             左端の画面桁(最初の桁は 0)
                        size            総項目数
                        scrollbar       スクロールバーが表示されていれば TRUE

                値は CompleteChanged 中の v:event と同じである。

pumvisible()                                            pumvisible()
                ポップアップメニューが表示されているときには非0を返す。表示さ
                れていないときは0を返す。ins-completion-menuを参照。
                ポップアップメニューを消してしまうような操作を避けるために使わ
                れる。

py3eval({expr})                                         py3eval()
                Python の式 {expr} を評価して、結果を Vim のデータ形式にして返
                す。
                数値と文字列はそのまま返る (ただし文字列はコピーされ、Unicode
                から 'encoding' に変換される)。
                リストは Vim の List 型に変換される。
                辞書は Vim の Dictionary 型に変換される。辞書のキーは文字列
                に変換される。
                Note :def 関数にあるローカル変数は {expr} からは見えない。

                method としても使用できる:
                        GetExpr()->py3eval()

                {+python3 機能付きでコンパイルされたときのみ利用可能}

                                                        E858 E859
pyeval({expr})                                          pyeval()
                Python の式 {expr} を評価して、結果を Vim のデータ形式にして返
                す。
                数値と文字列はそのまま返る (ただし文字列はコピーされる)。
                リストは Vim の List 型に変換される。
                辞書は Vim の Dictionary 型に変換される。文字列ではない辞書
                のキーはエラーになる。
                Note :def 関数にあるローカル変数は {expr} からは見えない。

                method としても使用できる:
                        GetExpr()->pyeval()

                {+python 機能付きでコンパイルされたときのみ利用可能}

pyxeval({expr})                                         pyxeval()
                Python の式 {expr} を評価して、結果を Vim のデータ形式にして返
                す。
                Python 2 または 3 を使用する。python_x と 'pyxversion' を参
                照。
                pyeval()py3eval() も参照。

                method としても使用できる:
                        GetExpr()->pyxeval()

                {+python または +python3 機能付きでコンパイルされたときの
                み利用可能}

                                                        E726 E727
range({expr} [, {max} [, {stride}]])                            range()
                以下のような数値のリストListを返す。
                - {expr}のみを指定したときは:  [0, 1, ..., {expr} - 1]
                - {max}を指定したときは: [{expr}{expr} + 1, ..., {max}]
                - {stride}を指定したときは: [{expr}{expr} + {stride}, ...,
                  {max}] ({max}を超えないように{expr}{stride}ずつ増加させる)
                最大値が開始位置より1だけ前のときは空リストを返す。最大値が開
                始位置より1以上前のときはエラーになる。
                例:
                        range(4)                " [0, 1, 2, 3]
                        range(2, 4)             " [2, 3, 4]
                        range(2, 9, 3)          " [2, 5, 8]
                        range(2, -2, -1)        " [2, 1, 0, -1, -2]
                        range(0)                " []
                        range(2, 0)             " エラー!

                method としても使用できる:
                        GetExpr()->range()


rand([{expr}])                                          rand() random
                種 {expr} を使い、xoshiro128** アルゴリズムで生成された疑似乱
                数を返す。返される数値は一貫性のため、64 ビットシステム上であ
                っても 32 ビットである。
                {expr} は srand() で初期化することができ、rand() で更新され
                る。{expr} が省略されたときは内部的な種の値が用いられ、更新さ
                れる。

                例:
                        :echo rand()
                        :let seed = srand()
                        :echo rand(seed)
                        :echo rand(seed) % 16  " random number 0 - 15


readblob({fname})                                       readblob()
                ファイル {fname} をバイナリモードで読み Blob を返す。
                ファイルが開けない場合はエラーメッセージともに結果が空の
                Blob となる。
                readfile() と writefile() も参照。


readdir({directory} [, {expr} [, {dict}]])                      readdir()
                {directory}内のファイル名とディレクトリ名のリストを返す。
                一致数を制限するなど、複雑なことをする必要がない場合は、
                glob() を使用することもできる。
                リストはソートされるが (大文字/小文字区別有り)、ソート順序を変
                更するには以下の {dict} 引数を参照すること。

                {expr}が省略されるとすべてのエントリが含まれる。
                {expr}が与えられると、それは何をすべきかをチェックするために評
                価される:
                        {expr}の結果が -1 の場合、それ以上のエントリは処理され
                        ない。
                        {expr}の結果が 0 の場合、このエントリはリストに追加さ
                        れない。
                        {expr}の結果が 1 の場合、このエントリはリストに追加さ
                        れる。
                "." と ".." のエントリは常に除かれる。
                {expr}が評価されるたびに "v:val" がエントリ名に設定される。
                {expr}が関数の場合、名前は引数として渡される。例えば、".txt"
                で終わるファイルのリストを取得するには、次のようにする:
                  readdir(dirname, {n -> n =~ '.txt$'})
                隠しファイルとバックアップファイルをスキップするには:
                  readdir(dirname, {n -> n !~ '^\.\|\~$'})

                オプションの {dict} 引数で値をよりカスタムできる。
                現時点では、実行時にソートするか、するならどのような仕方かを指
                定できる。辞書は以下のメンバーを保持できる:

                    sort    システムから返された結果をどのようにソートするか。
                            有効な値:
                                "none"      ソートしない (最速の方法)
                                "case"      大文字小文字を区別してソート (各文
                                            字のバイト値、技術的には、strcmp()
                                            を使用) (デフォルト)
                                "icase"     大文字小文字を区別せずソート (技術
                                            的には strcasecmp() を使用)
                                "collate"   "POSIX" もしくは "C" ロケール
                                            locale の照合順序を使用してソー
                                            ト
                                            (技術的には strcoll() を使用)
                            他の値は警告なく無視する。

                例として、現在のディレクトリからすべてのファイルのリストを各エ
                ントリをソートせずに取得する:
                  readdir('.', '1', #{sort: 'none'})
                ディレクトリツリーを取得したい場合は:
                  function! s:tree(dir)
                      return {a:dir : map(readdir(a:dir),
                      \ {_, x -> isdirectory(x) ?
                      \          {x : s:tree(a:dir . '/' . x)} : x})}
                  endfunction
                  echo s:tree(".")

                method としても使用できる:
                        GetDirName()->readdir()

readdirex({directory} [, {expr} [, {dict}]])                    readdirex()
                readdir() の拡張バージョン。
                {directory} にあるファイルとディレクトリの情報を持つ辞書のリス
                トを返す。
                これはディレクトリ内のファイルとディレクトリの属性をリストアッ
                プ時に同時に取得したい時に便利である。
                これは readdir() を呼んだあと、各ファイルとディレクトリに対
                して getfperm()getfsize()getftime()getftype()
                を呼ぶより特に MS-Windows で速い。
                このリストはデフォルトでは名前でソートされ (大文字/小文字区別
                有り)、ソートはオプションの {dict} 引数により変化する、
                readdir() を参照。

                ファイルとディレクトリの情報の辞書は以下の項目を持つ:
                        group   エントリのグループ名。 (Unix のみ)
                        name    エントリの名前。
                        perm    エントリの許可属性。getfperm() を参照。
                        size    エントリのサイズ。getfsize() を参照。
                        time    エントリの最終更新時間。getftime() を参照。
                        type    エントリの種別。
                                Unix では、以下を除いてほぼ getftype() と
                                同じ:
                                    ディレクトリへのシンボリックリンク
                                                        "linkd"
                                    それ以外のシンボリックリンク
                                                        "link"
                                MS-Windows では:
                                    通常のファイル      "file"
                                    ディレクトリ        "dir"
                                    ジャンクション      "junction"
                                    ディレクトリへのシンボリックリンク
                                                        "linkd"
                                    それ以外のシンボリックリンク
                                                        "link"
                                    それ以外のリパースポイント
                                                        "reparse"
                        user    エントリの所有者のユーザー名。 (Unix のみ)
                Unix では、もしエントリがシンボリックリンクなら、リンク先対象
                の情報を辞書に含む(ただし、"type" 項目は除く)。
                MS-Windows では、パフォーマンス上の理由によりシンボリックリン
                ク自身の情報を含む。

                {expr}が省略されるとすべてのエントリが含まれる。
                {expr}が与えられると、それは何をすべきかをチェックするために評
                価される:
                        {expr}の結果が -1 の場合、それ以上のエントリは処理され
                        ない。
                        {expr}の結果が 0 の場合、このエントリはリストに追加さ
                        れない。
                        {expr}の結果が 1 の場合、このエントリはリストに追加さ
                        れる。
                "." と ".." のエントリは常に除かれる。
                {expr} を評価するごとに、v:val にそのエントリの辞書
                Dictionary を設定する。
                {expr} が関数の場合はエントリが引数として与えられる。例え
                ば、".txt" で終わるファイルのリストを取得するには、次のように
                する:
                  readdirex(dirname, {e -> e.name =~ '.txt$'})

                例として、現在のディレクトリからすべてのファイルのリストを各エ
                ントリをソートせずに取得する:
                  readdirex(dirname, '1', #{sort: 'none'})


                method としても使用できる:
                        GetDirName()->readdirex()


                                                        readfile()
readfile({fname} [, {type} [, {max}]])
                ファイル{fname}を読み込み、各行を要素とするリストListを返す。
                行はNL文字で終わるものとする。改行文字がCRであるMacintoshのファ
                イルは単一の長い行となる(どこかにNLが現れない限り)。
                すべての NUL 文字は NL 文字に置換される。
                {type}が "b" を含む場合、次のようにバイナリモードになる:
                - 最後の行がNLで終わるときは、リストの末尾に余分な空文字列が追
                  加される。
                - CR文字を除去しない。
                その他の場合:
                - NLの前に現れるCR文字を除去する。
                - 最後の行がNLで終わるかどうかは関係ない。
                - 'encoding' がUnicodeのときは UTF-8 のバイトオーダーマークは
                  取り除かれる。
                {max}を指定すると、読み込む行数の最大値となる。ファイルの最初
                の10行をチェックするときに役に立つ:
                        :for line in readfile(fname, '', 10)
                        :  if line =~ 'Date' | echo line | endif
                        :endfor
                {max}が負の場合は、ファイルの最後から-{max}行を読み込んで返す。
                ファイルが{max}行以下の場合は全行を返す。
                {max}が0の場合は空リストを返す。
                Note {max}を指定しない場合はファイル全体をメモリに読み込む。エ
                ンコーディング判定も行わないことに注意。必要ならバッファに読み
                込むこと。
                非推奨 (代替として readblob() を使う): {type}が "B" を含む場
                合、ファイルのバイナリデータは変更せずに Blob が返される。
                ファイルを開けないときはエラーメッセージを表示し、空リストを返
                す。
                writefile()も参照。

                method としても使用できる:
                        GetFileName()->readfile()

reduce({object}{func} [, {initial}])                  reduce() E998
                List もしくは Blob である {object} の各要素ごとに {func}
                を呼ぶ。{func} は2つの引数で呼ばれる: これまでの結果と現在の要
                素。全要素処理後は結果を返す。

                {initial} は初期結果値。もし無いなら、最初の {object} の要素を
                使い {func} の最初の呼び出しは2つ目の要素から行う。{initial}
                が与えられず {object} が空の場合、結果が計算できずエラー E998
                となる。

                例:
                        echo reduce([1, 3, 5], { acc, val -> acc + val })
                        echo reduce(['x', 'y'], { acc, val -> acc .. val }, 'a')
                        echo reduce(0z1122, { acc, val -> 2 * acc + val })

                method としても使用できる:
                        echo mylist->reduce({ acc, val -> acc + val }, 0)


reg_executing()                                         reg_executing()
                実行されているレジスタの名前を 1 文字で返す。レジスタが実行さ
                れていない場合は空文字列を返す。@ を参照。

reg_recording()                                         reg_recording()
                記録されているレジスタの名前を 1 文字で返す。記録が行われてい
                ない場合は空文字列を返す。q を参照。

reltime([{start} [, {end}]])                            reltime()
                時刻値を表す値を返す。この値はリストで項目の形式はシステムに依
                存する。Vim 9 script では list<any> が使われる。
                この値を reltimestr() に渡すと文字列に変換でき、
                reltimefloat() に渡すと浮動小数点数に変換できる。

                引数を指定しないと reltime() は現在時刻を返す。
                1個の引数を指定すると、その引数で指定された時刻からの経過時間
                を返す。
                2個の引数を指定すると、{start}{end}の間の経過時間を返す。

                {start}{end}はreltime()で返される値でなければならない。旧来
                の Vim script ではエラーがあると0を返すが、Vim9 script ではエ
                ラーとなる。

                method としても使用できる:
                        GetStart()->reltime()

                {+reltime 機能付きでコンパイルされたときのみ利用可能}

reltimefloat({time})                            reltimefloat()
                {time} の値を代わりに浮動小数点で返す。
                例:
                        let start = reltime()
                        call MyFunction()
                        let seconds = reltimefloat(reltime(start))
                オーバーヘッドについては reltimestr() の note を参照。
                profilingも参照。
                旧来の Vim script ではエラーがあると0.0を返すが、Vim9 script
                ではエラーとなる。

                method としても使用できる:
                        reltime(start)->reltimefloat()

                {+reltime 機能付きでコンパイルされたときのみ利用可能}

reltimestr({time})                              reltimestr()
                時刻値{time}を表現する文字列を返す。秒、ドット、マイクロ秒とい
                う形式になる。例:
                        let start = reltime()
                        call MyFunction()
                        echo reltimestr(reltime(start))
                Note このコマンドにかかるオーバーヘッドがこの時間に加算される。
                精度はシステムに依存する。
                文字列をきれいに揃えるために、先頭にスペースが挿入される。この
                スペースを取り除くにはsplit()を使えばよい。
                        echo split(reltimestr(reltime(start)))[0]
                profilingも参照。
                旧来の Vim script ではエラーがあると空文字列を返すが、Vim9
                script ではエラーとなる。

                method としても使用できる:
                        reltime(start)->reltimestr()

                {+reltime 機能付きでコンパイルされたときのみ利用可能}

                                                        remote_expr() E449
remote_expr({server}{string} [, {idvar} [, {timeout}]])
                {string}{server}に送信する。{string}は式と見なされ、評価した
                結果が返ってくる。
                戻り値は文字列かリストListでなければならない。リストの場合は
                要素を連結して文字列に変換される。要素間の区切りは改行文字とな
                る(join(expr, "\n")と同様)。
                空でない {idvar} が渡された場合は変数名と見なされ、後で
                remote_read()で使われる {serverid} がその変数に保存される。
                {timeout} が与えられた場合、読み込みはその数秒後にタイムアウト
                する。それ以外ではタイムアウトとして 600 秒が使用される。
                clientserverRemoteReplyも参照。
                sandboxの中ではこの関数は利用できない。
                {+clientserver機能付きでコンパイルされたときのみ利用可能}
                Note: なんらかのエラーが発生した場合は、ローカルでエラーメッ
                セージが表示され、戻り値は空文字列となる。

                変数は、現在アクティブな関数とは無関係にグローバル名前空間で評
                価される。デバッグモードを除いて、関数のローカル変数および引数
                は評価されることができる。

                例:
                        :echo remote_expr("gvim", "2+2")
                        :echo remote_expr("gvim1", "b:current_syntax")

                method としても使用できる:
                        ServerName()->remote_expr(expr)

remote_foreground({server})                             remote_foreground()
                サーバー名{server}のVimをフォアグラウンドに移動させる。
                次を実行するのと同様である:
                        remote_expr({server}, "foreground()")
                ただし、次の点が異なる: Win32では、OSが必ずしもサーバーが自分
                自身をフォアグラウンドにすることを許可しないので、対応策として
                クライアントが仕事を行う。
                Note: foreground()と違い、最小化されていたウィンドウを復元しな
                い。
                sandboxの中ではこの関数は利用できない。

                method としても使用できる:
                        ServerName()->remote_foreground()

                {VimのWin32, Athena, Motif, GTKのGUI版とWin32コンソール版での
                み利用可能}


remote_peek({serverid} [, {retvar}])            remote_peek()
                {serverid}から文字列を取得可能ならば正の数値を返す。変数
                {retvar}に返信文字列をコピーする。{retvar}は変数の名前を示す文
                字列でなければならない。
                取得できないならば0を返す。
                なんらかの異状のときは-1を返す。
                clientserverも参照。
                sandboxの中ではこの関数は利用できない。
                {+clientserver機能付きでコンパイルされたときのみ利用可能}
                例:
                        :let repl = ""
                        :echo "PEEK: ".remote_peek(id, "repl").": ".repl

                method としても使用できる:
                        ServerId()->remote_peek()

remote_read({serverid}, [{timeout}])                    remote_read()
                {serverid}からの返信の中で最も古いものを取り出して返す。取り出
                した返信はキューから取り除かれる。キューに返信が入っていないと
                きは、{timeout} (秒単位) が与えられていない限り返信を取り出せ
                るようになるまで待機する。
                clientserverも参照。
                sandboxの中ではこの関数は利用できない。
                {+clientserver機能付きでコンパイルされたときのみ利用可能}
                例:
                        :echo remote_read(id)

                method としても使用できる:
                        ServerId()->remote_read()

                                                        remote_send() E241
remote_send({server}{string} [, {idvar}])
                {string}{server}に送信する。{string}はキー入力として解釈さ
                れ、この関数の呼び出しは即座に戻ってくる。Vimサーバーにおいて、
                受け取ったキー入力はマッピング展開されない。:map
                {idvar}には変数名を指定する。後でremote_read()で使われる
                {serverid}がその変数に保存される。
                clientserverRemoteReplyも参照。
                sandboxの中ではこの関数は利用できない。
                {+clientserver機能付きでコンパイルされたときのみ利用可能}

                Note: なんらかのエラーが発生すると、サーバー側で報告され、表示
                が乱れてしまうかもしれない。
                例:
                :echo remote_send("gvim", ":DropAndReply ".file, "serverid").
                 \ remote_read(serverid)

                :autocmd NONE RemoteReply *
                 \ echo remote_read(expand("<amatch>"))
                :echo remote_send("gvim", ":sleep 10 | echo ".
                 \ 'server2client(expand("<client>"), "HELLO")<CR>')

                method としても使用できる:
                        ServerName()->remote_send(keys)

                                        remote_startserver() E941 E942
remote_startserver({name})
                サーバー {name} になる。すでにサーバーとして起動してお
                り、v:servername が空でない場合は失敗する。

                method としても使用できる:
                        ServerName()->remote_startserver()

                {+clientserver 機能付きでコンパイルされたときのみ利用可能}

remove({list}{idx} [, {end}])                         remove()
                {end}を指定しなかった場合: リスト List {list}から{idx}位置の
                要素を削除し、その要素を返す。
                {end}を指定した場合: {idx}から{end}まで(両端を含む)の要素を削
                除し、それらの要素からなるリスト List を返す。{idx}{end}
                同じ要素を指す場合、1個の要素からなるリストが返る。{end}{idx}
                より前になる場合、エラーとなる。
                {idx}{end}として指定できる値についてはlist-indexを参照。
                例:
                        :echo "last item: " . remove(mylist, -1)
                        :call remove(mylist, 0, 9)

                ファイルを削除するには delete() を使う。

                method としても使用できる:
                        mylist->remove(idx)

remove({blob}{idx} [, {end}])
                {end}を指定しなかった場合: Blob {blob}から{idx}位置のバイト
                を削除し、そのバイトを返す。
                {end}を指定した場合: {idx}から{end}まで(両端を含む)のバイトを
                削除し、それらのバイトを Blob で返す。{idx}{end}が同じバイ
                トを指す場合、1個のバイトからなる Blob が返る。
                {end}{idx}より前になる場合、エラーとなる。
                例:
                        :echo "last byte: " . remove(myblob, -1)
                        :call remove(mylist, 0, 9)

remove({dict}{key})
                {dict}からキー{key}を持つ要素を削除し、それを返す。例:
                        :echo "removed " . remove(dict, "one")
                {dict}{key}がない場合はエラーになる。

rename({from}{to})                                    rename()
                ファイルの名前を{from}から{to}へ変える。ファイルシステムを越え
                てファイルを移動するのにも使用できる。結果は数値で、成功すれば
                0、失敗すれば非ゼロになる。
                NOTE: ファイル {to} がすでに存在する場合、警告なしに上書きされ
                る。
                sandboxの中ではこの関数は利用できない。

                method としても使用できる:
                        GetOldName()->rename(newname)

repeat({expr}{count})                                 repeat()
                {expr}{count}回繰り返し、連結して返す。例:
                        :let separator = repeat('-', 80)
                {count}が0または負のときは空文字列を返す。{expr}がリスト
                Listのときは{count}回連結した結果を返す。例:
                        :let longlist = repeat(['a', 'b'], 3)
                結果は['a', 'b', 'a', 'b', 'a', 'b']となる。

                method としても使用できる:
                        mylist->repeat(count)


resolve({filename})                                     resolve() E655
                MS-Windowsでは{filename}がショートカット(.lnkファイル)ならばそ
                の指す先を単純化した形式で返す。
                {filename}がシンボリックリンクまたはジャンクションポイントの場
                合は、ターゲットへのフルパスを返す。ジャンクションのターゲット
                が削除されたら、{filename}を返す。
                Unixではパス{filename}の中の全てのシンボリックリンクを解決し、
                単純化して返す。循環リンクがある場合に備えて、シンボリックリン
                クの解決は100回までに制限されている。
                その他のシステムでは{filename}を単純化して返す。
                単純化の手順はsimplify()と同じである。
                resolve()は(結果も相対パスであるならば)カレントディレクトリを
                表す先頭のパスコンポーネントと、末尾のパス区切り文字をそのまま
                にする。

                method としても使用できる:
                        GetName()->resolve()

reverse({object})                                       reverse()
                {object}の要素の順序をその場で(in-place)反転させる。
                {object}は List または Blob である。
                {object}そのものを返す。
                オブジェクトを変更させないでおくには、最初にコピーを作る:
                        :let revlist = reverse(copy(mylist))
                method としても使用できる:
                        mylist->reverse()

round({expr})                                                   round()
                {expr} を最も近い整数に丸め、Float を返す。{expr} が二つの整
                数の真ん中にある場合、大きい方(0 から遠い方)になる。
                {訳注: つまり四捨五入になる}
                {expr} は Float または Number に評価されなければならない。
                例:
                        echo round(0.456)
                        0.0 
                        echo round(4.5)
                        5.0
                        echo round(-4.5)
                        -5.0

                method としても使用できる:
                        Compute()->round()

                {+float 機能つきでコンパイルされたときのみ有効}

rubyeval({expr})                                        rubyeval()
                Rubyの式 {expr} を評価し、その結果を Vim のデータ構造に変換し
                たものを返す。
                数値、浮動小数点数、文字列はそのまま返される (文字列はコピーさ
                れる)。
                配列は Vim の List 型に変換される。
                ハッシュは Vim の Dictionary 型に変換される。
                それ以外のオブジェクトは "Object#to_s" メソッドの結果の文字列
                として表現される。
                Note :def 関数にあるローカル変数は {expr} からは見えない。

                method としても使用できる:
                        GetRubyExpr()->rubyeval()

                {+ruby 機能つきでコンパイルされたときのみ有効}

screenattr({row}{col})                                        screenattr()
                screenchar() と同様だが、属性を返す。これは他の位置の属性と
                比較するのに利用できるだけの適当な数値である。

                method としても使用できる:
                        GetRow()->screenattr(col)

screenchar({row}{col})                                        screenchar()
                スクリーン上の位置 [row, col] の文字を数値で返す。これは全ての
                スクリーン位置、ステータスライン、ウィンドウセパレータ、コマン
                ドラインで機能する。左上の位置は行番号が1、列番号が1である。文
                字は合成文字を除く。2バイトのエンコーディングでは最初のバイト
                だけであるかもしれない。
                この関数は主にテスト用に使われる。
                row か col が範囲外である場合は -1 を返す。

                method としても使用できる:
                        GetRow()->screenchar(col)

screenchars({row}{col})                                       screenchars()
                結果は数値のリスト List。最初の数値は screenchar() が返す
                数値と同一。それ以降の数値は基底文字に続く合成文字の数値。
                この関数は主にテスト用。
                row や col が範囲外である場合は空のリストを返す。

                method としても使用できる:
                        GetRow()->screenchars(col)

screencol()                                                     screencol()
                現在のカーソルのスクリーン列を数値で返す。一番左の列番号は 1。
                この関数は主にテスト用。

                Note: 常に現在のスクリーン列を返す。したがって、コマンドで使わ
                れた場合 (例えば ":echo screencol()") は、コマンドライン内の列
                を返す (つまりコマンドが実行されたときその値は 1)。ファイル内
                でのカーソル位置を取得するには次のようなマップを使用する:
                        nnoremap <expr> GG ":echom ".screencol()."\n"
                        nnoremap <silent> GG :echom screencol()<CR>
                        nnoremap GG <Cmd>echom screencol()<CR>

screenpos({winid}{lnum}{col})                               screenpos()
                結果はウィンドウ {winid} のテキスト行のバッファ位置 {lnum} 及
                び列 {col} の画面位置を含む辞書。{col} は1ベースのバイトイン
                デックス。
                その辞書はこれらのメンバーを持つ:
                        row 番号行
                        col 最初の画面列
                        endcol 最後の画面列
                        curscol カーソル画面列
                指定された位置が表示されない場合、全ての値は0。
                文字が複数の画面セルを占める場合、"endcol" は "col"とは異な
                る。例えば、タブの "col" は1で "endcol" は8。
                "curscol" は、カーソルが置かれる場所。タブの場合は "endcol" と
                同じになるが、倍幅文字の場合は "col" と同じになる。
                conceal 機能はここでは無視され、列の数字は 'conceallevel' が
                0のときと同じになる。カーソルを正しい位置に設定して
                screencol() を使うことで conceal を考慮した値を取得できる。

                method としても使用できる:
                        GetWinid()->screenpos(lnum, col)

screenrow()                                                     screenrow()
                現在のカーソルのスクリーン行を数値で返す。一番上の行番号は 1。
                この関数は主にテスト用。
                代用として winline() を使う事ができる。

                Notescreencol() と同様の制約あり。

screenstring({row}{col})                                      screenstring()
                結果は文字列で、スクリーンの位置 [row, col] の基底文字と合成文
                字全てを含む。
                screenchars() と似ているが文字を文字列として返す。
                この関数は主にテスト用。
                row や col が範囲外である場合は空文字列を返す。

                method としても使用できる:
                        GetRow()->screenstring(col)

                                                                search()
search({pattern} [, {flags} [, {stopline} [, {timeout} [, {skip}]]]])
                正規表現パターン{pattern}を検索する。検索はカーソル位置から開
                始する(検索位置を指定するにはcursor()を使えばよい)。

                マッチが見つかった場合はその行番号を返す。
                マッチがない場合は0を返し、カーソルは移動しない。エラーメッ
                セージは表示されない。

                {flags} は以下のフラグ文字からなる文字列
                'b'     後方(上方)に検索する
                'c'     カーソル位置のマッチを受け入れる
                'e'     マッチの末尾へ移動する
                'n'     カーソルを移動させない
                'p'     部分パターン(後述)のマッチの番号を返す
                's'     以前のカーソル位置をマーク ' に記録する
                'w'     ファイルの末尾で循環する
                'W'     ファイルの末尾で循環しない
                'z'     0桁目からではなく、カーソル位置の桁から検索を開始する
                'w' と 'W' の両方とも指定されない場合は 'wrapscan' が適用され
                る。

                フラグ 's' が指定された場合、カーソルが移動したときのみマーク'
                が設定される。フラグ 's' は 'n' と組み合わせることはできない。

                'ignorecase''smartcase''magic' が適用される。

                フラグ 'z' が指定されない場合、常に0列目から開始して前方検索
                し、そしてカーソルの前にあるマッチはスキップされる。'cpo' 内
                に 'c' フラグが存在する場合、次の検索はそのマッチの後から始ま
                る。'cpo' 内に 'c' フラグが存在しない場合、次の検索は現在のカー
                ソル位置から1桁進んで始まる。この検索はオーバーラップしてマッ
                チする。
                後方検索でフラグ 'z' が指定されている場合、検索は0列目から始ま
                るので、現在行で見付かってもマッチしない(ただしファイルの末
                尾でラップしない場合)。

                引数{stopline}が指定されたときはこの行を検索した後で検索を停止
                する。これは検索する行を制限するために有用である。例:
                        let match = search('(', 'b', line("w0"))
                        let end = search('END', '', line("w$"))
                {stopline}に0でない値が指定されたときは、暗黙にファイルの末尾
                で循環しなくなる。
                0 の値は、引数を省略したときと同じになる。

                {timeout} が指定された場合、そのミリ秒が経過したところで検索が
                停止する。つまり、{timeout} が 500 なら検索は 500 ミリ秒で停止
                する。
                この値は負であってはならない。0 の値は、引数を省略したときと同
                じになる。
                {+reltime 機能つきでコンパイルされたときのみ有効}

                {skip} 式が与えられたなら、カーソルがマッチの最初に位置した状
                態で評価される。評価結果が非0ならマッチがスキップされる。これ
                は例えば、コメントや文字列でマッチをスキップするのに使う。
                {skip} は、式として評価される文字列か、関数参照もしくはラムダ
                の式が使える。
                {skip} が無いもしくは空のとき、すべてのマッチを受け入れる。
                {skip} の評価においてエラーとなった時は検索を中断し -1 を返す。
                                                        search()-sub-match
                フラグ 'p' を指定すると、戻り値は \(\) によるグループ化のうち
                最初にマッチしたものの番号プラス 1 となる。パターン全体はマッ
                チしたがどのグループもマッチしなかったときは 1 を返す。
                桁番号を取得するにはsearchpos()を使う。

                フラグ 'n' が指定されていない場合、マッチ位置にカーソルが移動
                する。

                例 (引数リストの全ファイルにわたって検索して置換する):
                    :let n = 1
                    :while n <= argc()   " arglist中の全ファイルに対してループ
                    :  exe "argument " . n
                    :  " ファイルの最後の文字から開始し、循環してファイルの
                    :  " 最初から検索する
                    :  normal G$
                    :  let flags = "w"
                    :  while search("foo", flags) > 0
                    :    s/foo/bar/g
                    :    let flags = "W"
                    :  endwhile
                    :  update       " 修正されていればファイルを保存する
                    :  let n = n + 1
                    :endwhile

                フラグの使い方の例:
                    :echo search('\<if\|\(else\)\|\(endif\)', 'ncpe')
                このコマンドは、カーソル下の文字以降からキーワード "if",
                "else", "endif" のいずれかを検索する。フラグ 'p' により、どの
                キーワードが見つかったかに応じて1,2,3を返す。見つからなかった
                ときは0を返す。次の行の最初の単語にカーソルをおいて上のコマン
                ドを実行すると:
                    if (foo == 0) | let foo = foo + 1 | endif
                1が返る。フラグ 'c' を外すと "endif" にマッチし3を返すようにな
                る。カーソルを "if" の "f" の上におき、フラグ 'e' を外して実行
                しても同じく3が返る。フラグ 'n' によりカーソルは移動しない。

                method としても使用できる:
                        GetPattern()->search()

searchcount([{options}])                                        searchcount()
                最後の検索数の取得もしくは更新をする。'shortmess' で "S" 無し
                で表示されるのと同等の結果が得られる。'shortmess' で "S" あり
                の場合でも動作する。

                辞書 Dictionary を返す。この辞書は前の{訳註:検索}パターンが
                設定されてなく、{訳註:オプショナル引数の辞書の} "pattern" が指
                定されてないと空になる。

                  キー          型              意味
                  current       Number        マッチの現在の位置; カーソル位
                                                置が最初のマッチより前にあると0
                  exact_match   Boolean       "current" が "pos" でマッチし
                                                ているなら1、そうでないなら0
                  total         Number        見付けたマッチのトータル数
                  incomplete    Number        0: 検索が完了した
                                                1: 再計算がタイムアウトした
                                                2: 最大数を超えた

                {options} についてはさらに以下を参照。

                n や N を押下したときの最後の検索カウントを取るには、この
                関数を recompute: 0 で呼ぶ。n と N の最大カウントが 99
                であるため、時として正しくない情報を返すことがある。もし 99 を
                超える時は結果が最大カウント+1(100)でなくてはならない。もし正
                しい情報を取得したいのであれば、recompute: 1 を指定する:

                        " 多量にマッチする場合、 result == maxcount + 1 (100)
                        " になる
                        let result = searchcount(#{recompute: 0})

                        " 以下は正しい結果を返す(recompute はデフォルトで 1)
                        let result = searchcount()

                この関数は statusline にカウントを追加するのに便利である:
                        function! LastSearchCount() abort
                          let result = searchcount(#{recompute: 0})
                          if empty(result)
                            return ''
                          endif
                          if result.incomplete ==# 1     " タイムアウト
                            return printf(' /%s [?/??]', @/)
                          elseif result.incomplete ==# 2 " 最大数を超過
                            if result.total > result.maxcount &&
                            \  result.current > result.maxcount
                              return printf(' /%s [>%d/>%d]', @/,
                              \             result.current, result.total)
                            elseif result.total > result.maxcount
                              return printf(' /%s [%d/>%d]', @/,
                              \             result.current, result.total)
                            endif
                          endif
                          return printf(' /%s [%d/%d]', @/,
                          \             result.current, result.total)
                        endfunction
                        let &statusline .= '%{LastSearchCount()}'

                        " もしくは 'hlsearch' がオンのときのみカウントを表示し
                        " たいのであれば
                        " let &statusline .=
                        " \   '%{v:hlsearch ? LastSearchCount() : ""}'

                もし検索カウントの更新もしたいのであれば、CursorMoved か
                CursorMovedI の自動コマンドを使うのが便利である:

                        autocmd CursorMoved,CursorMovedI *
                          \ let s:searchcount_timer = timer_start(
                          \   200, function('s:update_searchcount'))
                        function! s:update_searchcount(timer) abort
                          if a:timer ==# s:searchcount_timer
                            call searchcount(#{
                            \ recompute: 1, maxcount: 0, timeout: 100})
                            redrawstatus
                          endif
                        endfunction

                また、カレントバッファで "pattern" を使い指定パターンにマッチ
                したテキストのカウントを使いたいのならば: 

                        " このバッファでの '\<foo\>' のカウント
                        " (Note 検索カウントもまた更新される)
                        let result = searchcount(#{pattern: '\<foo\>'})

                        " 古いパターンの古い検索カウントに戻すには再度検索する
                        call searchcount()

                {options} は辞書 Dictionary でなくてはならない。これらを含め
                られる:
                  キー          型              意味
                  recompute     Boolean       もし TRUE なら、n か N
                                                を実行されたかのようにカウント
                                                を再計算する。
                                                そうでないなら、最後に計算した
                                                結果を返す (n か N を
                                                'shortmess' に "S" を入れない
                                                で実行、もしくはこの関数を呼ん
                                                だ時)
                                                (デフォルト: TRUE)
                  pattern       String        @/ と違う値が与えられたとき
                                                に再計算される。これは以下のコ
                                                マンドをこの関数の呼び出し前に
                                                実行したのと同じ動作になる
                                                  let @/ = pattern
                                                (デフォルト: @/)
                  timeout       Number        0 か負数の場合タイムアウトしな
                                                い。再計算でのmsecのタイムアウ
                                                ト値
                                                (デフォルト: 0)
                  maxcount      Number        0 もしくは負数で制限なし。
                                                結果の再計算におけるマッチの最
                                                大カウント。
                                                もし検索の総計カウントが到達し
                                                たら "total" の値が maxcount +
                                                1 になる
                                                (デフォルト: 99)
                  pos           List          [lnum, col, off] 値
                                                再計算の値。
                                                "current" の結果の値を更新する。
                                                cursor()、 getpos() を参照
                                                (デフォルト: カーソルの位置)


searchdecl({name} [, {global} [, {thisblock}]])                 searchdecl()
                {name}の宣言を検索する。

                {global}が0でないときはgDと同じようにファイル中の最初のマッ
                チを探す。そうでないときはgdと同じ動作になり、現在の関数内か
                ら最初のマッチを探す。

                {thisblock}が0でないときはカーソル位置より前の位置で閉じている
                {}ブロックを無視し、そのスコープ内でだけ有効な変数宣言にマッチ
                しないようになる。

                マッチを見つけるとその位置へカーソルを移動する。
                成功すると0を返し、失敗すると非0を返す。
                例:
                        if searchdecl('myvar') == 0
                           echo getline('.')
                        endif

                method としても使用できる:
                        GetName()->searchdecl()

                                                        searchpair()
searchpair({start}{middle}{end} [, {flags} [, {skip}
                                [, {stopline} [, {timeout}]]]])
                ネストしたstart・endのペアを検索する。これを使うと、"if" に対
                応する "endif" を見つけることができる。それらの間にある他のif・
                endifのペアは無視される。
                検索はカーソル位置から開始する。デフォルトでは下方に検索する。
                {flags}に 'b' が含まれていると上方に検索する。
                マッチが見つかると、その位置へカーソルを移動し、行番号を返す。
                マッチが見つからなかったときは0または-1を返し、カーソルは移動
                しない。エラーメッセージは表示されない。

                {start}{middle}{end}は正規表現である。patternを参照。こ
                の正規表現に \( \) のペアを含めてはならない。\%( \) は含めても
                よい。{middle}はネストしたstart・endペアの中にないときのみマッ
                チする。典型的な使用例:
                        searchpair('\<if\>', '\<else\>', '\<endif\>')
                ここで{middle}を空にすると "else" をスキップするようになる。

                {flags}にはsearch()と同様に 'b', 'c', 'n', 's', 'w', 'W' が
                使える。それに加えて以下のフラグが利用できる。
                'r'     それ以上マッチが見つからなくなるまで繰り返す。つまり最
                        も外側のペアを探す。'W' も自動的にオンになる。
                'm'     マッチ位置の行番号でなくマッチの個数を返す。'r' を使っ
                        ているときは > 1 となる。
                Note: ほとんど常に 'W' を使ってファイルの末尾で循環しないよう
                にするのがよい考えである。

                {start}{middle}{end}のマッチが見つかると、マッチの開始位置
                にカーソルを移動し、式{skip}を評価する。このマッチがコメントや
                文字列の内側にある場合など、無視したいものであれば式{skip}
                非0を返すようにする。
                {skip}を省略した、または空のときはどのマッチも無視しない。
                {skip}を評価している最中にエラーが発生すると、検索は異常終了し
                -1を返す。
                {skip} は、文字列、ラムダ、関数参照もしくは部分適用のいずれか
                である。それ以外の場合、関数は失敗する。
                :def 関数内では引数 {skip} が文字列定数の場合、命令の中にコ
                ンパイルされる。

                {stopline} と {timeout} についてはsearch()を参照。

                'ignorecase' の値が適用される。'magic' の値は無視され、オンの
                ときと同じ様に動作する。

                検索はカーソル位置から開始する。検索方向の次の文字における
                {start}{middle}{end}のマッチが最初に見つかる。例:
                        if 1
                          if 2
                          endif 2
                        endif 1
                カーソルが "if 2" の "i" の上にある状態から下方に検索を開始す
                ると "endif 2" にマッチする。"if 2" の直前の文字の上から検索を
                開始すると "endif 1" にマッチする。これは、"if 2" が最初に見つ
                かり、"if 2" から "endif 2" までがネストしたペアと見なされるた
                めである。上方検索で、{end}が2文字以上であるときはパターンの最
                後に "\zs" をつけるとよいかもしれない。するとカーソルがendの
                マッチの内側にあるとき、対応するstartを見つけるようになる。

                例: Vim script の "endif" コマンドを見つけるには:

        :echo searchpair('\<if\>', '\<el\%[seif]\>', '\<en\%[dif]\>', 'W',
                        \ 'getline(".") =~ "^\\s*\""')

                これを使うには、マッチを見つけたい "if" の上、またはそれ以降に
                カーソルを置くこと。Note バックスラッシュを二重にしなくてもよ
                いようにシングルクォート文字列を使っている。式skipにより、コメ
                ントだけの行を無視するようにしている。コマンドの後のコメントは
                無視していない。また、行の途中の "en" や "if" という単語にマッ
                チしてしまう。
                もう1つの例: "}" に対応する "{" を検索する:

        :echo searchpair('{', '', '}', 'bW')

                これを使うには、マッチを見つけたい "}" の上、または前にカーソ
                ルを置くこと。構文ハイライトにより文字列と見なされるマッチを無
                視するには次のようにする:

        :echo searchpair('{', '', '}', 'bW',
             \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"')

                                                        searchpairpos()
searchpairpos({start}{middle}{end} [, {flags} [, {skip}
                                [, {stopline} [, {timeout}]]]])
                searchpair()と同様だが、マッチの行番号と桁番号からなるリスト
                Listを返す。このリストの最初の要素は行番号で、次の要素はマッ
                チの桁位置のバイトインデックスである。マッチが見つからなかった
                場合は[0, 0]を返す。

                        :let [lnum,col] = searchpairpos('{', '', '}', 'n')

                より大規模で役に立つ例に関してはmatch-parensを参照。

                                                        searchpos()
searchpos({pattern} [, {flags} [, {stopline} [, {timeout} [, {skip}]]]])
                search()と同様だが、マッチの行番号と桁番号からなるリスト
                Listを返す。このリストの最初の要素は行番号で、次の要素はマッ
                チの桁位置のバイトインデックスである。マッチが見つからなかった
                場合は[0, 0]を返す。
                例:
        :let [lnum, col] = searchpos('mypattern', 'n')

                フラグ 'p' を指定すると、戻り値にサブパターンのマッチ番号を示
                す要素が加わるsearch()-sub-match。例:
        :let [lnum, col, submatch] = searchpos('\(\l\)\|\(\u\)', 'np')
                この例において、"submatch" は小文字/\lが見つかったとき2とな
                り、大文字/\uが見つかったとき3となる。

                method としても使用できる:
                        GetPattern()->searchpos()

server2client({clientid}{string})                     server2client()
                {clientid}に返信文字列を送る。最後に文字列を送った{clientid}
                expand("<client>")で取得できる。
                {+clientserver機能付きでコンパイルしたときのみ利用可能}
                成功で0を返し、失敗で-1を返す。
                Note:
                このIDは次のコマンドを受け取る前に取得しなければならない。つま
                り、受け取ったコマンドから戻る前で、入力を待つコマンドを呼ぶ前。
                clientserverも参照。
                例:
                        :echo server2client(expand("<client>"), "HELLO")

                method としても使用できる:
                        GetClientId()->server2client(string)

serverlist()                                    serverlist()
                利用可能なサーバー名のリストを返す。1行に1つの形式。
                サーバーが1つもないとき、または情報を取得できないときは空文字
                列を返す。clientserverも参照。
                {+clientserver機能付きでコンパイルしたときのみ利用可能}
                例:
                        :echo serverlist()

setbufline({expr}{lnum}{text})                      setbufline()
                バッファ {expr} の行 {lnum} を {text} に設定する。これは特定の
                バッファに対し、setline() のように機能する。

                この関数は、ロードされたバッファに対してのみ機能する。必要であ
                れば、最初に bufload() を呼び出すこと。

                行を挿入する場合には appendbufline() を使用する。
                {lnum} 内のテキストプロパティはすべて消去される。

                {text} は、1行を設定する文字列、または複数行を設定する文字列の
                リストである。リストが最後の行の下にある場合、それらの行が追加
                される。

                {expr} の使い方については前述の bufname() を参照。

                {lnum} は setline() と同様に扱われる。
                {lnum} が最後の行のすぐ下にある場合、{text} は最後の行の下に追
                加される。

                {expr} が有効なバッファでない場合、バッファがロードされない
                か、{lnum} が無効な場合は 1 が返される、成功すると 0 が返され
                る。

                method としても使用でき、ベースは第3引数として渡される:
                        GetText()->setbufline(buf, lnum)

setbufvar({expr}{varname}{val})                     setbufvar()
                バッファ{expr}のオプションまたはローカル変数{varname}{val}
                代入する。
                グローバル・ウィンドウローカルオプションに対しても動作するが、
                グローバル・ウィンドウローカル変数に対しては動作しない。
                ウィンドウローカルオプションの場合、グローバルな値は変更されな
                い。
                {expr}の解釈の仕方についてはbufname()を参照。
                Note 変数名には "b:" をつけてはならない。
                例:
                        :call setbufvar(1, "&mod", 1)
                        :call setbufvar("todo", "myvar", "foobar")
                サンドボックスの中ではこの関数は使用できない。

                method としても使用でき、ベースは第3引数として渡される:
                        GetValue()->setbufvar(buf, varname)


setcellwidths({list})                                   setcellwidths()
                指定した文字のレンジのセル幅を上書きする。これは、文字の幅が画
                面のセルで数えてどれだけになるかを Vim に教えるのに使う。
                これは 'ambiwidth' を上書きする。例:
                   setcellwidths([[0xad, 0xad, 1],
                                \ [0x2194, 0x2199, 2]])

                                        E1109 E1110 E1111 E1112 E1113
                引数 {list} は3つの数字を持つリストのリスト。3つの数字は[low,
                high, width]。"low" と "high" は同じ値にでき、その場合はある1
                文字を参照する。そうでないなら、"low" から "high" まで(両方を
                含む)の文字のレンジになる。"width" は1か2で、文字の画面上のセ
                ル幅を示す。
                与えられた引数が不正、もしくは範囲が他と被る場合はエラーにな
                る。
                文字の値は 0x100 かそれ以上の値だけが使える。

                空のリストを渡すことで上書きがクリアされる:
                   setcellwidths([]);
                既知の絵文字への効果を確認するのに
                $VIMRUNTIME/tools/emoji_list.vim スクリプトが使える。

 setcharpos({expr}{list})                             setcharpos()
                setpos() と同様だが指定に使う桁番号はその行のバイトインデッ
                クスの代わりに文字インデックスである。

                例:
                8行目にテキスト "여보세요" がある状態:
                        call setcharpos('.', [0, 8, 4, 0])
                4番目の文字 '요' へカーソルを位置させる。
                        call setpos('.', [0, 8, 4, 0])
                2番目の文字 '보' へカーソルを位置させる。

                method としても使用できる:
                        GetPosition()->setcharpos('.')

setcharsearch({dict})                                   setcharsearch()
                現在の文字検索の情報を{dict}に設定する。
                この辞書は下記のエントリを1以上持つ:

                    char        続いて起こる,;コマンドで使われる文字。
                                空文字列の場合、文字検索を解除する。
                    forward     文字検索の方向。1は前方、0は後方。
                    until       文字検索の種類。1はtもしくはTの文字検索、0は
                                fもしくはFの文字検索。

                これはユーザーの文字検索のセーブ/リストアを使うことができる:
                        :let prevsearch = getcharsearch()
                        :" ユーザーの検索に影響を与えるコマンドを実行する。
                        :call setcharsearch(prevsearch)
                getcharsearch()も参照。

                method としても使用できる:
                        SavedSearch()->setcharsearch()

setcmdpos({pos})                                        setcmdpos()
                コマンドラインの{pos}バイトの位置へカーソルを移動する。
                {pos}は1から始まる。
                現在の位置を取得するにはgetcmdpos()を使う。
                コマンドラインを編集している最中のみ機能する。よって、
                c_CTRL-\_ec_CTRL-R_=c_CTRL-R_CTRL-R+ '=' と組み合
                わせて使うときだけ意味がある。c_CTRL-\_ec_CTRL-R_CTRL-R
                + '=' の場合、コマンドラインにその式をセットした後でカーソル
                を移動する。c_CTRL-R_=の場合、式を評価した後、結果のテキスト
                を挿入する前にカーソルを移動する。
                {pos}が大きすぎるときは行末にカーソルを移動する。{pos}が1より
                小さいときの結果は未定義である。
                成功なら偽、コマンドラインを編集しているとき以外には真を返す。

                method としても使用できる:
                        GetPos()->setcmdpos()

setcursorcharpos({lnum}{col} [, {off}])               setcursorcharpos()
setcursorcharpos({list})
                cursor() と同様だが指定に使う桁番号はその行のバイトインデッ
                クスの代わりに文字インデックスである。

                例:
                4行目にテキスト "여보세요" がある状態:
                        call setcursorcharpos(4, 3)
                3番目の文字 '세' へカーソルを位置させる。
                        call cursor(4, 3)
                1番目の文字 '여' へカーソルを位置させる。

                method としても使用できる:
                        GetCursorPos()->setcursorcharpos()


setenv({name}{val})                                           setenv()
                環境変数{name} に {val} を設定する。
                {val} が v:null の場合は、環境変数は削除される。
                expr-env も参照。

                method としても使用でき、ベースは第2引数として渡される:
                        GetPath()->setenv('PATH')

setfperm({fname}{mode})                               setfperm() chmod
                {fname} のファイル許可属性を {mode} に設定する。
                {mode} は9文字の文字列でなければならない。形式は "rwxrwxrwx"
                であり、それぞれはファイルの所有者権限、グループ権限、その他
                のユーザーを表す "rwx" というフラグのグループである。文字 "-"
                は許可属性がオフであり、その他の文字はオンである。マルチバイト
                文字はサポートされない。

                例えば "rw-r-----" はそのユーザーの読み書き、グループでは読み
                取り専用、その他のユーザーはアクセス不可である。"xx-x-----" は
                同じ意味となる。

                成功するとゼロ以外を返し、失敗するとゼロを返す。

                method としても使用できる:
                        GetFilename()->setfperm(mode)

                許可属性の読み取りについてはgetfperm()を参照。


setline({lnum}{text})                                 setline()
                カレントバッファの{lnum}行目を{text}にする。行を挿入したい場合
                は append() を使う。別のバッファの行を変更したい場合は
                setbufline() を使う。{lnum}内のテキストプロパティはすべて消
                去される。

                {lnum}getline()のときと同じように解釈される。
                {lnum}が最後の行の次の行の場合、最後の行の下に{text}が追加され
                る。
                {text}は任意の型もしくは任意の型のリストで、各要素が文字列に変
                換される。

                成功したら偽を返す。失敗したら(大抵{lnum}が無効な値のとき)真を
                返す。

                例:
                        :call setline(5, strftime("%c"))

                {text}がリストListの場合、{lnum}行目とそれ以降の行にリストの
                要素をセットする。例:
                        :call setline(5, ['aaa', 'bbb', 'ccc'])
                上の例は次と同値である:
                        :for [n, l] in [[5, 'aaa'], [6, 'bbb'], [7, 'ccc']]
                        :  call setline(n, l)
                        :endfor

                Note: マーク '[ と '] はセットされない。

                method としても使用でき、ベースは第2引数として渡される:
                        GetText()->setline(lnum)

setloclist({nr}{list} [, {action} [, {what}]])                setloclist()
                ウィンドウ{nr}のlocationリストを作成・置き換え・追加する。
                {nr} にはウィンドウ番号またはwindow-IDが使える。
                {nr}が0のときはカレントウィンドウを対象にする。

                locationリストウィンドウの場合、そこに表示しているlocationリス
                トが修正される。ウィンドウ番号{nr}が無効な場合、-1を返す。それ
                以外は setqflist() と同じ。
                location-list も参照。

                {action} については setqflist-action を参照。

                オプショナル引数の辞書 {what} が提供される場合、{what} で指定
                されるアイテムのみが設定される。サポートされる {what} の一覧は
                setqflist()を参照。

                method としても使用でき、ベースは第2引数として渡される:
                        GetLoclist()->setloclist(winnr)

setmatches({list} [, {win}])                            setmatches()
                getmatches() で取得したマッチのリストを復元する。成功なら 0、
                失敗なら -1 を返す。リストを復元するに先立って、現在のマッチは
                すべて消去される。getmatches() の例を参照。
                {win} が指定されれば、カレントウィンドウではなく指定されたウィ
                ンドウあるいはウィンドウID を対象にする。

                method としても使用できる:
                        GetMatches()->setmatches()

                                                        setpos()
setpos({expr}{list})
                {expr}の位置を設定する。{expr}として有効な値は次の通り:
                        .       カーソル位置
                        'x      マーク x

                {list} は 4 個か 5 個の要素を持つリストListである:
                    [bufnum, lnum, col, off]
                    [bufnum, lnum, col, off, curswant]

                "bufnum" はバッファ番号。0にするとカレントバッファを表す。大文
                字のマークを設定するとき、"bufnum" はマーク位置として用いられ
                る。それ以外のマークの場合、"bufnum" はマークを設定するバッファ
                を指定する。関数bufnr()を使ってファイル名をバッファ番号に変
                換することができる。
                カーソルと ' マークを設定する場合、バッファ番号は無視される。
                なぜならそれらはバッファではなくウィンドウに関連付けられている
                からである。
                ジャンプリストは変更されない。

                "lnum" と "col" はバッファ内の位置。桁番号は1から始まる。
                "lnum" を 0 にするとそのマークを削除する。"col" が 1 より小さ
                いときは 1 が使われる。バイトでのカウントではなく文字でのカウ
                ントを使いたいなら、setcharpos() を使う。

                数値 "off" は 'virtualedit' がオンのときのみ使われ、その文字の
                開始位置からの画面上の桁のオフセットとなる。例えば、<Tab>の中、
                または最後の文字より後に設定したいときに使う。

                "curswant" はカーソル位置を設定するときのみ使われる。これは縦
                方向移動の優先的列番号である。"curswant" を指定しなかった場合
                は優先値は設定されない。マークの位置を設定するときに
                "curswant" を指定した場合はその値は使用されない。

                Note: '< と '> の行番号を変更した場合は '< が '> の手前にくる
                ように位置が交換される。

                位置をセットできたときは 0 を、そうでなければ -1 を返す。
                {expr} が無効なときはエラーメッセージが出る。

                setcharpos()getpos() と getcurpos() も参照。

                縦方向移動の優先的列番号は復元されない。これを使ってカーソル位
                置を設定した場合は、j や k で移動すると以前の列にジャンプす
                るだろう!優先的列番号も併せて設定するには cursor() を使うこ
                と。winrestview() の "curswant" キーも参照。

                method としても使用できる:
                        GetPosition()->setpos('.')


setqflist({list} [, {action} [, {what}]])               setqflist()
                quickfixリストを作成、置き換え、もしくはリストへの追加を行う。

                オプショナル引数の辞書 {what} が提供される場合、{what} で指定
                されるアイテムのみが設定される。最初の {list} は無視される。
                {what} でサポートされる項目については以下を参照。
                                                        setqflist-what
                {what} が存在しない場合、{list} 内の要素が使用される。各要素は
                辞書であること。辞書でない {list} の要素は無視される。各辞書は
                以下の要素を持つ:

                    bufnr       バッファ番号。有効なバッファ番号でなければなら
                                ない。
                    filename    ファイル名。"bufnr" がないとき、または無効であ
                                るときのみ使われる。
                    module      モジュール名; 与えられた場合はファイル名の代わ
                                りに quickfix エラーウィンドウ内で使用される。
                    lnum        ファイル中の行番号
                    pattern     エラーの位置を特定するための検索パターン
                    col         桁番号
                    vcol        0でない場合: "col" は表示上の桁
                                0の場合: "col" はバイトインデックス
                    nr          エラー番号
                    text        エラーの説明
                    type        エラータイプを示す1文字。'E', 'W' など。
                    valid       エラーメッセージが認識されている

                辞書の要素 "col"、"vcol"、"nr"、"type"、"text" は省略可能であ
                る。"lnum" か "pattern" のどちらか一方のみがエラー行を特定する
                ために使われる。"filename" と "bufnr" の両方ともない場合、また
                は "lnum" と "pattern" の両方ともない場合、その要素はエラー行
                として扱われない。"pattern" と "lnum" の両方があるときは
                "pattern" が使われる。
                要素 "valid" が与えられていない場合、"bufnr" が有効なバッファ
                であるか、もしくは "filename" が存在するときには有効フラグが設
                定される。
                {list} に空のリストを指定すると quickfix リストはクリアされ
                る。
                このリストはgetqflist()が返すものと正確に同じではないことに
                注意。

                {action} の値:                  setqflist-action E927
                'a'     {list} の要素を既存のquickfixリストに追加する。
                        quickfixリストがまだ存在しない場合は新規に作成される。

                'r'     {list} の要素で現在のquickfixリストを置き換える。これ
                        はリストをクリアするのにも使える:
                                :call setqflist([], 'r')

                'f'     quickfix スタック内のすべての quickfix リストが解放さ
                        れる。

                {action}が指定されないとき、または ' ' のときは新しい quickfix
                リストを作成する。新しい quickfix リストは、スタック内の現在の
                quickfix リストと、続くすべてのリストが解放された後に追加され
                る。新しい quickfix リストをスタックの最後に追加する場合には、
                {what} 内の "nr" に "$" を設定する。

                {what} の辞書では以下のアイテムを指定する事ができる:
                    context     quickfix リストコンテキスト。
                                quickfix-context を参照
                    efm         "lines" からテキストをパースするときに使うエ
                                ラーフォーマット。存在しない場合はオプション
                                'errorformat' の値が使用される。
                                quickfix-parse を参照
                    id          quickfix リスト識別子 quickfix-ID
                    idx         'id' または 'nr' で指定されたquickfixリスト内
                                の現在のエントリのインデックス。'$' に設定する
                                と、リストの最後のエントリが現在のエントリとし
                                て設定される。quickfix-index を参照。
                    items       quickfix エントリのリスト。引数 {list} と同じ。
                    lines       行のリストをパースするのに 'errorformat' を使
                                用し、結果のエントリを quickfix リスト {nr} も
                                しくは {id} に加える。List 値だけがサポート
                                される。quickfix-parse を参照
                    nr          quickfix スタックでのリスト番号; 0 は現在の
                                quickfix リストを意味し、"$" は最後の quickfix
                                リストを意味する。
                    quickfixtextfunc
                                quickfixウィンドウでの表示テキストを取得する関
                                数。この値は関数名もしくはfuncrefもしくはラム
                                ダ。関数の書き方と例の説明については
                                quickfix-window-function を参照。
                    title       quickfix リストのタイトルテキスト。
                                quickfix-title を参照
                {what} 内でのサポートされていないキーは無視される。
                "nr" 番目のアイテムが提供されていない場合は現在の quickfix リ
                ストが変更される。新しい quickfix リストを作成するときは、"nr"
                に quickfix スタックサイズより 1 大きい値を設定することができ
                る。quickfix リストを変更するときには、正しいリストが変更され
                ることを保証するために、リストの指定には "nr" ではなく "id" が
                使用されるべきである。

                例 (setqflist-examples も参照):
                   :call setqflist([], 'r', {'title': 'My search'})
                   :call setqflist([], 'r', {'nr': 2, 'title': 'Errors'})
                   :call setqflist([], 'a', {'id':qfid, 'lines':["F1:10:L10"]})

                成功なら0、失敗なら-1を返す。

                この関数は 'errorformat' の設定とは無関係にquickfixリストを作
                るために使える。その最初のエラーへジャンプするには :cc 1 な
                どのコマンドを使う。

                method としても使用でき、ベースは第2引数として渡される:
                        GetErrorlist()->setqflist()


                                                        setreg()
setreg({regname}{value} [, {options}])
                レジスタ{regname}{value}をセットする。
                {regname} が "" もしくは "@" のとき、無名レジスタ '"' を使う。
                Vim9-script では {regname} は1文字でなくてはならない。

                {value} には getreg() か getreginfo() の戻り値ならどんな値
                でも (リスト List でも 辞書 Dictionaryでも) 指定できる。
                {options}が "a" を含んでいるとき、または{regname}が大文字のと
                きは、その値に追加する。

                {options}は以下のレジスタの種類指定を含んでもよい:
                    "c" または "v"            characterwise モード
                    "l" または "V"            linewise モード
                    "b" または "<CTRL-V>"     blockwise-visual モード
                "b" または "<CTRL-V>" の直後に数値を続けると、それが選択範囲の
                幅となる。これを指定しない場合、選択範囲の幅は一番長い行の文字
                数となる(<Tab>は1文字と数えられる)。

                {options} にレジスタの設定が何も含まれていないときのデフォルト
                値は文字モードである。ただし、{value} が文字列で末尾が <NL> の
                場合や {value} がリストの場合は行モードになる。矩形モードは明
                示的に指定しない限り選択されない。
                成功なら0、失敗なら非0を返す。

                                                        E883
                Note: 検索レジスタや式レジスタを設定するときは複数の要素を含ん
                      だリスト (List) を指定することはできない。空のリストは
                      空文字列と同様に扱われる。

                例:
                        :call setreg(v:register, @*)
                        :call setreg('*', @%, 'ac')
                        :call setreg('a', "1\n2\n3", 'b5')
                        :call setreg('"', { 'points_to': 'a'})

                次の例は、この関数を使ってレジスタを退避・復元する例である:
                        :let var_a = getreginfo()
                        :call setreg('a', var_a)
                もしくは:
                        :let var_a = getreg('a', 1, 1)
                        :let var_amode = getregtype('a')
                            ....
                        :call setreg('a', var_a, var_amode)
                Notegetreg() の 3 番目の引数を使用せずにレジスタの内容を完
                全に復元することはできない。改行文字と Nul 文字がどちらも改行
                文字として表現されてしまうため。NL-used-for-Nul 参照。

                空文字列を追加すると、レジスタの種類を変更することができる:
                        :call setreg('a', '', 'al')

                method としても使用でき、ベースは第2引数として渡される:
                        GetText()->setreg('a')

settabvar({tabnr}{varname}{val})                    settabvar()
                タブページ {tabnr} のタブローカル変数 {varname} を {val} に設
                定する。 t:var
                Note 自動コマンドがブロックされ、副作用が発生しない可能性があ
                る。例えば、'filetype' を設定する時。
                Note: 指定する変数名は "t:" を除いた名前。
                タブの番号は 1 から始まる。
                この関数はサンドボックス (sandbox) の中では使えない。

                method としても使用でき、ベースは第3引数として渡される:
                        GetValue()->settabvar(tab, name)

settabwinvar({tabnr}{winnr}{varname}{val})        settabwinvar()
                ウィンドウ{winnr}のオプションやローカル変数{varname}の値を
                {val}にセットする。
                タブ番号は1から始まる。カレントタブページを対象とする場合は
                setwinvar()を使う。
                {winnr} にはウィンドウ番号またはwindow-IDが使える。
                {winnr}が0のときはカレントウィンドウが対象となる。
                Note 自動コマンドがブロックされ、副作用が発生しない可能性があ
                る。例えば、'filetype' または 'syntax' を設定する時。グローバ
                ルオプションやバッファローカルオプションを設定することもできる
                が、グローバル変数やバッファローカル変数を設定することはできな
                い。
                バッファローカルオプションを設定した場合、グローバル値は変更さ
                れない。
                Note 変数名には "w:" をつけてはならない。
                例:
                        :call settabwinvar(1, 1, "&list", 0)
                        :call settabwinvar(3, 2, "myvar", "foobar")
                この関数はsandboxの中では使用できない。

                method としても使用でき、ベースは第4引数として渡される:
                        GetValue()->settabvar(tab, winnr, name)

settagstack({nr}{dict} [, {action}])                  settagstack()
                {dict}を使用してウィンドウ{nr}のタグスタックを変更する。
                {nr}にはウィンドウ番号または window-ID を指定できる。

                {dict}でサポートされている項目のリストについては、
                gettagstack() を参照。"curidx" はタグスタックを変更する前に
                効果を生じる。
                                                        E962
                どのようにタグスタックが更新されるかは {action} 引数に依存する:
                - {action} が与えられないか 'r' に設定されている場合、タグス
                  タックは置き換えられる。
                - {action} が 'a' に設定されている場合、{dict} の新しいエント
                  リはタグスタックにプッシュされる。
                - {action} が 't' に設定されている場合、タグスタックの現在のエ
                  ントリあるいは {dict} の "curidx" からすべてのエントリが削除
                  され、新しいエントリがスタックにプッシュされる。

                タグスタックの変更後、現在のインデックスはスタックの長さの 1
                つ後に設定される。

                成功の場合は 0 を返し、失敗の場合は -1 を返す。

                例 (より多くの例は tagstack-examples を参照):
<                   ウィンドウ番号 3 のタグスタックを空にする:
                        call settagstack(3, {'items' : []})

                    タグスタックの保存と復元:
                        let stack = gettagstack(1003)
                        " do something else
                        call settagstack(1003, stack)
                        unlet stack

                method としても使用でき、ベースは第2引数として渡される:
                        GetStack()->settagstack(winnr)

setwinvar({winnr}{varname}{val})                    setwinvar()
                settabwinvar()と同様。カレントタブページを対象とする。
                例:
                        :call setwinvar(1, "&list", 0)
                        :call setwinvar(2, "myvar", "foobar")

                method としても使用でき、ベースは第3引数として渡される:
                        GetValue()->setwinvar(winnr, name)

sha256({string})                                                sha256()
                {string}のSHA256チェックサムを64文字の16進文字列で返す。

                method としても使用できる:
                        GetText()->sha256()

                {+cryptv 機能つきでコンパイルされたときのみ有効}

shellescape({string} [, {special}])                     shellescape()
                シェルコマンドの引数として利用できるように{string}をエスケープ
                する。
                'shell' がpowershell (MS-Windows) か pwsh (MS-Windows、Linux、
                MacOS) が設定されている時、{string} をシングルクォートで囲み、
                {string}の中のシングルクォートを全て二重にする。
                MS-Windowsでは、'shellslash' が設定されていない場合、{string}
                をダブルクォートで囲み、{string}の中のダブルクォートを全て二重
                にする。そうでなければ、{string}をシングルクォートで囲み、"'"
                を"'\''" で置き換える。

                {special} が指定され、0 でない数値または空でない文字列の場合
                (non-zero-arg)、"!", "%", "#", "<cword>" などの特殊なアイテ
                ムの前にはバックスラッシュがつく。コマンド :! によってその
                バックスラッシュは再び除かれる。

                'shell' の値の末尾が "csh" である場合、{special} が
                non-zero-arg ならば "!" の文字もエスケープされる。これは、
                csh と tcsh は シングルクォートの中であっても "!" を履歴置換と
                解釈するためである。

                {special} が non-zero-arg である場合、<NL> 文字もエスケープ
                される。'shell' の末尾が "csh" である場合、これは 2 回エスケー
                プされる。

                :! コマンドを使う場合の例:
                    :exe '!dir ' . shellescape(expand('<cfile>'), 1)
                これはカーソル下のファイルを dir コマンドで表示する。
                system() を使う場合の例:
                    :call system("chmod +w -- " . shellescape(expand("%")))
                ::S も参照のこと。

                method としても使用できる:
                        GetCommand()->shellescape()

shiftwidth([{col}])                                             shiftwidth()
                実際に使用される 'shiftwidth' の値を返す。'shiftwidth' がゼロ
                以外の場合はその値が返る。ゼロの場合は 'tabstop' の値が返る。
                この関数は2012年のパッチ 7.3.694 で導入されたので、現在では皆
                使えるようになっているに違いない。(ただし、オプションの引数
                {col}は 8.1.542 まで使用できない)

                引数{col}があるとき、'shiftwidth' の値を返す桁番号として使用さ
                れる。これは、'vartabstop' 機能のためのものである。
                'vartabstop' 設定が有効で、引数{col}が指定されていない場合、桁
                番号1だと仮定される。

                method としても使用できる:
                        GetColumn()->shiftwidth()

sign_ 関数群はここに文書化されている: sign-functions-details

simplify({filename})                                    simplify()
                ファイル名を、意味を変えずにできるだけ簡略化する。MS-Windowsで
                のショートカットやUnixでのシンボリックリンクは解決される。
                {filename}の最初のパスコンポーネントがカレントディレクトリを指
                す場合、結果にそのまま残される。末尾のパス区切り文字も取り除か
                れない。Unix では "//path" は変更されない、しかし "///path" は
                "/path" に簡略化される (POSIX 標準に準拠)。
                例:
                        simplify("./dir/.././/file/") == "./file/"
                Note: "dir/.." の組み合わせは、"dir" が検索可能なディレクトリ
                であるか、存在しないときのみ取り除かれる。Unixでは、"dir" が同
                じディレクトリ内にあるシンボリックリンクであるときも取り除かれ
                る。パス名を簡略化する前に全てのシンボリックリンクを解決させる
                にはresolve()を使う。

                method としても使用できる:
                        GetName()->simplify()

sin({expr})                                             sin()
                {expr} の正弦(サイン)をラジアンで Float で返す。{expr} は
                Float または Number に評価されなければならない。
                例:
                        :echo sin(100)
                        -0.506366
                        :echo sin(-4.01)
                        0.763301

                method としても使用できる:
                        Compute()->sin()

                {+float 機能つきでコンパイルされたときのみ有効}

sinh({expr})                                            sinh()
                {expr} の双曲線正弦 (ハイパボリックサイン) を返す。
                値は [-inf, inf] の範囲の浮動小数点数 (Float)。
                {expr} は浮動小数点数 (Float) か数値 (Number) でなければな
                らない。
                例:
                        :echo sinh(0.5)
                        0.521095
                        :echo sinh(-0.9)
                        -1.026517

                method としても使用できる:
                        Compute()->sinh()

                {+float 機能を有効にしてコンパイルしたときのみ有効}


slice({expr}{start} [, {end}])                        slice()
                スライス slice "expr[start : end]" と同様に使えるが、"end"
                を含まない。そして文字列のインデックスは、vim9script と同様
                にバイトインデックスの代わりに文字インデックスが使われる。ま
                た、合成文字はカウントされない。
                {end} がない場合スライスは最後の項目を含む。
                {end} が-1の場合最後の項目を含まない。

                method としても使用できる:
                        GetList()->slice(offset)


sort({list} [, {func} [, {dict}]])                      sort() E702
                {list}の要素をその場で(in-place)ソートする。{list}を返す。

                リストを変更したくない場合は、最初にコピーを作っておくこと:
                        :let sortedlist = sort(copy(mylist))
                {func} が省略されたか空かゼロの場合は、各項目の文字列表現を
                使ってソートする。数値は文字列より後になり、リストは数値より後
                になる。カレントバッファのテキストをソートするには :sort を
                使う。

                {func} が '1' か 'i' なら大文字小文字は区別されない。

                {func} が 'l' ならソート順に現在のロケールの照合順序を使用す
                る。実装詳細: 文字列の比較に strcoll() を使用する。ロケール照
                合順をチェックしたり設定するには :language を参照すること。
                v:collate でも現在のロケールを確認することができる。ロケール
                利用のソートでは通常大文字小文字を区別しない。例:
                        " ö は英語ロケールでは o と同等にソートされる。
                        :language collate en_US.UTF8
                        :echo sort(['n', 'o', 'O', 'ö', 'p', 'z'], 'l')
                        ['n', 'o', 'O', 'ö', 'p', 'z']

                        " ö はスウェーデン語ロケールでは z のうしろにソートさ
                        " れる。
                        :language collate sv_SE.UTF8
                        :echo sort(['n', 'o', 'O', 'ö', 'p', 'z'], 'l')
                        ['n', 'o', 'O', 'p', 'z', 'ö']
                これはMacでは正常に動作しない。

                {func} が 'n' ならすべての要素は数値順にソートされる (実装詳
                細: 数値の読み込みには strtod() 関数が使われる。文字列、リス
                ト、辞書、関数参照は 0 として扱われる)。

                {func} が 'N' ならすべての要素は数値順にソートされる。これは
                'n' に似ているが、数値を含む文字列はその文字列が表す数値として
                扱われる。

                {func} が 'f' ならすべての要素は数値順にソートされる。すべての
                値は数値か浮動小数点数でなければならない。

                {func}Funcrefまたは関数名を指定すると、その関数を使って要
                素を比較する。その関数は2つの要素を引数として受け取り、それら
                が等しいときは0、1番目の引数を2番目より後にするなら1以上、1番
                目の方を前にするなら-1以下を返す。

                {dict} は "dict" 属性付きの関数と一緒に使う。値はローカル変数
                "self" として使われる。 Dictionary-function

                ソートは安定である。(数値または文字列として) 等価な要素は元の
                順序関係が保持される。例えば数値としてソートした場合、文字列は
                元の順番通りに隣り合って並ぶ。

                method としても使用できる:
                        mylist->sort()

                uniq() も参照のこと。

                例:
                        func MyCompare(i1, i2)
                           return a:i1 == a:i2 ? 0 : a:i1 > a:i2 ? 1 : -1
                        endfunc
                        let sortedlist = sort(mylist, "MyCompare")
                この例の場合、より短く次のように書くことができる。ただしオーバー
                フローは無視される:
                        func MyCompare(i1, i2)
                           return a:i1 - a:i2
                        endfunc

sound_clear()                                           sound_clear()
                すべてのサウンドの再生を停止する。

                method としても使用できる:
                        GetSoundName()->sound_playevent()

                {+sound 機能つきでコンパイルされたときのみ有効}

                                                        sound_playevent()
sound_playevent({name} [, {callback}])
                {name} で識別されるサウンドを再生する。サポートされているイベ
                ント名はシステムによって異なる。XDGのサウンド名がよく使われる。
                Ubuntuでは、それらは /usr/share/sounds/freedesktop/stereo に見
                つかるだろう。例:
                        call sound_playevent('bell')
                MS-Windows では、{name} は SystemAsterisk、SystemDefault、
                SystemExclamation、SystemExit、SystemHand、SystemQuestion、
                SystemStart、SystemWelcome 等になる。

                {callback} が指定されている場合は、サウンドが終了したときに呼
                び出される。最初の引数はサウンドID、2番目の引数はステータスで
                ある:
                        0       最後までサウンドが再生された
                        1       サウンドは中断された
                        2       サウンド開始後にエラーが発生した
                例:
                   func Callback(id, status)
                     echomsg "sound " .. a:id .. " finished with " .. a:status
                   endfunc
                   call sound_playevent('bell', 'Callback')

                MS-Windows: {callback} はこの関数では動作しない。

                sound_stop() に渡すことができるサウンドIDを返す。
                サウンドを再生できなかった場合はゼロを返す。
                {+sound 機能つきでコンパイルされたときのみ有効}

                                                        sound_playfile()
sound_playfile({name} [, {callback}])
                sound_playevent() と似ているが、サウンドファイル {name} を再
                生する。{name} はフルパスでなければならない。Ubuntuでは、この
                コマンドで再生するファイルが見つかるかもしれない:
                    :!find /usr/share/sounds -type f | grep -v index.theme

                method としても使用できる:
                        GetSoundPath()->sound_playfile()

                {+sound 機能つきでコンパイルされたときのみ有効}


sound_stop({id})                                        sound_stop()
                サウンド {id} の再生を停止する。{id} は、事前に
                sound_playevent() または sound_playfile() によって返された
                ものでなければならない。

                MS-Windowsでは、これは sound_playevent() によって開始される
                イベントサウンドに対しては機能しない。イベントのサウンドを止め
                るには sound_clear() を使用する。

                method としても使用できる:
                        soundid->sound_stop()

                {+sound 機能つきでコンパイルされたときのみ有効}

                                                        soundfold()
soundfold({word})
                {word} の soundfold 値を返す。カレントウィンドウの 'spelllang'
                で設定された言語のうち、soundfold に対応している最初の言語が使
                用される。'spell' がオンでなければならない。soundfold ができな
                い場合は {word} がそのまま返される。
                この関数はスペル修正候補の作成に使える。Note この方法はとても
                遅くなる可能性がある。
                {訳注: phonetic algorithm の一種}

                method としても使用できる:
                        GetWord()->soundfold()

                                                        spellbadword()
spellbadword([{sentence}])
                引数なしの場合: カーソル下またはカーソル以降のスペルミスした単
                語を返す。その単語の先頭へカーソルを移動する。カレント行にスペ
                ルミスした単語が見つからない場合は空文字列を返し、カーソルは移
                動しない。

                引数ありの場合: {sentence}の中のスペルミスしている最初の単語を
                返す。スペルミスしている単語がない場合は空文字列を返す。

                戻り値は、次の2個の要素を持つリスト:
                - スペルミスした単語または空文字列
                - スペルミスの種類:
                        "bad"           スペルミス
                        "rare"          頻度の低い単語
                        "local"         他の地域でのみ有効な単語
                        "caps"          大文字で始めるべき単語
                例:
                        echo spellbadword("the quik brown fox")
                        ['quik', 'bad']

                カレントウィンドウに対するスペリング情報と 'spelllang' の値が
                使用される。

                method としても使用できる:
                        GetText()->spellbadword()

                                                        spellsuggest()
spellsuggest({word} [, {max} [, {capital}]])
                {word}の正しいスペルの候補のリストを返す。{max}を指定すると、
                候補の数の最大値となる。{max}を指定しないと、25個までの候補を
                返す。

                {capital}に0でない値を指定すると、先頭が大文字の候補だけを返す。
                これは 'spellcapcheck' とのマッチの後に使う。

                {word}はスペルの間違った単語で、後に他のテキストが続いてもよい。
                これにより、分割された2つの単語を連結することができる。候補も
                また続きのテキストを含んでいるので、これによって行を置き換える
                ことができる。

                {word}は正しい単語でもよい。すると似た単語が返ってくるだろう。
                {word}自身は候補に含まれないが、大文字化されたものが含まれてい
                ることはある。

                カレントウィンドウのスペリング情報が使われる。オプション
                'spell' がオンでなければならず、'spelllang' と 'spellsuggest'
                の値が適用される。

                method としても使用できる:
                        GetWord()->spellsuggest()

split({expr} [, {pattern} [, {keepempty}]])                     split()
                {expr}を分割してListにする。{pattern}を省略した場合、または
                {pattern}が空文字列の場合は、{expr}を空白文字で区切った各文字
                列が要素となる。
                {pattern}を指定すると、{pattern}がマッチする位置で文字列を分割
                する。マッチした文字列は削除される。'ignorecase' はここでは適
                用されないので大文字小文字を無視するには \c を使う。 /\c
                {keepempty}に非0を指定しない限り、最初または最後の要素が空文字
                列ならばリストから取り除かれる。
                それ以外の空文字列は、{pattern}が1文字以上にマッチすれば、また
                は{keepempty}が非0ならばそのままリストの要素となる。
                例:
                        :let words = split(getline('.'), '\W\+')
                文字列を各文字に分割するには:
                        :for c in split(mystring, '\zs')
                区切り文字を削除せず、そのままにしておきたい場合は、'\zs' を
                パターンの最後で使う:
                        :echo split('abc:def:ghi', ':\zs')
                        ['abc:', 'def:', 'ghi']
                最初の要素が空であるかもしれないテーブルを分割するには:
                        :let items = split(line, ':', 1)
                これの逆を行う関数はjoin()である。

                method としても使用できる:
                        GetString()->split()

sqrt({expr})                                            sqrt()
                浮動小数点数 {expr} の非負平方根を Float で返す。
                {expr} は Float または Number に評価されなければならない。
                {expr} が負の場合、結果は NaN (Not a Number) になる。
                例:
                        :echo sqrt(100)
                        10.0
                        :echo sqrt(-4.01)
                        nan
                "nan" はシステムのライブラリに依存するので、異なるかもしれな
                い。

                method としても使用できる:
                        Compute()->sqrt()

                {+float 機能つきでコンパイルされたときのみ有効}


srand([{expr}])                                         srand()
                rand() で使われる種を初期化する:
                - {expr} が与えられない場合、種は可能ならば /dev/urandom を読
                  むことで初期化され、そうでなければ time(NULL)、すなわちエポッ
                  クタイム (これは秒の正確度しかないが) で初期化される。
                - {expr} が与えられる場合、数値でなければならない。これは種の
                  値を初期化するのに用いられる。これはテストや、予期可能な数列
                  を意図しているときに有用である。

                例:
                        :let seed = srand()
                        :let seed = srand(userinput)
                        :echo rand(seed)

state([{what}])                                         state()
                現在の状態を示す文字を含む文字列を返す。常に安全であるとは限ら
                ないかもしれない作業を行いたいコールバックで最も有用である。お
                およそ次のように動作する:
                - コールバックは state() を使用して、作業が安全かどうかを確認
                  する。
                  はい:   その後すぐにそれを行う
                  いいえ: 作業キューへの追加と、SafeState および/または
                          SafeStateAgain 自動コマンドを追加する(SafeState
                          はトップレベルでトリガー、SafeStateAgain はメッセー
                          ジとコールバックの処理後にトリガー)。
                - SafeState または SafeStateAgain がトリガーされて自動コマンド
                  が実行されたら、state() で作業をすぐに実行できるかどうかを
                  確認し、はいの場合はキューから削除して実行する。キューが空に
                  なった場合、自動コマンドを削除する。
                mode() も参照。

                {what} を指定すると、この文字列の文字のみが追加される。たとえ
                ば、これは画面がスクロールしたかどうかを確認する:
                        if state('s') == ''
                           " 画面はスクロールしていない

                これらの文字は状態を示し、大概は何かがビジーであることを示す:
                    m   マッピングの途中、:normalコマンド、feedkeys() または詰
                        め込まれたコマンド
                    o   オペレータ待機、例えば d の後
                    a   挿入モード自動補完がアクティブ
                    x   自動コマンド実行中
                    w   待機中にブロックされた。例えば、jsonを読む時の
                        ch_evalexpr(), ch_read() および ch_readraw()
                    S   SafeState または SafeStateAgain をトリガーしない、例え
                        ば f の後やカウント時
                    c   タイマーを含むコールバック呼び出し(再帰呼び出しは
                        "ccc" まで繰り返す)
                    s   画面がメッセージでスクロールされた

str2float({expr})                                       str2float()
                文字列 {expr} を浮動小数点数に変換する。これは式の中で浮動小数
                点数を使っているときと同じように働く (floating-point-format
                を参照)。しかしこちらの方がゆるやかである。例えばこちらでは
                "1e40" も許されるが、式の中では "1.0e40" と書かなければならな
                い。16進形式の "0x123" も許されるが、バイナリや8進数のようなも
                のは許されない。
                数値の後ろにある文字列は黙って無視される。
                小数点数はロケールの設定にかかわらず常に '.' である。コンマを
                発見すると、そこで数値は終わりになる。つまり "12,345.67" は
                12.0 に変換される。3桁ごとのコンマ区切りを取り除くには
                substitute() が使える:
                        let f = str2float(substitute(text, ',', '', 'g'))

                method としても使用できる:
                        let f = text->substitute(',', '', 'g')->str2float()

                {+float 機能つきでコンパイルされたときのみ有効}

str2list({expr} [, {utf8}])                             str2list()
                文字列{expr}の各文字を表す数値を含むリストを返す。例:
                        str2list(" ")           returns [32]
                        str2list("ABC")         returns [65, 66, 67]
                list2str() は反対のことをする。

                {utf8}が省略されているかゼロの場合、現在の 'encoding' が使用さ
                れる。{utf8}が1の場合は、常に文字列がutf-8であるとして扱う。
                utf-8の合成文字は正しく処理される:
                        str2list("á")           returns [97, 769]

                method としても使用できる:
                        GetString()->str2list()


str2nr({expr} [, {base} [, {quoted}]])                          str2nr()
                文字列{expr}を数値に変換する。
                {base}は変換の底。2、8、10、16のいずれか。
                {quoted} が与えられ 0 以外の場合、埋め込まれた単一引用符は無視
                されるため、"1'000'000" は100万である。
                {base}を省略すると10となる。そのため、文字列の先頭に0があると
                き、デフォルトの文字列・数値変換とは異なり、8進数とは解釈され
                ない。例:
                        let nr = str2nr('0123')

                {base}が16のとき、文字列の先頭の "0x" と "0X" は無視される。そ
                れ以外の底の場合は0となる。同様に、
                {base}が8のとき、文字列の先頭の "0" と "0o" と "0O" は無視され
                る。そして、{base}が2のとき、文字列の先頭の "0b" と "0B" は無
                視される。
                数値の後のテキストは暗黙に無視される。

                method としても使用できる:
                        GetText()->str2nr()

strcharlen({expr})                                      strcharlen()
                結果は数値で、文字列 {expr} の文字の数を返す。合成文字は無視さ
                れる。
                strchars() は合成文字を別々にカウントできる。

                strlen()strdisplaywidth()strwidth() も参照。

                method としても使用できる:
                        GetText()->strcharlen()

strcharpart({src}{start} [, {len} [, {skipcc}]])              strcharpart()
                strpart() と同様だがバイトのインデックスおよび長さではなく文
                字のインデックスおよび長さを使用する。
                {skipcc} を省略するかゼロにすると、合成文字は別々にカウントさ
                れる。
                {skipcc} を 1 にすると、slice() と同様に合成文字は無視され
                る。
                文字インデックスが存在しない文字を指す場合、それは 1 つの文字
                としてカウントされるが、戻り値には現れない。例:
                        strcharpart('abc', -1, 2)
                結果は "a" である。

                method としても使用できる:
                        GetText()->strcharpart(5)


strchars({expr} [, {skipcc}])                                   strchars()
                結果は数値で、文字列 {expr} の文字の数を返す。
                {skipcc} を省略またはゼロを指定すると、合成文字は別々にカウン
                トされる。
                {skipcc} に 1 を指定すると、合成文字は無視される。
                strcharlen() では合成文字は常に無視される。

                strlen()strdisplaywidth()strwidth() も参照。

                {skipcc}は7.4.755以降でのみ有効である。それ以前では、ラッパー
                関数を定義すればよい:
                    if has("patch-7.4.755")
                      function s:strchars(str, skipcc)
                        return strchars(a:str, a:skipcc)
                      endfunction
                    else
                      function s:strchars(str, skipcc)
                        if a:skipcc
                          return strlen(substitute(a:str, ".", "x", "g"))
                        else
                          return strchars(a:str)
                        endif
                      endfunction
                    endif

strdisplaywidth({expr} [, {col}])                       strdisplaywidth()
                結果は数値で、文字列 {expr} が {col} (最初の桁はゼロ)で始まる
                時のスクリーン上での表示セル幅を返す。
                {col} が省略されたときはゼロが使われる。{col} には計算を開始す
                るスクリーン上の列の位置を指定する。これはタブ文字の幅の計算に
                影響する。
                計算にはカレントウィンドウのオプションが使用される。'tabstop'
                や 'display' のような表示を変更するようなオプションが影響す
                る。
                {expr} に幅が曖昧 (Ambiguous) な東アジアの文字が含まれていると
                きは、文字幅は 'ambiwidth' の設定に依存する。
                strlen()strwidth()strchars() も参照。

                method としても使用できる:
                        GetText()->strdisplaywidth()

strftime({format} [, {time}])                           strftime()
                結果は文字列で、{format}に従って日付や時間がフォーマットされた
                ものになる。{time}が与えられた場合にはそれを使うが、省略された
                場合には現在時刻を使用する。受け付け可能な文字列{format}は使用
                するシステムに依存するので、ポータブルとは言えない。フォーマッ
                トについてはCの関数strftime()のマニュアルを参照。結果は最大80
                文字に制限される。localtime()getftime() と strptime()
                も参照。
                ここで使われる言語はコマンド:languageで変更できる。
                例:
                  :echo strftime("%c")             Sun Apr 27 11:49:23 1997
                  :echo strftime("%Y %b %d %X")    1997 Apr 27 11:53:25
                  :echo strftime("%y%m%d %T")      970427 11:53:55
                  :echo strftime("%H:%M")          11:55
                  :echo strftime("%c", getftime("file.c"))
                                                   file.cの更新時刻を表示
                この関数はどのシステムでも利用できるとは限らない。利用できるか
                チェックするには次のようにする:
                        :if exists("*strftime")

                method としても使用できる:
                        GetFormat()->strftime()

strgetchar({str}{index})                              strgetchar()
                {str} 内の {index} 番目の文字インデックスを得る。これは文字の
                インデックスでありバイトのインデックスではない。合成文字は分割
                された文字として考慮される。
                strcharpart() と strchars() も参照。

                method としても使用できる:
                        GetText()->strgetchar(5)

stridx({haystack}{needle} [, {start}])                stridx()
                結果は数値で、{haystack}の中で文字列{needle}が最初に現れる位置
                のバイトインデックスを表す。{start}を指定すると、インデックス
                {start}の位置から検索を開始する。
                2番目のマッチを探すには次のようにする:
                        :let colon1 = stridx(line, ":")
                        :let colon2 = stridx(line, ":", colon1 + 1)
                検索は大文字・小文字を区別する。
                検索パターンについてはmatch()を使う。
                {haystack}の中に{needle}がないときは-1を返す。
                strridx()も参照。
                例:
                  :echo stridx("An Example", "Example")      3
                  :echo stridx("Starting point", "Start")    0
                  :echo stridx("Starting point", "start")   -1
                                                strstr() strchr()
                stridx()はCの関数strstr()と同じように動作する。{needle}が1文字
                のときはstrchr()と同じように動作する。

                method としても使用できる:
                        GetHaystack()->stridx(needle)

                                                        string()
string({expr})  {expr}を文字列に変換して返す。{expr}が数値、浮動小数点数、文字
                列、Blob またはそれらの複合の場合は、この戻り値を eval() で
                パースして復元できる。
                        {expr} 型       結果
                        文字列          'string' (シングルクォートは二重化され
                                        る)
                        数値            123
                        浮動小数点数    123.123456 or 1.123456e8
                        Funcref         function('name')
                        Blob            0z00112233.44556677.8899
                        リスト          [item, item]
                        辞書            {key: value, key: value}
                リスト List や辞書 Dictionary に循環参照がある場合、それら
                は "[...]" や "{...}" に置き換えられる。その結果に対して eval()
                を使用すると失敗する。
                method としても使用できる:
                        mylist->string()

                strtrans()も参照。
                                                        strlen()
strlen({expr})  結果は数値で、文字列{expr}のバイト単位での長さ。
                引数が数値の場合は、まず文字列に変換される。
                それ以外の型の場合はエラーとなる。
                マルチバイト文字の数を数える場合はstrchars()を使用する。
                len()strdisplaywidth()strwidth() も参照。

                method としても使用できる:
                        GetString()->strlen()

strpart({src}{start} [, {len} [, {chars}]])                   strpart()
                結果は文字列で、{src}{start}番目の文字から始まる、長さ{len}
                の部分文字列。
                引数 {chars} が存在し真であれば {len} は文字の位置の数字 (合成
                文字は分割して数えない、つまり "1" は基底文字1つとそれに続く合
                成文字を意味する)。
                {start} をバイト数ではなく文字数で数えるには strcharpart()
                を用いる。

                存在しない文字を含むように範囲を指定しても、エラーにはならな
                い。単に文字が省略されるだけである。
                {len}を省略すると、{start}から{src}の末尾までの部分文字列を返
                す。
                        strpart("abcdefg", 3, 2)    == "de"
                        strpart("abcdefg", -2, 4)   == "ab"
                        strpart("abcdefg", 5, 4)    == "fg"
                        strpart("abcdefg", 3)       == "defg"
                Note: 文字列の最初の文字を指定するためには、{start}は0でなけれ
                ばならない。カーソルのある位置の文字を取得する例:
                        strpart(getline("."), col(".") - 1, 1, v:true)

                method としても使用できる:
                        GetText()->strpart(5)

strptime({format}{timestring})                                strptime()
                結果は数値で、{format} で指定した書式に一致する {timestring} が
                表す日付と時刻の unix タイムスタンプを返す。

                受け入れられる {format} はシステムに依存するため、これは移植可
                能ではない! 書式は C 関数 strptime() のマニュアルページを参照
                すること。特に "%c" は避けること。$TZ の値も影響する。

                {timestring} が {format} でパースできないときは 0 が返される。
                {timestring} の書式が分からないときは、非 0 の値が返るまで、異
                なった {format} の値を試してみるとよい。

                strftime() も参照。
                例:
                  :echo strptime("%Y %b %d %X", "1997 Apr 27 11:49:23")
                  862156163
                  :echo strftime("%c", strptime("%y%m%d %T", "970427 11:53:55"))
                  Sun Apr 27 11:53:55 1997
                  :echo strftime("%c", strptime("%Y%m%d%H%M%S", "19970427115355") + 3600)
                  Sun Apr 27 12:53:55 1997

                全システムで使用可能ではない。調べるにはこれを使う:
                        :if exists("*strptime")


strridx({haystack}{needle} [, {start}])                       strridx()
                結果は数値で、{haystack}の中で文字列{needle}が最後に現れる位置
                のバイトインデックスとなる。
                {start}を指定すると、そのインデックス以降でのマッチは無視され
                る。前のマッチより前にあるものを見つけるには次のようにする:
                        :let lastcomma = strridx(line, ",")
                        :let comma2 = strridx(line, ",", lastcomma - 1)
                検索は大文字・小文字を区別する。
                検索パターンについてはmatch()を使う。
                {haystack}の中に{needle}がないときは-1を返す。
                {needle}が空文字列のときは{haystack}の長さを返す。
                stridx()も参照。例:
                  :echo strridx("an angry armadillo", "an")          3
                                                        strrchr()
                {needle}が1文字の場合はCの関数strrchr()と同じように動作する。

                method としても使用できる:
                        GetHaystack()->strridx(needle)

strtrans({expr})                                        strtrans()
                結果は文字列で、{expr}内の表示不可能な文字を'isprint'で指定
                される、表示可能な文字に変換したもの。ウィンドウに表示すること
                ができるようになる。例:
                        echo strtrans(@a)
                これはレジスタの中の改行を、改行として表示する代わりに "^@" と
                表示する。

                method としても使用できる:
                        GetString()->strtrans()

strwidth({expr})                                        strwidth()
                結果は数値で、文字列 {expr} のスクリーン上での表示セル幅を返
                す。タブ文字の幅は 1 として数えられる (タブ文字の幅も考慮した
                い場合はstrdisplaywidth() を使うこと)。
                {expr} に幅が曖昧 (Ambiguous) な東アジアの文字が含まれていると
                きは、文字幅は 'ambiwidth' の設定に依存する。
                strlen()strdisplaywidth()strchars() も参照。

                method としても使用できる:
                        GetString()->strwidth()

submatch({nr} [, {list}])                       submatch() E935
                :substitute や substitute() 関数の中の式でのみ使われる。
                マッチしたテキストの{nr} 番目の部分マッチを返す。{nr}が0のとき
                はマッチしたテキスト全体を返す。
                Note: 文字列中の NL 文字は複数行マッチにおける改行文字か、NUL
                文字のどちらかである。
                sub-replace-expression も参照。

                {list} に非ゼロの値が指定されたときは submatch() は文字列のリ
                ストを返す。getline() に 2 つの引数を指定したときの戻り値と
                同じである。テキスト中の NL 文字は NUL 文字を表す。
                :substitute で使われたときのみ複数要素のリストを返す。
                substitute() では、実際の改行はそこにはないので、リストは常
                に 0 または 1 つの要素である。

                substitute() が再帰的に使用された場合、現在の(最も深い)サブ
                マッチのみが取得できる。

                例:
                        :s/\d\+/\=submatch(0) + 1/
                        :echo substitute(text, '\d\+', '\=submatch(0) + 1', '')
                この例は、行の中で最初の数値を検索し、それに1を加える。改行は
                改行文字として含まれる。

                method としても使用できる:
                        GetNr()->submatch()

substitute({expr}{pat}{sub}{flags})               substitute()
                結果は文字列で、{expr}内で最初に{pat}にマッチした部分を{sub}
                置換えたコピーになる。
                {flags} が "g" なら、{expr} 内の {pat} にマッチした部分をすべ
                て置換する。そうしたくない場合は {flags} は "" にすべきである。

                これはコマンド ":substitute" (一切のフラグ無し) のように働く。
                しかしマッチングは常にオプション 'magic' が設定され、オプショ
                ン 'cpoptions' は空にして実行される(スクリプトをポータブルにす
                るため)。'ignorecase' は適用される。'ignorecase' の設定にかか
                わらず大文字小文字を区別するかしないか固定するには /\c か
                /\C を使う。'smartcase' は適用されない。{pat}がどう扱われる
                かについてはstring-matchを参照。

                また、{sub}内の "~" は前回の{sub}に置換されない。
                {sub}内の幾つかのコードにはsub-replace-specialの特殊な意味が
                あることに注意。例えば、何かの文字列をリテラルの "\n" に置換え
                るためには、"\\\\n" か '\\n' を使う必要がある。

                {pat}{expr}の何処にもマッチしなければ、{expr}が何の変更も受
                けずに返される。

                例:
                   :let &path = substitute(&path, ",\\=[^,]*$", "", "")
                これはオプション 'path' の最後のコンポーネントを削除する。
                   :echo substitute("testing", ".*", "\\U\\0", "")
                結果は "TESTING" となる。

                {sub} が "\=" で開始している場合は、その後ろの文字列は式として
                解釈される。sub-replace-expression 参照。例:
                   :echo substitute(s, '%\(\x\x\)',
                           \ '\=nr2char("0x" . submatch(1))', 'g')

                {sub} が関数リファレンスの場合、1個のオプショナル引数と共にそ
                の関数が呼び出される。例:
                   :echo substitute(s, '%\(\x\x\)', SubNr, 'g')
                オプショナル引数はマッチ文字列全体と9個のサブマッチが含まれる
                以下の submatch() が返す様なリストである。例:
                   :echo substitute(s, '%\(\x\x\)', {m -> '0x' . m[1]}, 'g')

                method としても使用できる:
                        GetString()->substitute(pat, sub, flags)

swapinfo({fname})                                       swapinfo()
                結果は、スワップファイル {fname} に関する情報を含む辞書。利用
                可能なフィールドは以下のとおり:
                        version Vim バージョン
                        user    ユーザー名
                        host    ホスト名
                        fname   オリジナルファイルの名前
                        pid     スワップファイルを作成した Vim プロセスの PID
                        mtime   秒単位での最終修正時間
                        inode   オプショナル: ファイルの INODE 番号
                        dirty   ファイルが修正されていれば 1、そうでなければ 0
                Note: "user" および "host" は最大で 39 バイトに切り詰められる。
                失敗した場合、以下の理由と共に "error" 項目が追加される:
                        Cannot open file: ファイルが見つからない、もしくはアク
                                          セス不可
                        Cannot read file: 先頭ブロックが読めない
                        Not a swap file: 正しいブロック ID を含んでいない
                        Magic number mismatch: 先頭ブロックの情報が無効である

                method としても使用できる:
                        GetFilename()->swapinfo()

swapname({expr})                                        swapname()
                結果はバッファ {expr} のスワップファイルパス。
                {expr} の使用については、上記の bufname() を参照。
                バッファ {expr} がカレントバッファの場合、結果は :swapname
                と等しい。(スワップファイルがない場合を除く)
                バッファ {expr} にスワップファイルがない場合、空文字列を返す。

                method としても使用できる:
                        GetBufname()->swapname()

synID({lnum}{col}{trans})                           synID()
                結果は数値で、現在のウィンドウ内での位置{lnum}{col}の位置の
                構文ID。
                構文IDはsynIDattr()synIDtrans()に渡すことで、テキストに
                ついての構文情報を取得するのに使用できる。

                最左のカラムを指定するには{col}に1を、最初の行を指定するには
                {line}に1を指定する。'synmaxcol' が適用され、長すぎる行では0が
                返ってくる。
                Note 挿入モードでカーソル位置を最後の文字より後ろにした場合、
                synID()は0を返す。{lnum}getline()と同様に扱われる。

                {trans}TRUEならば、透過属性のアイテムは省略され、実際に表
                示されているアイテムが評価対象になる。これは実際に有効になって
                いるカラーを知りたい時に役に立つ。{trans}FALSEならば、透過
                属性のアイテムが返される。これはどの構文アイテムが有効になって
                いるかを知りたい時に役に立つ(例:カッコの中とか)。
                警告: この関数は非常に遅い。ファイルを順方向に走査する時にだけ
                ベストなスピードが得られる。

                例(カーソルの下の構文アイテムの名前を表示する):
                        :echo synIDattr(synID(line("."), col("."), 1), "name")


                                                        synIDattr()
synIDattr({synID}{what} [, {mode}])
                結果は文字列で、{synID}の属性{what}の内容を示す。これは構文
                アイテムの情報を取得するのに使用できる。
                {mode}には取得したいモードの属性に応じて、"gui" か "cterm" か
                "term" が指定できる。{mode}が省略されるか、無効な値が指定され
                た場合、現在有効になっているハイライトモードが使用される (GUI、
                cterm、termのどれか)。
                ハイライトグループにリンクされた属性を取得するにはsynIDtrans()
                を使用する。
                {what}          結果
                "name"          構文アイテムの名前
                "fg"            前景色(GUI:カラー名、cterm:文字列としてのカ
                                ラー番号、term空文字列)
                "bg"            背景色("fg" 同様)
                "font"          フォント名 (GUI でのみ利用可)
                                highlight-font
                "sp"            GUIでの特殊な色 ("fg" 同様) highlight-guisp
                "ul"            ctermで下線の色:文字列としてのカラー番号
                "fg#"           "fg" 同様だが、"#RRGGBB" のフォーマットで
                "bg#"           "bg" 同様だが、"#RRGGBB" のフォーマットで
                "sp#"           "sp" 同様だが、"#RRGGBB" のフォーマットで
                "bold"          太字なら "1"
                "italic"        斜体なら "1"
                "reverse"       反転なら "1"
                "inverse"       反転(原文inverse)なら "1" (reverseと等価)
                "standout"      強調 (standout) なら "1"
                "underline"     下線付きなら "1"
                "undercurl"     波線付きなら "1"
                "strike"        取り消し線付きなら "1"

                例(カーソルの下の構文アイテムのカラーを表示する):
        :echo synIDattr(synIDtrans(synID(line("."), col("."), 1)), "fg")

                method としても使用できる:
        :echo synID(line("."), col("."), 1)->synIDtrans()->synIDattr("fg")


synIDtrans({synID})                                     synIDtrans()
                結果は数値で、{synID}を構文IDに変換したもの。キャラク
                タをハイライト表示している構文グループのIDである。
                ":highlight link" によって与えられるハイライトのリンクはこれに
                従っている。

                method としても使用できる:
        :echo synID(line("."), col("."), 1)->synIDtrans()->synIDattr("fg")

synconcealed({lnum}{col})                             synconcealed()
                結果は現状 3 つのアイテムを含むリスト List である。
                1. リストの 1 番目のアイテムは、{lnum} と {col} が指す位置の文
                   字が Conceal 可能リージョンの中にあるなら 1、そうでないなら
                   0。{lnum}getline()と同様に扱われる。
                2. リストの 2 番目のアイテムは文字列で、最初のアイテムが 1 な
                   ら、Conceal されたテキストの代わりに表示されるテキストが入
                   る (実行時の'conceallevel' および 'listchars' の設定に依
                   存)。
                3. リストの 3 番目の最後のアイテムは、行内でどのシンタックス
                   リージョンにマッチしたかを示す番号。その文字が Conceal され
                   ていない場合、この値は 0 である。これは同じ置換文字を持つ 2
                   つの Concela 可能リージョンが連続していた場合に、その区切り
                   を識別できるようにするため。テキストが "123456"で、"23" と
                   "45" の両方が Conceal されて文字 "X" に置き換えられていた場
                   合の例:
                        call                    returns
                        synconcealed(lnum, 1)   [0, '', 0]
                        synconcealed(lnum, 2)   [1, 'X', 1]
                        synconcealed(lnum, 3)   [1, 'X', 1]
                        synconcealed(lnum, 4)   [1, 'X', 2]
                        synconcealed(lnum, 5)   [1, 'X', 2]
                        synconcealed(lnum, 6)   [0, '', 0]


synstack({lnum}{col})                                 synstack()
                カレントウィンドウの {lnum}{col} の位置の構文アイテムのスタッ
                クを List にして返す。{lnum}getline()と同様に扱われる。
                このリストの要素は synID()が返すのと同じ種類の ID である。
                リストの最初の要素が一番外側の領域で、続く要素がその中に内包さ
                れている。アイテム全体がハイライトされている、または最後の要素
                が transparent なアイテムである場合を除き、最後の要素が
                synID() が返すものである。
                この関数は構文ファイルをデバッグするのに役に立つ。
                例(カーソル下の構文スタックを表示する):
                        for id in synstack(line("."), col("."))
                           echo synIDattr(id, "name")
                        endfor
                {lnum} と {col} が不正な場所を指しているときは戻り値なし。行の
                最後の文字の一つ後ろと空行の一番目の列は有効な位置である。

system({expr} [, {input}])                              system() E677
                シェルコマンド {expr} の実行結果を文字列として得る。リスト
                List として受け取るには systemlist() を参照。

                {input} に文字列が指定された場合、その文字列はファイルに書き出
                され、コマンドの標準入力として渡される。この文字列はそのまま
                (as-is) 書き出されるので、正しい改行文字を使うよう自分自身で気
                をつけなければならない。
                {input} にリスト (List) が指定された場合は、writefile() の
                {binary} に "b" を指定したのと同様にファイルに書き出される (つ
                まり、リストの各要素は改行文字で連結され、要素内の改行文字は
                NUL 文字に変換される)。
                {input} が指定され、それが数値で既存のバッファとして有効な id
                であるならば、そのバッファの内容が 1 行ずつファイルに書き出さ
                れる。それぞれの行は NL で終端され、テキスト中の NL は NUL 文
                字に置き換えられる。

                パイプは使用されず、'shelltemp' オプションは使用されない。

                :silent が前置されたときは、端末は cooked モードには設定され
                ない。これはユーザー入力を必要としないコマンドを使用することを
                意味する。これは画面に不要な文字が表示されるのを防ぐ (CTRL-L
                でそれをクリアする必要がなくなる)。
                        :silent let f = system('ls *.vim')

                Note: コマンドの引数をエスケープするには、 shellescape()
                expand() の ::S、または fnamemodify() を使用する。{expr}
                内に改行文字があるとコマンドは失敗するだろう。'shellquote' や
                'shellxquote' 内にある文字も問題を起こすかもしれない。
                対話的なコマンドを使用することはできない。

                戻り値は文字列。例:
                    :let files = system("ls " .  shellescape(expand('%:h')))
                    :let files = system('ls ' . expand('%:h:S'))

                システムに依存しないような戻り値にするために、シェルの出力を
                フィルタリングし、マッキントッシュにおいては<CR><NL>に変換
                し、DOS系のシステムにおいては<CR><NL><NL>に変換している。
                文字列が NUL 文字で切れるのを防ぐため、すべての NUL 文字は SOH
                (0x01) に置換される。

                実行されるコマンドはいくつかのオプションを適用して構成される:
        'shell' 'shellcmdflag' 'shellxquote' {expr} 'shellredir' {tmp} 'shellxquote'
                ({tmp}は自動的に生成されるファイル名)
                Unixではコマンドの連結ができるように{expr}の両側に波括弧が置か
                れる。

                コマンドは「cooked」モードで実行される。そのためCTRL-Cでコマン
                ドを中断できる(少なくともUnixでは)。

                エラーコードはv:shell_errorに格納される。
                この関数はrestricted-modeでは失敗する。

                Note 上記のオプションに不正な値が入っていると、この関数の呼び
                出しが失敗する可能性がある。セキュリティエージェントアプリケー
                ションを使っていると失敗することがあるとも報告されている。
                ":!cmd" とは違い、ファイルが変更されているかのチェックは行わな
                い。
                明示的にチェックさせるには:checktimeを使う。

                method としても使用できる:
                        :echo GetCmd()->system()

systemlist({expr} [, {input}])                          systemlist()
                system() と同じだが行のリスト (List) を返す。行は NL 文字
                で区切られ、NUL 文字は NL 文字に変換される。出力は
                readfile() の {binary} 引数に "b" を指定したのと同様である。
                ただし、結果が NL で終わる場合、余分な空の項目はない。
                Note MS-Windows では末尾の CR 文字がつくかもしれないことに注
                意。

                "echo hello" と "echo -n hello" の違いを確認するには、
                system() および split() を使用する:
                        echo system('echo hello')->split('\n', 1)

                エラー時には空文字列が返る。

                method としても使用できる:
                        :echo GetCmd()->systemlist()


tabpagebuflist([{arg}])                                 tabpagebuflist()
                カレントタブページ内の各ウィンドウに表示されているバッファの番
                号を要素とするリストListを返す。{arg}は対象とするタブページ
                の番号を指定する。省略したときはカレントタブページを対象とする。
                {arg}が無効なときは数値0を返す。
                全タブページ中の全バッファのリストを得るには次のようにする:
                        let buflist = []
                        for i in range(tabpagenr('$'))
                           call extend(buflist, tabpagebuflist(i + 1))
                        endfor
                Note 1つのバッファが複数のウィンドウに表示されている場合がある
                ことに注意。

                method としても使用できる:
                        GetTabpage()->tabpagebuflist()

tabpagenr([{arg}])                                      tabpagenr()
                結果は数値で、カレントタブページの番号。最初のタブページの番号
                は1となる。

                省略可能な引数{arg}は以下の値をサポートする:
                        $       最後のタブページの番号(つまりタブページの個
                                数)。
                        #       最後に利用したタブページの番号(g<Tab> で移動
                                できる)。前のタブページが無い場合は 0 を返す。
                この番号はコマンド:tabで指定できるものと同じである。


tabpagewinnr({tabarg} [, {arg}])                        tabpagewinnr()
                winnr()と同様だが、タブページ{tabarg}を対象とする。
                {tabarg}は対象とするタブページの番号を指定する。
                {arg}winnr()の場合と同じように扱われる。すなわち:
                - 省略するとカレントウィンドウの番号を返す。これは、このタブ
                  ページに入るとき使われるウィンドウである。
                - "$" とするとウィンドウの個数を返す。
                - "#" とすると前のウィンドウ番号を返す。
                役に立つ例:
                    tabpagewinnr(1)         " タブページ1のカレントウィンドウ
                    tabpagewinnr(4, '$')    " タブページ4内のウィンドウの個数
                {tabarg}が無効なときは0を返す。

                method としても使用できる:
                        GetTabpage()->tabpagewinnr()

                                                        tagfiles()
tagfiles()      カレントバッファにおいて、タグを検索するときに使うファイルの名
                前からなるリストListを返す。オプション 'tags' を展開したもので
                ある。


taglist({expr} [, {filename}])                          taglist()
                正規表現 {expr} にマッチするタグのリスト List を返す。

                {filename} が渡された場合、:tselect と同じ方法で結果を優先順
                位付けするために使われる。tag-priority を参照。
                {filename} はファイルの絶対パスでなければならない。

                そのリストの各要素は辞書であり、少なくとも次の要素を持つ:
                        name            タグの名前。
                        filename        タグの定義があるファイルの名前。カレン
                                        トディレクトリからの相対パス、またはフ
                                        ルパスである。
                        cmd             そのファイルの中でタグの位置を特定する
                                        ために使うexコマンド。
                        kind            タグの種類。種類は言語に依存する。この
                                        要素は、Exuberant ctagsかhdrtagによっ
                                        て生成されたタグファイルを使っていると
                                        きのみ使用できる。
                        static          ファイル固有のタグ。より詳しくは
                                        static-tagを参照。
                タグファイルの内容によってはこれ以上の要素が存在することもある。
                例: アクセス、実装、継承、シグネチャ。これらのフィールドについ
                ての情報はctagsのドキュメントを参照。Cのソースにおいては、
                フィールド "struct"、"class"、"enum" が現れることがある。これ
                らは、タグを含んでいるものの名前を示す。

                exコマンド "cmd" は検索パターンか、行番号か、行番号とバイト番
                号のいずれかである。

                マッチするタグがない場合は空リストを返す。

                完全一致するタグを取得するには、{expr}にアンカー '^' と '$' を
                つけること。これは関数の動作を速くすることにもなる。タグ検索の
                正規表現についてより詳しいことは tag-regexpを参照。

                Vimが使用するタグファイルについては 'tags' を参照。様々な
                ctagsによって生成されるタグファイルのフォーマットについては
                tags-file-formatを参照。

                method としても使用できる:
                        GetTagpattern()->taglist()

tan({expr})                                             tan()
                {expr} の正接 (タンジェント) をラジアンで返す。
                値は [-inf, inf] の範囲の浮動小数点数 (Float)。
                {expr} は浮動小数点数 (Float) か数値 (Number) でなければな
                らない。
                例:
                        :echo tan(10)
                        0.648361
                        :echo tan(-4.01)
                        -1.181502

                method としても使用できる:
                        Compute()->tan()

                {+float 機能を有効にしてコンパイルしたときのみ有効}


tanh({expr})                                            tanh()
                {expr} の双曲線正接 (ハイパボリックタンジェント) を返す。
                値は [-1, 1] の範囲の浮動小数点数 (Float)。
                {expr} は浮動小数点数 (Float) か数値 (Number) でなければな
                らない。
                例:
                        :echo tanh(0.5)
                        0.462117
                        :echo tanh(-1)
                        -0.761594

                method としても使用できる:
                        Compute()->tanh()

                {+float 機能を有効にしてコンパイルしたときのみ有効}


                                                tempname() temp-file-name
tempname()
                結果は文字列で、存在しないファイルのファイル名を示す。これはテ
                ンポラリファイルの名前として使用可能である。少なくとも連続26回
                の呼出しまでは違う名前を生成することが保証される。例:
                        :let tmpfile = tempname()
                        :exe "redir > " . tmpfile
                Unix では、ファイルはプライベートなディレクトリに置かれる。
                tempfile
                MS-Windowsでは、'shellslash' がオンのときか、'shellcmdflag' が
                '-' で始まり 'shell' が powershell か pwsh を含まない時はスラッ
                シュが使われる。

term_ 関数群はここに文書化されている: terminal-function-details


terminalprops()                                         terminalprops()
                Vimが t_RV 問い合せの応答から検知した端末のプロパティを辞書
                Dictionary として返す。応答自体は v:termresponse を参照。
                もし v:termresponse が空の時はここにある多くの値は不明を表す
                'u' になる。
                   cursor_style         t_RS を送って動くか **
                   cursor_blink_mode    t_RC を送って動くか **
                   underline_rgb        t_8u が動くか **
                   mouse                サポートするマウスのタイプ

                ** 不明ならば値 'u'、はいで 'y'、いいえで 'n'

                +termresponse 機能が無いならば、結果は空の辞書になる。

                "cursor_style" が 'y' の時、t_RS で現在のカーソルのスタイル
                の問い合せが送られる。
                "cursor_blink_mode" が 'y' の時、t_RC でカーソルの点滅のス
                テータスの問い合せが送られる。
                "cursor_style" と "cursor_blink_mode" はまた t_u7 が空でな
                く、Vim が起動時に t_RS と t_RC を送って動くか検知すること
                でも設定される。

                "underline_rgb" が 'y' でない時に、t_8u は空になる。これはそ
                れを xterm に送ってしまうことで、色をクリアするのを回避する。

                "mouse" の 'u' は不明なときになる。

                以下も参照:
                - 'ambiwidth' - t_u7 を使って検知する。
                - t_RS と t_RC の応答については v:termstyleresp と
                  v:termblinkresp を参照。


test_ 関数群はここに文書化されている: test-functions-details

                                                        timer_info()
timer_info([{id}])
                タイマーに関する情報のリストを返す。
                {id} が指定された場合はそのタイマーに関する情報だけが返され
                る。タイマー {id} が存在しない場合は空のリストが返される。
                {id} が省略された場合は全てのタイマーに関する情報が返される。

                各タイマーの情報は以下の項目を含んだ辞書 Dictionary で格納さ
                れる:
                    "id"            タイマーのID
                    "time"          タイマーが開始してからの時間
                    "remaining"     タイマーが発火するまでの時間
                    "repeat"        何回タイマーを発火させるかの回数;
                                    -1 は無限を意味する
                    "callback"      コールバック
                    "paused"        タイマーが一時停止中なら 1、それ以外は 0

                method としても使用できる:
                        GetTimer()->timer_info()

                {+timers 機能を有効にしてコンパイルしたときのみ有効}

timer_pause({timer}{paused})                          timer_pause()
                タイマーを一時停止もしくは再開する。一時停止したタイマーは時間
                が経過してもコールバックを呼び出さない。タイマーの再開は十分
                に時間が経過しているなら、すぐさまコールバックが呼び出されるか
                もしれない。

                タイマーの停止は少しの間、コールバックが呼び出されるのを避ける
                のに便利である。

                {paused} が 0 以外の数値、もしくは空でない文字列で評価される
                場合にタイマーが停止し、それ以外は再開する。
                non-zero-arg を参照。

                method としても使用できる:
                        GetTimer()->timer_pause(1)

                {+timers 機能を有効にしてコンパイルしたときのみ有効}

                                                timer_start() timer timers
timer_start({time}{callback} [, {options}])
                タイマーを作成しその ID を返す。

                {time} はミリ秒での待機時間。これはコールバックが呼び出される
                までの最短の時間である。システムがビジーもしくは Vim が入力待
                ちでない場合、これは長くなる。

                {callback} は呼び出す関数。関数の名前もしくはFuncrefであって
                も良い。引数にはタイマーIDの引数が1つだけ渡されて呼び出され
                る。コールバックは Vim が入力待ちの場合だけ呼び出される。
                メッセージの表示を望むなら、popup_notification() を見てユー
                ザーの入力との干渉を回避すること。

                {options} は辞書。以下がサポートされている:
                   "repeat"     コールバックを呼び出す繰り返し回数。-1 は無限
                                を意味する。指定されない場合はコールバックは一
                                度だけ呼び出される。
                                タイマーが 3 回連続してエラーを発生させた場合、
                                繰り返しはキャンセルされる。これは、すべてのエ
                                ラーメッセージによって Vim が使用不可になるの
                                を防ぐ。

                例:
                        func MyHandler(timer)
                          echo 'Handler called'
                        endfunc
                        let timer = timer_start(500, 'MyHandler',
                                \ {'repeat': 3})
                これは MyHandler() を 500ms 間隔で3回呼び出す。

                method としても使用できる:
                        GetMsec()->timer_start(callback)

                sandbox では利用できない。
                {+timers 機能を有効にしてコンパイルしたときのみ有効}

timer_stop({timer})                                     timer_stop()
                タイマーを停止する。タイマーのコールバックは以降呼び出されな
                い。{timer} は timer_start() が返した ID である。よって数値で
                なければならない。{timer} が存在しなかった場合でもエラーは発生
                しない。

                method としても使用できる:
                        GetTimer()->timer_stop()

                {+timers 機能を有効にしてコンパイルしたときのみ有効}

timer_stopall()                                         timer_stopall()
                全てのタイマーを停止する。タイマーのコールバックは以降呼び出さ
                れない。タイマーが不作法に振る舞う場合に便利である。タイマーが
                存在しなかった場合でもエラーは発生しない。

                {+timers 機能を有効にしてコンパイルしたときのみ有効}

tolower({expr})                                         tolower()
                引数の文字列の大文字を小文字に変換してできた文字列を返す(文字
                列にguを適用するのとちょうど同じ)。

                method としても使用できる:
                        GetText()->tolower()

toupper({expr})                                         toupper()
                引数の文字列の小文字を大文字に変換してできた文字列を返す(文字
                列にgUを適用するのとちょうど同じ)。

                method としても使用できる:
                        GetText()->toupper()

tr({src}{fromstr}{tostr})                           tr()
                文字列{src}の中で、{fromstr}に含まれる全ての文字を{tostr}の対
                応する文字で置き換えた文字列を返す。つまり、{fromstr}の最初の
                文字が{tostr}の最初の文字に置き換えられる。2文字目以降も同様。
                Unixのコマンド "tr" とちょうど同じである。
                マルチバイト文字も正しく扱える。

                例:
                        echo tr("hello there", "ht", "HT")
                戻り値は "Hello THere" となる。
                        echo tr("<blob>", "<>", "{}")
                戻り値は "{blob}" となる。

                method としても使用できる:
                        GetText()->toupper()

trim({text} [, {mask} [, {dir}]])                               trim()
                {text} の先頭と/もしくは末尾から、{mask} 内のすべての文字を取
                り除いた文字列を返す。

                {mask} が与えられない場合、{mask} はタブ、空白、NL および CR
                を含む 0x20 までのすべての文字と、ノーブレークスペース文字の
                0xa0 となる。

                オプショナル引数 {dir} は削除する文字の位置を示す:
                        0       {text} の先頭と末尾から削除する
                        1       {text} の先頭のみから削除する
                        2       {text} の末尾のみから削除する
                省略した場合は両端を切り取る。

                この関数はマルチバイト文字を正しく扱える。

                例:
                        echo trim("   some text ")
                "some text" を返す
                        echo trim("  \r\t\t\r RESERVE \t\n\x0B\xA0") . "_TAIL"
                "RESERVE_TAIL" を返す
                        echo trim("rm<Xrm<>X>rrm", "rm<>")
                "Xrm<>X" を返す (中央部分の文字は取り除かれない)
                        echo trim("  vim  ", " ", 2)
<               "  vim" を返す

                method としても使用できる:
                        GetText()->trim()

trunc({expr})                                                   trunc()
                {expr} をゼロ方向に切りつめた整数を Float で返す。
                {expr} は Float または Number に評価されなければならない。
                例:
                        echo trunc(1.456)
                        1.0 
                        echo trunc(-5.456)
                        -5.0 
                        echo trunc(4.0)
                        4.0

                method としても使用できる:
                        Compute()->trunc()

                {+float 機能つきでコンパイルされたときのみ有効}

                                                        type()
type({expr})    {expr}の型を示す数値を返す。
                マジックナンバーを使わずに、v:t_ 変数を使う方が良い。それぞれ
                の値は以下の通り:
                        数値:         0  v:t_number
                        文字列:       1  v:t_string
                        Funcref:      2  v:t_func
                        リスト:       3  v:t_list
                        辞書:         4  v:t_dict
                        浮動小数点数: 5  v:t_float
                        真偽値:       6  v:t_bool (v:false と v:true)
                        特殊値:       7  v:t_none (v:null と v:none)
                        ジョブ:       8  v:t_job
                        チャネル:     9  v:t_channel
                        Blob:        10  v:t_blob
                後方互換性のためには、次のような使い方ができる:
                        :if type(myvar) == type(0)
                        :if type(myvar) == type("")
                        :if type(myvar) == type(function("tr"))
                        :if type(myvar) == type([])
                        :if type(myvar) == type({})
                        :if type(myvar) == type(0.0)
                        :if type(myvar) == type(v:false)
                        :if type(myvar) == type(v:none)
                v:t_ 変数が存在するかを判定するにはこれを使う:
                        :if exists('v:t_number')

                method としても使用できる:
                        mylist->type()


typename({expr})                                        typename()
                {expr} の型について表す文字列を返す。
                例:
                        echo typename([1, 2, 3])
                        list<number>


undofile({name})                                        undofile()
                {name} という名前のファイルの保存時に使用されるアンドゥファイ
                ルの名前を返す。'undodir' オプションが使用され、存在するディレ
                クトリが検索される。アンドゥファイルが存在するかどうかはチェッ
                クされない。
                {name} は常に絶対パスに展開される (内部では絶対パスを使ってい
                るため)。
                {name} が空の場合 undofile() は空文字列を返す。ファイル名のな
                いバッファはアンドゥファイルを書かないからである。
                :wundo や :rundo と組み合わせて使うと便利だろう。
                +persistent_undo オプションを無効にしてコンパイルされた場合
                はこの関数は常に空文字列を返す。

                method としても使用できる:
                        GetFilename()->undofile()

undotree()                                              undotree()
                アンドゥツリーの現在の状態を辞書で返す。辞書の内容は次のとお
                り:
                  "seq_last"    使用されたアンドゥシーケンス番号の最大値。
                  "seq_cur"     アンドゥツリーの現在のシーケンス番号。いくつか
                                の変更がアンドゥされた状態だと "seq_last" と違
                                う値になる。
                  "time_cur"    最後に :earlier 系のコマンドが使われた時間。
                                読みやすい形式に変換するには strftime() を使
                                う。
                  "save_last"   最後にファイルが保存された番号。保存がまだなら
                                ゼロになる。
                  "save_cur"    アンドゥツリー内の現在位置の番号。
                  "synced"      最後のアンドゥブロックが同期されていれば非ゼ
                                ロ。これはユーザーからの入力を待機しているとき
                                に起こる。undo-blocks 参照。
                  "entries"     アンドゥブロックの情報を表す辞書のリスト。

                "entries" リストの 1 番目にはもっとも古いアンドゥアイテムが入っ
                ている。リストの各アイテムは次のような情報を持った辞書
                Dictionary である:
                  "seq"         アンドゥシーケンス番号。:undolist で表示され
                                るものと同じ。
                  "time"        変更が起こった時間。読みやすい形式に変換するに
                                は strftime() を使う。
                  "newhead"     この項目は最後に追加されたアイテムにのみある。
                                これは最後の変更を示し、次の変更を追加する場所
                                を示す。
                  "curhead"     この項目は最後にアンドゥされたアイテムにのみあ
                                る。これはアンドゥツリーの現在位置を示し、次に
                                リドゥコマンドによって使われるブロックを示す。
                                最後に変更を加えてからアンドゥを一度も実行して
                                いないときはこの項目はどこにも現れない。
                  "save"        この項目はファイルが保存される前の最後のブロッ
                                クにのみある。番号は保存回数を示す。最初の保存
                                は 1 で、最後のものは "save_last" と同じ。
                  "alt"         切り替えエントリ。同じアンドゥブロックのリスト
                                が入れ子にされている。それぞれのアイテムはさら
                                に "alt" アイテムを持っていることがある。

uniq({list} [, {func} [, {dict}]])                      uniq() E882
                {list} 内の隣接する同じ値の要素の 2 個目以降をその場で
                (in-place) 削除する。{list} を返す。リストを変更したくない場合
                は事前にコピーする:
                        :let newlist = uniq(copy(mylist))
                デフォルトの比較関数は各要素の文字列表現を使う。{func} と
                {dict} については sort() 参照。

                method としても使用できる:
                        mylist->uniq()

values({dict})                                          values()
                {dict}の全ての値からなるリストListを返す。このリストの順序は
                不定である。items() と values() も参照。

                method としても使用できる:
                        mydict->values()

virtcol({expr})                                         virtcol()
                結果は数値で、{expr}で与えられるファイルの位置の、スクリーン上
                での桁の位置を示す。返る値は、指定された位置にある文字の末尾が、
                スクリーン座標(の桁)でどこに存在するかである。<Tab>(タブ文字)
                が指定した位置にあった場合には、戻り値はそのタブの最後のカラム
                (桁)位置になる。具体的に、'ts' が8に設定された状態で第1桁に
                <Tab>があった場合、戻り値は8になる。conceal は無視される。
                バイト位置については col() を使う。
                {expr}の解釈の仕方についてはcol()を参照。
                'virtualedit' がオンのときは[lnum, col, off]というリストを指定
                することもできる。"off" は文字の開始位置からのスクリーン座標で
                のオフセットである。例えば、<Tab>の中の位置や、行の最後の文字
                以降の位置を示すために使う。"off" が省略された場合はゼロが使わ
                れる。
                現在のモードに対して仮想編集がオンのときは、行末を越えた位置が
                返ってくることもある。'virtualedit'
                可能な位置指定:
                    .       カーソルの位置
                    $       カーソル行の末尾(カーソル行に表示されている文字数
                            +1となる)
                    'x      マークxの位置(マークが設定されていない場合、0が返
                            る)
                    v       ビジュアルモードでは: ビジュアル選択領域の開始行
                            (カーソルがその端)。ビジュアルモード以外ではカーソ
                            ル位置を返す。すぐに更新される点が '< と違う。
                現在のファイルに対して設定されているマークだけが使用可能なこと
                に注意。
                例:
  virtcol(".")     "foo^Lbar" の "^L" の位置にカーソル、戻り値5
  virtcol("$")     "foo^Lbar" に対し、戻り値9
  virtcol("'t")    "    there" の 'h' に 't を設定、戻り値6
                最初の桁は1となる。エラーの場合は0が返る。
                より高度な例(全ての行の長さの最大値を返す):
                    echo max(map(range(1, line('$')), "virtcol([v:val, '$'])"))

                method としても使用できる:
                        GetPos()->virtcol()


visualmode([{expr}])                                            visualmode()
                結果は文字列で、カレントバッファ内で最後に使われたビジュアル
                モードを教えてくれる。初期状態では単に空文字列を返すだけだが、
                一度でもビジュアルモードが使われた場合、その種類によって "v"
                か "V" か "<CTRL-V>" (CTRL-Vの文字が1文字で) 返される。これは
                それぞれ文字選択、行選択、矩形選択を意味している。
                例:
                        exe "normal " . visualmode()
                これは最後に使われたのと同じビジュアルモードに入る。また、スク
                リプトの動作を、最後に使われたビジュアルモードに応じて変更した
                い場合にも便利だろう。
                ビジュアルモードにいるときは mode() を使ってビジュアルモード
                の種類を取得できる。(:vmap などの中などで)
                {expr}に0以外の数値か空文字列以外の文字列を指定した場合は、ビ
                ジュアルモードがクリアされ、以前の値を返す。non-zero-arg を
                参照。

wildmenumode()                                  wildmenumode()
                wildmenuが有効な場合はTRUEを返し、そうでなければFALSEを返
                す。'wildmenu' と 'wildmode' を参照。
                マッピングの中で 'wildcharm' オプションを有効に扱うために使用
                できる。(mapmode-cマッピングの場合のみ意味をなす。)

                例えば、wildmodeで<c-j><down>と同じように動作するようにする
                には:
    :cnoremap <expr> <C-j> wildmenumode() ? "\<Down>\<Tab>" : "\<c-j>"

                (Note 'wildcharm' オプションが適切に設定されている必要がある。)

win_execute({id}{command} [, {silent}])               win_execute()
                execute() と似ているが、ウィンドウ {id} のコンテキスト内で実
                行する。
                自動コマンドを発生させずに、ウィンドウを一時的にカレントウィン
                ドウにする。{command} を実行すると、自動コマンドがトリガーされ
                る。これは予期しない副作用を引き起こす可能性がある。必要であれ
                ば :noautocmd を使用すること。
                例:
                        call win_execute(winid, 'set syntax=python')
                setwinvar() で同じことをしても自動コマンドはトリガーされず、
                実際には構文ハイライトは表示されない。

                                                        E994
                すべてのコマンドがポップアップウィンドウで許可されているわけで
                はない。
                ウィンドウ {id} が存在しない場合、エラーは発生せず空の文字列を
                返す。

                method としても使用でき、ベースは第2引数として渡される:
                        GetCommand()->win_execute(winid)

win_findbuf({bufnr})                                    win_findbuf()
                バッファ {bufnr} が含まれているウィンドウについて window-ID
                のリスト List を返す。存在しない場合は空のリストになる。

                method としても使用できる:
                        GetBufnr()->win_findbuf()

win_getid([{win} [, {tab}]])                            win_getid()
                特定のウィンドウに関する window-IDを得る。
                {win} が未指定の時は現在のウィンドウとなる。
                この {win} はウィンドウ番号である。トップウィンドウは番号 1 を
                持つ。
                {tab} が未指定の場合現在のタブが使用され、{tab} が番号で指定さ
                れた場合はそのタブとなる。最初のタブ番号は 1 である。
                ウィンドウが見付からない場合には 0 を返す。

                method としても使用できる:
                        GetWinnr()->win_getid()


win_gettype([{nr}])                                     win_gettype()
                ウィンドウの種別を返す:
                        "autocmd"       自動コマンドのウィンドウ。自動コマンド
                                        を実行するに使う一時的なウィンドウ。
                        "command"       コマンドラインウィンドウ cmdwin
                        (empty)         通常のウィンドウ
                        "loclist"       location-list-window
                        "popup"         ポップアップウィンドウ popup
                        "preview"       プレビューウィンドウ preview-window
                        "quickfix"      quickfix-window
                        "unknown"       ウィンドウ{nr}が見付からない

                {nr} を省略した場合は現在のウィンドウの種別を返す。
                {nr} が与えられた場合はそのウィンドウ番号または window-ID の
                種別を返す。

                'buftype' オプションも参照すること。ポップアップウィンドウ上で
                ターミナルが起動している場合、'buftype' は "terminal" であり、
                win_gettype() は "popup" を返す。


win_gotoid({expr})                                      win_gotoid()
                {expr} の ID で示されるウィンドウへ移動する。これは現在のタブ
                ページも移動する。
                成功した場合は真を、ウィンドウが見付からない場合は偽を返す。

                method としても使用できる:
                        GetWinid()->win_gotoid()

win_id2tabwin({expr})                                   win_id2tabwin()
                {expr} の ID で示されるタブ番号とウィンドウ番号のリストを返す:
                [tabnr, winnr]
                ウィンドウが見付からなかった場合は [0, 0] を返す。

                method としても使用できる:
                        GetWinid()->win_id2tabwin()

win_id2win({expr})                                      win_id2win()
                {expr} の ID で示されるウィンドウのウィンドウ番号を返す。
                現在のタブページ内でそのウィンドウが見付からなかった場合は 0
                を返す。

                method としても使用できる:
                        GetWinid()->win_id2win()

win_screenpos({nr})                                     win_screenpos()
                ウィンドウ {nr} のスクリーン位置を 2 つの数値のリストで返す:
                [row, col]。タブラインがない限り先頭のウィンドウは常に [1, 1]
                の位置となり、タブラインがある場合は [2, 1] となる。
                {nr} にはウィンドウ番号もしくは window-ID を指定する。現在の
                ウィンドウには0を使う。
                現在のタブページに対象のウィンドウが見つからない場合、[0, 0]を
                返す。

                method としても使用できる:
                        GetWinid()->win_screenpos()

win_splitmove({nr}{target} [, {options}])             win_splitmove()
                ウィンドウ {nr} をウィンドウ {target} の新しい分割に移動する。
                これは {target} に移動し、:split を使用して新しいウィンドウ
                を作成するが、ウィンドウ {nr} と同じ内容を使用してから、{nr}
                を閉じることに似ている。

                {nr} と {target} の両方とも、ウィンドウ番号または window-ID
                である。両方とも現在のタブページになければならない。

                成功時は 0、失敗時は非0 を返す。

                {options}は、次のオプションエントリを持つ辞書 Dictionary で
                ある:
                  "vertical"    TRUEの場合、:vsplit と同様に、分割が垂直に作
                                成される。
                  "rightbelow"  TRUEの場合、分割は下または右(垂直の場合)に行わ
                                れる。FALSEの場合、上または左(垂直の場合)に行
                                われる。未指定の場合、'splitbelow' および
                                'splitright' の値が使用される。

                method としても使用できる:
                        GetWinid()->win_splitmove(target)


                                                        winbufnr()
winbufnr({nr})  結果は数値で、{nr}番目のウィンドウに関連付けられているバッファ
                の番号。{nr} にはウィンドウ番号またはwindow-IDが使える。
                {nr}が0の場合、現在のウィンドウに関連付けられているバッファの
                番号が返る。{nr}で存在しないウィンドウを指定した場合には-1が返
                る。
                例:
  :echo "The file in the current window is " . bufname(winbufnr(0))

                method としても使用できる:
                        FindWindow()->winbufnr()->bufname()

                                                        wincol()
wincol()        結果は数値で、ウィンドウの中でカーソルがある位置の仮想桁番号を
                表す。これはウィンドウの左側から数えたスクリーン上の桁である。
                一番左の桁は1となる。

                                                        windowsversion()
windowsversion()
                文字列を返す。MS-Windows では OS のバージョンを示す。例えば、
                Windows 10 は "10.0"、Windows 8 は "6.2"、Windows XP は "5.1"
                である。MS-Windows 以外のシステムでは、結果は空文字列である。

winheight({nr})                                         winheight()
                結果は数値で、{nr}で示されるウィンドウの高さ(行数)を示す。
                {nr} にはウィンドウ番号またはwindow-IDが使える。
                {nr}が0ならば、現在のウィンドウの高さが返る。{nr}というウィン
                ドウが存在しない場合、-1が返る。存在しているウィンドウは、絶対
                に0かそれ以上の高さを持っている。
                ウィンドウツールバーはすべて除く。
                例:
  :echo "The current window has " . winheight(0) . " lines."

                method としても使用できる:
                        GetWinid()->winheight()

winlayout([{tabnr}])                                    winlayout()
                結果は、タブページ内のウィンドウの配置を含むネストしたリストで
                ある。

                {tabnr} が与えられない場合は現在のタブページを使い、それ以外は
                番号 {tabnr} のタブページとなる。{tabnr} のタブページが見つか
                らない場合、空リストを返す。

                末端 (leaf) のウィンドウでは以下が返る:
                        ['leaf'{winid}]
                列を形成する水平に分割されたウィンドウでは以下が返る:
                        ['col', [{ウィンドウのネストしたリスト}]]
                行を形成する垂直に分割されたウィンドウではいかが返る:
                        ['row', [{ウィンドウのネストしたリスト}]]

                例:
                        " タブページ内に一つのウィンドウのみ
                        :echo winlayout()
                        ['leaf', 1000]
                        " 水平に分割された 2 つのウィンドウ
                        :echo winlayout()
                        ['col', [['leaf', 1000], ['leaf', 1001]]]
                        " 2番目のタブページが水平に分割された 3 つのウィンドウ
                        " で、かつ真ん中のウィンドウが 2 つのウィンドウに垂直
                        " に分割されている
                        :echo winlayout(2)
                        ['col', [['leaf', 1002], ['row', [['leaf', 1003],
                                            ['leaf', 1001]]], ['leaf', 1000]]]

                method としても使用できる:
                        GetTabnr()->winlayout()

                                                        winline()
winline()       結果は数値で、ウィンドウの最上行から数えた行番号を返す。ウィン
                ドウでの最上行が1となる。
                カーソルが移動するとファイルの表示が更新され、それによってスク
                ロールが引き起こされることがある。

                                                        winnr()
winnr([{arg}])  結果は現在のウィンドウを示す数値。最上位のウィンドウは1であ
                る。ポップアップウィンドウは0を返す。

                省略可能な引数{arg}は以下の値をサポートする:
                        $       最後のウィンドウの番号(ウィンドウ数)
                        #       最後にアクセスしたウィンドウの番号(CTRL-W_p
                                の行き先)。前のウィンドウがないか、別のタブペー
                                ジにある場合は、0が返される。
                        {N}j    現在のウィンドウの下N番目のウィンドウの番号
                                (CTRL-W_j の行き先)。
                        {N}k    現在のウィンドウの上N番目のウィンドウの番号
                                (CTRL-W_k の行き先)。
                        {N}h    現在のウィンドウの左N番目のウィンドウの番号
                                (CTRL-W_h の行き先)。
                        {N}l    現在のウィンドウの右N番目のウィンドウの番号
                                (CTRL-W_l の行き先)。
                この番号はCTRL-W_wと ":wincmd w" で使える。:wincmd
                tabpagewinnr()win_getid()も参照。
                例:
                        let window_count = winnr('$')
                        let prev_window = winnr('#')
                        let wnum = winnr('3k')

                method としても使用できる:
                        GetWinval()->winnr()

                                                        winrestcmd()
winrestcmd()    現在のウィンドウサイズを復元するための一連の:resizeコマンド
                を返す。これが返すコマンドは、ウィンドウを開閉せず、カレント
                ウィンドウとカレントタブページが変更されていないときのみ正しく
                動作する。
                例:
                        :let cmd = winrestcmd()
                        :call MessWithWindowSizes()
                        :exe cmd

                                                        winrestview()
winrestview({dict})
                winsaveview()が返す辞書Dictionaryを使ってカレントウィンド
                ウの表示状態を復元する。
                Note{dict} は winsaveview() の戻り値に含まれる値をすべて
                持っていなくても構わない。値がない場合はその設定は復元されな
                い。次のようにできる:
                    :call winrestview({'curswant': 4})

                これは curswant 値 (縦方向移動でカーソルの移動先として使われる
                列番号) を列番号 5 に設定する (はいそのとおり。5 です)。ほかの
                設定値は変更されない。これはカーソル位置を手動で設定したい場合
                に便利である。

                この値を手動で変更した場合、結果は予測できない。
                ウィンドウサイズが変更されていると、結果は必ずしも元通りになら
                ない。

                method としても使用できる:
                        GetView()->winrestview()

                                                        winsaveview()
winsaveview()   カレントウィンドウの表示状態を復元するための情報を持つ辞書
                Dictionaryを返す。この表示状態を復元するにはwinrestview()
                を使う。
                マッピング内でジャンプして、元の表示状態を戻したいときに使われ
                る。
                折り畳み情報は保存しない。オプション 'foldenable' によって一時
                的に折り畳みをオフにし、移動中に折り畳みが開かれないようにする
                こと。これは副作用があるかもしれない。
                戻り値は以下のキーを持つ:
                        lnum            カーソルの行番号
                        col             カーソルの桁番号 (Note: getpos() とは
                                        異なり最初の桁番号はゼロ)
                        coladd          カーソル位置の桁オフセット。
                                        'virtualedit' がオンのとき使われる。
                        curswant        垂直移動するときの桁
                        topline         ウィンドウの最上行
                        topfill         削除行。差分モードでのみ
                        leftcol         表示されている最初の桁。'wrap' がオフ
                                        のときのみ。
                        skipcol         スキップされている桁
                Note オプションの値は保存されない。


winwidth({nr})                                          winwidth()
                結果は数値で、ウィンドウ{nr}の幅。
                {nr} にはウィンドウ番号またはwindow-IDが使える。
                {nr}が0のときはカレントウィンドウの幅を返す。ウィンドウ{nr}
                存在しないときは-1を返す。ウィンドウは必ず0以上の幅を持つ。
                例:
  :echo "The current window has " . winwidth(0) . " columns."
  :if winwidth(0) <= 50
  :  50 wincmd |
  :endif
                端末または画面サイズを取得するには、'columns' オプション参照。

                method としても使用できる:
                        GetWinid()->winwidth()


wordcount()                                             wordcount()
                この結果は現在のバッファのバイト/文字/単語統計情報の辞書である。
                これはg_CTRL-Gが提供する情報と同じである。
                この値には下記が含まれる:
                        bytes           バッファ内のバイト数
                        chars           バッファ内の文字数
                        words           バッファ内の単語数
                        cursor_bytes    カーソル位置より前のバイト数
                                        (ビジュアルモードでない)
                        cursor_chars    カーソル位置より前の文字数
                                        (ビジュアルモードでない)
                        cursor_words    カーソル位置より前の単語数
                                        (ビジュアルモードでない)
                        visual_bytes    ビジュアル選択領域内のバイト数
                                        (ビジュアルモードのみ)
                        visual_chars    ビジュアル選択領域内の文字数
                                        (ビジュアルモードのみ)
                        visual_words    ビジュアル選択領域内の単語数
                                        (ビジュアルモードのみ)

                                                        writefile()
writefile({object}{fname} [, {flags}])
                {object}が List の場合、それをファイル{fname}に書き込む。リ
                ストの各要素は改行文字(NL)で区切られる。各要素は文字列か数値で
                なければならない。
                {flags}が "b" を含むときはバイナリモードとなり、最後の要素の後
                にNLが追加されない。最後の要素が空であると、ファイルの最後の行
                がNLで終わるようになる。

                {object}が Blob の場合、バイトを変更せずにファイル{fname}
                書き込む。

                {flags}が "a" を含むときは追記モードとなり、ファイルに行が追記
                される。
                        :call writefile(["foo"], "event.log", "a")
                        :call writefile(["bar"], "event.log", "a")

                {flags} が "s" を含むとき、ファイルを書き込んだあと fsync() が
                呼び出される。これは、可能であればファイルをディスクに書き出
                す。より時間がかかるが、システムがクラッシュした場合にファイル
                が失われるのを防ぐ。
                {flags} が "S" も "s" も含まないとき、オプション 'fsync' が設
                定されていれば fsync() が呼び出される。
                {flags} が "S" を含むとき、'fsync' が設定されていても fsync()
                は呼び出されない。

                NL文字はNUL文字に置換される。
                CR文字を加えるには、{list}をwritefile()に渡す前に行わねばなら
                ない。
                既存のファイルは上書きされる(上書き可能ならば)。
                書き込みが失敗したときは-1を返す。そうでなければ0を返す。ファ
                イルを作成できないときや、書き込みが失敗したときはエラーメッ
                セージが表示される。
                readfile()も参照。
                バイト単位でファイルをコピーするには次のようにする:
                        :let fl = readfile("foo", "b")
                        :call writefile(fl, "foocopy", "b")

                method としても使用できる:
                        GetText()->writefile("thefile")


xor({expr}{expr})                                     xor()
                二つの引数のビット排他的論理和。引数は数値に変換される。リス
                ト、辞書、浮動小数点数を指定するとエラーになる。
                例:
                        :let bits = xor(bits, 0x80)

                method としても使用できる:
                        :let bits = bits->xor(0x80)


                                                        feature-list
機能は大別して 3 つの系統に分けられる:
1.  コンパイル時に+feature-listとした時にだけサポートされる機能。例:
        :if has("cindent")
2.  ある状態の時にだけサポートされる機能。例:
        :if has("gui_running")
                                                        has-patch
3.  あるバージョンより後か、あるバージョンで特定のパッチが適用されているか。機
    能"patch-7.4.248" は、Vim のバージョンが 7.5 以降であるか、もしくはバージョ
    ンが 7.4 でパッチ 248 が適用されているかを意味する。例:
        :if has("patch-7.4.248")
     Note: 249 が適用されていても、248 が抜けている可能性もある。チェリーピッ
    キングされたパッチでのみ発生する。
    Note: この形式はパッチ 7.4.237 以降で機能し、それより前ではパッチと
    v:version の両方を確認する必要がある。例 (バージョン 6.2.148 以降であるこ
    とを確認する):
        :if v:version > 602 || (v:version == 602 && has("patch148"))

ヒント: Vim がファイル名(MS-Windows)でバックスラッシュをサポートしているかどうか
を調べるには if exists('+shellslash') を使用する。


acl                     ACL をサポート
all_builtin_terms       全ての組込みターミナルを有効にしてコンパイル
amiga                   AMIGAバージョン
arabic                  アラビア語をサポート Arabic
arp                     ARPをサポート (Amiga)
autocmd                 自動コマンドをサポート (常に true)
autochdir               'autochdir' をサポート
autoservername          clientserver を自動的に有効化する
balloon_eval            balloon-eval をサポート
balloon_multiline       複数行バルーンをサポート
beos                    BeOSバージョン
browse                  :browseをサポートし、browse()が動作する
browsefilter            browsefilter をサポート
bsd                     BSDファミリのOSでコンパイルされている (macOS を除く)
builtin_terms           幾つかの組込みターミナルが有効
byte_offset             'statusline' において 'o' がサポートされる
channel                 channel プロセス間通信と job ジョブをサポート
cindent                 'cindent' をサポート
clientserver            リモート呼び出しをサポート clientserver
clipboard               'clipboard' をサポート
clipboard_working       'clipboard' をサポートし、使用可能
cmdline_compl           cmdline-completion コマンドライン補完をサポート
cmdline_hist            cmdline-history コマンドライン履歴をサポート
cmdline_info            'showcmd' と 'ruler' をサポート
comments                'comments' をサポート
compatible              Vi互換度を非常に高めてコンパイルされている
conpty                  ConPTY を使用できるプラットフォームである
cryptv                  暗号化をサポート encryption
cscope                  cscopeをサポート
cursorbind              'cursorbind' をサポート (常に true)
debug                   デバッグバージョンである
dialog_con              コンソールダイアログのサポート
dialog_gui              GUIダイアログのサポート
diff                    vimdiff と 'diff' のサポート
digraphs                ダイグラフをサポート
directx                 DirectX と 'renderoptions' をサポート
dnd                     レジスタ "~ をサポート quote_~
drop_file               ファイルのドロップ drop_file をサポート
ebcdic                  EBCDIC文字セットのマシン用
emacs_tags              Emacs式のタグファイルをサポート
eval                    式評価をサポート。もちろん常に真。
ex_extra                +ex_extra (常に true)
extra_search            'incsearch' と 'hlsearch' をサポート
farsi                   farsiのサポートは削除された
file_in_path            gf<cfile>をサポート
filterpipe              'shelltemp' がオフのとき、シェルの読み込み・書き込み・
                        フィルタコマンドにパイプを使う。
find_in_path            includeファイル内の検索をサポート +find_in_path
float                   浮動小数点数 Float サポート
fname_case              ファイル名の大文字小文字が区別される(AmigaとMS-
                        Windowsでは区別されないので偽)
folding                 folding 折り畳みをサポート
footer                  GUIのフッターをサポート gui-footer
fork                    system()の代わりにfork()/exec()を用いている
gettext                 翻訳メッセージをサポート multi-lang
gui                     GUIが有効である
gui_athena              AthenaのGUIが有効である
gui_gnome               Gnomeサポート(gui_gtkも定義される)
gui_gtk                 GTK+のGUIが有効である
gui_gtk2                GTK+ 2のGUIが有効である (gui_gtkも定義される)
gui_gtk3                GTK+ 3のGUIが有効である (gui_gtkも定義される)
gui_haiku               HaikuのGUIが有効である
gui_mac                 マッキントッシュのGUIが有効である
gui_motif               MotifのGUIが有効である
gui_photon              PhotonのGUIが有効である
gui_running             VimがGUIモードで起動している、もしくは間もなくする
gui_win32               Win32のGUIが有効である
gui_win32s              Win32sのGUIが有効である (Windows 3.1)
haiku                   Haikuバージョン
hangul_input            ハングル入力サポート
hpux                    HP-UXバージョン
iconv                   iconv()をサポート
insert_expand           挿入モード時にCTRL-Xの展開がサポートされる (常に true)
job                     channel プロセス間通信と job ジョブをサポート
ipv6                    channel での IPv6 通信をサポート
jumplist                jumplist をサポート
keymap                  'keymap' をサポート
lambda                  lambda をサポート
langmap                 'langmap' サポート
libcall                 libcall() をサポート
linebreak               'linebreak''breakat''showbreak''breakindent' を
                        サポート
linux                   Linuxバージョン
lispindent              lisp式のインデントをサポート
listcmds                バッファリスト用のコマンド:filesと引数リスト用のコマ
                        ンドarglistをサポート
localmap                ローカルなマッピングと短縮入力をサポート:map-local
lua                     Lua インターフェイスをサポート Lua
mac                     すべてのマッキントッシュ版Vim、osx を参照
macunix                 osxdarwin と同じ
menu                    :menuをサポート
mksession               :mksessionをサポート
modify_fname            ファイル名変換子をサポート filename-modifiers
                        (常に true)
mouse                   マウスをサポート
mouse_dec               DECのターミナルマウスをサポート
mouse_gpm               gpmをサポート (Linuxのコンソールマウス)
mouse_gpm_enabled       GPMマウスが動作している
mouse_netterm           nettermのマウスをサポート
mouse_pterm             qnx ptermのマウスをサポート
mouse_sysmouse          sysmouse (*BSD コンソールマウス)をサポート
mouse_sgr               sgrのマウスをサポート
mouse_urxvt             urxvtのマウスをサポート
mouse_xterm             xtermのマウスをサポート
mouseshape              'mouseshape' をサポート
multi_byte              'encoding' をサポート (常に true)
multi_byte_encoding     'encoding' がマルチバイトエンコーディングになる
multi_byte_ime          IMEによる入力をサポート
multi_lang              複数言語をサポート
mzscheme                MzSchemeインターフェイスをサポート mzscheme
netbeans_enabled        netbeansをサポートし、現在接続している
netbeans_intg           netbeansをサポート
num64                   64ビット数値をサポート Number
ole                     Win32にてOLEオートメーションをサポート
osx                     macOS 向けにコンパイル、mac を参照
osxdarwin               mac-darwin-feature 付きで macOS 向けにコンパイル
packages                packagesをサポート
path_extra              'path' と 'tags' の上方・下方検索をサポート
perl                    Perlインターフェイスをサポート
persistent_undo         永続アンドゥをサポート
postscript              PostScriptファイルの印刷をサポート
printer                 :hardcopy をサポート
profile                 :profile をサポート
python                  Python 2.x インターフェイスが使用可能。has-python
python_compiled         Python 2.x インターフェイス付きでコンパイルされた。
                        has-python
python_dynamic          Python 2.x インターフェイスが動的にロードされた。
                        has-python
python3                 Python 3.x インターフェイスが使用可能。has-python
python3_compiled        Python 3.x インターフェイス付きでコンパイルされた。
                        has-python
python3_dynamic         Python 3.x インターフェイスが動的にロードされた。
                        has-python
pythonx                 Python 2.x と/もしくは Python 3.x インターフェイスが使用可能。python_x
qnx                     QNXバージョン
quickfix                quickfixをサポート
reltime                 reltime()をサポート
rightleft               'rightleft' をサポート
ruby                    Rubyインターフェイスをサポート
scrollbind              'scrollbind' をサポート (常に true)
showcmd                 'showcmd' をサポート
signs                   :signをサポート
smartindent             'smartindent' をサポート
sodium                  libsodium ライブラリによるより良い暗号のサポート
sound                   サウンド再生をサポート。例えば、sound_playevent()
spell                   スペルチェックをサポート spell
startuptime             --startuptime をサポート
statusline              'statusline''rulerformat' そして 'titlestring' と
                        'iconstring' の特殊フォーマットをサポート
sun                     SunOSバージョン
sun_workshop            Sun workshop のサポートは削除された
syntax                  構文ハイライトをサポート
syntax_items            現在のバッファに有効なシンタックスが設定されている
system                  fork()/exec()の代わりにsystem()が使用されている
tag_binary              タグファイル内の二分探索 tag-binary-search
tag_old_static          旧式の静的tagsのサポートは削除された tag-old-static
tcl                     TCLインターフェイスをサポート
termguicolors           端末でのtrueカラーをサポート
terminal                terminal をサポート
terminfo                termcapの代わりにterminfoをサポート
termresponse            t_RVv:termresponseをサポート
textobjects             text-objectsをサポート
textprop                text-properties をサポート
tgetent                 tgetentをサポート。termcapかterminfoファイルが使用可能
timers                  timer_start() をサポート
title                   ウィンドウタイトルをサポート 'title'
toolbar                 gui-toolbarをサポート
ttyin                   入力が端末 (tty) である
ttyout                  出力が端末 (tty) である
unix                    Vim の Unix バージョン。 +unix
unnamedplus             'clipboard' に "unnamedplus" をサポート
user_commands           ユーザー定義コマンドをサポート (常に true)
vartabs                 可変タブストップをサポート 'vartabstop'.
vcon                    Win32: 仮想コンソールサポートが機能していて、
                        'termguicolors' を使用することができる。+vtp も参照。
vertsplit               ウィンドウの垂直分割をサポート :vsplit (常に true)
vim_starting            Vimの初期化プロセス中は真となる。startup
                        vim_starting
viminfo                 viminfoをサポート
vimscript-1             Vim scriptバージョン1 サポート
vimscript-2             Vim scriptバージョン2 サポート
vimscript-3             Vim scriptバージョン3 サポート
virtualedit             オプション 'virtualedit' をサポート (常に true)
visual                  ビジュアルモードをサポート (常に true)
visualextra             拡張ビジュアルモードをサポート (常に true)
                        blockwise-operators
vms                     VMSバージョン
vreplace                コマンドgRgrをサポート (常に true)
vtp                     vcon をサポート +vtp (現在のコンソール内で機能するか
                        どうかを調べるには vcon を確認する)
wildignore              オプション 'wildignore' をサポート
wildmenu                オプション 'wildmenu' を指定してコンパイル
win16                   MS-Windows 3.1 用の古いバージョン (常に false)
win32                   Win32バージョン(MS-Windows 95 以上の 32 or 64 ビット)
win32unix               Win32バージョン。Unixファイルを使用 (Cygwin)
win64                   Win64バージョン(MS-Windows 64 bit)
win95                   Win32バージョン。MS-Windows 95/98/ME用 (常に false)
winaltkeys              オプション 'winaltkeys' を指定してコンパイル
windows                 複数ウィンドウをサポート (常に true)
writebackup             オプション 'writebackup' が起動時にonになる
xfontset                X fontsetをサポート xfontset
xim                     XIMをサポート xim
xpm                     pixmap をサポート
xpm_w32                 Win32 で pixmap をサポート(後方互換性のためのみ。
                        代わりに "xpm" を使用せよ。)
xsmp                    Xセッションマネージメントをサポート
xsmp_interact           対話的Xセッションマネージメントをサポート
xterm_clipboard         xtermのクリップボードサポート
xterm_save              xtermのスクリーンの保存復帰をサポート
x11                     X11をサポート

                                                        string-match
文字列内でのパターンマッチング

patternで説明されている正規表現パターンは通常、バッファ内の行に対してマッチ
を検索するために使われる。文字列内でマッチを見つけるために使うときも、ほとんど
は同じように動作する。違いは、文字列が1つの行であるかのように扱われる事である。
文字列が文字 "\n" だけを含むとき、これは改行とはみなされない。この "\n" はパ
ターン内の "\n" や "." にマッチする。例:
        :let a = "aaaa\nxxxx"
        :echo matchstr(a, "..\n..")
        aa
        xx
        :echo matchstr(a, "a.x")
        a
        x

"^" は文字列の最初の文字でだけマッチし、"$" は最後の文字でだけマッチすることに
注意。"\n" の前後にはマッチしない。

==============================================================================
5. 関数定義                                             user-functions

ユーザーは自分で新しい関数を定義することができる。その関数は組込み関数とまった
く同じように呼び出せる。関数は一連のExコマンドを実行する。ノーマルモードコマン
ドはコマンド:normalによって実行できる。

この節は旧来の関数についてである。より高速で、型チェックや多くの機能に対応する
Vim9 関数については vim9.txt を参照のこと。

関数名は組込み関数との混同を避ける為、大文字で始まらなければならない。他のスク
リプトで同じ関数名を使用してしまうことを避ける為に、露骨に短い名前は避けるべき
である。関数名を例えば "HTMLcolor()" のように、スクリプトの名前から始めるとい
うのは良い習慣である。

波括弧変数というものもある(curly-braces-namesを参照)。また、オートロード
autoload機構を使うと、関数が呼ばれたときだけ定義することができる。

                                                        local-function
スクリプトローカルな関数の名前は "s:" で始めなければならない。スクリプトローカ
ルな関数は、そのスクリプトの中の関数から、またはそのスクリプト内で定義された
ユーザー定義コマンド、自動コマンドからしか呼ぶことができない。そのスクリプト内
で定義されたマッピングにより呼ぶこともできるが、スクリプトの外部でマッピングが
展開された場合は "s:" の代わりに <SID> をつけなければならない。
ローカル関数はスクリプトローカル関数だけである。バッファローカル関数やウィンド
ウローカル関数というものはない。

                                        :fu :function E128 E129 E123
:fu[nction]             全ての関数と、その引数を表示する。

:fu[nction] {name}      関数{name}の定義を表示する。
                        {name}は辞書Dictionaryの要素のFuncrefであってもよ
                        い:
                                :function dict.init

:fu[nction] /{pattern}  {pattern}にマッチする名前の関数を表示する。"File" で終
                        わる関数を全て表示する例:
                                :function /File$

                                                        :function-verbose
'verbose' が 0 でないとき、これらのコマンドで関数を表示すると、それがどこで定
義されたかも表示する。例:

    :verbose function SetFileTypeSH
        function SetFileTypeSH(name)
            Last set from /usr/share/vim/vim-7.0/filetype.vim

より詳しくは:verbose-cmdを参照。

                                                E124 E125 E853 E884
:fu[nction][!] {name}([arguments][range] [abort] [dict] [closure]
                        {name} という名前で新しい関数を定義する。関数の本体は、
                        次の行から :endfunction と一致するまで続く。

                        関数名はアルファベットと数字と '_' からなり、通常の関
                        数はアルファベットの大文字、スクリプトローカル関数は
                        "s:" で始まらなければならない。Note: "b:" や "g:" は
                        使用できない (7.4.260 からは関数名にコロンが含まれる場
                        合は E884 エラーが発生する。例 "foo:bar()"。このパッチ
                        以前はエラーにはならない)。

                        {name}は辞書Dictionaryの要素のFuncrefであってもよ
                        い:
                                :function dict.init(arg)
                        "dict" は既に定義されている辞書でなければならない。そ
                        の要素 "init" がまだ存在しないならば追加される。存在す
                        る場合は、既存の関数を上書きするためには [!] をつけな
                        ければならない。この値は番号つきの関数を指すFuncref
                        である。この関数はFuncrefを通してのみ呼ぶことができ、
                        そこへの参照がなくなると削除される。
                                                                E127 E122
                        この名前で定義される関数が既に定義済みで [!] が使用さ
                        れなかった場合、エラーとなる。1つの例外がある: スクリ
                        プトを再読み込みすると、そのスクリプトで以前に定義され
                        ていた関数は、静かに置き換えられる。
                        [!] が使用されていれば、それまで存在していた関数は、速
                        やかに新しいものへ置換えられる。
                        NOTE: ! は十分に注意して使用すること。注意せずに使用し
                        た場合は既存の関数を期待せず置き換える可能性があり、デ
                        バッグが難しくなる。
                        NOTE: Vim9 スクリプトのスクリプトローカル関数は、削除
                        または再定義はできない。

                        引数{arguments}についてはfunction-argumentを参照。

                                        :func-range a:firstline a:lastline
                        引数[range]を追加した場合、関数は「範囲」を管理するこ
                        とができる。「範囲」は "a:firstline" と "a:lastline"
                        によって渡される。[range]がなかった場合、
                        ":{range}call" が「範囲」を指定されて実行されると、1行
                        1行について、カーソルをその行の先頭に置いた状態で関数
                        を呼び出すことになる。function-range-exampleを参照。
                        他の Ex コマンドと同様に、カーソルは選択範囲の最初の行
                        に移動される。
                                                                :func-abort
                        引数 [abort] を追加すると、関数の実行中にエラーに遭遇
                        し次第、即関数は中断される。
                                                                :func-dict
                        引数 [dict] を追加すると、この関数は辞書Dictionary
                        要素を通してしか呼べなくなる。そしてその辞書にローカル
                        変数 "self" が定義される。Dictionary-functionを参照。
                                                :func-closure E932
                        引数 [closure] を追加すると、関数は外側のスコープの変
                        数と引数をアクセスできるようになる。これは一般的にク
                        ロージャと呼ばれる。以下の例では Bar() は Foo() のス
                        コープの "x" を使用している。それは Foo() から戻っても
                        参照され続ける:
                                :function! Foo()
                                :  let x = 0
                                :  function! Bar() closure
                                :    let x += 1
                                :    return x
                                :  endfunction
                                :  return funcref('Bar')
                                :endfunction

                                :let F = Foo()
                                :echo F()
                                1
                                :echo F()
                                2
                                :echo F()
                                3

                                                function-search-undo
                        関数の実行によって、最後に使用されたサーチパターン、及
                        びredoコマンドの "." の内容は変更されない。したがって、
                        関数内で:nohlsearch を行っても、関数から戻ると検索結
                        果のハイライトが元に戻ることになる。

                        :endf :endfunction E126 E193 W22
:endf[unction] [argument]
                        関数定義の終了。最も良いのは、[argument] 無しに行内に
                        これ自身のみを書くこと。

                        [argument] として可能なものは以下のとおり:
                                | コマンド      次に実行するコマンド
                                \n コマンド     次に実行するコマンド
                                " コメント      常に無視される
                                その他          無視される、'verbose' が非ゼロ
                                                のときは警告が表示される
                        後ろに続くコマンドのサポートは Vim 8.0.0654 で追加され
                        ており、それ以前ではいかなる引数も黙って無視される。

                        コマンド :execute の内部で関数の定義を可能にするに
                        は、:bar の代わりに改行を使用する:
                                :exe "func Foo()\necho 'foo'\nendfunc"

                                :delf :delfunction E130 E131 E933
:delf[unction][!] {name}
                        関数{name}を削除する。
                        {name}は辞書Dictionaryの要素のFuncrefであってもよ
                        い:
                                :delfunc dict.init
                        この例は "dict" から要素 "init" を削除する。この関数へ
                        の参照がなくなると、関数は削除される。
                        ! が付いていると、関数が存在していなくてもエラーが発生
                        しない。
                                                        :retu :return E133
:retu[rn] [expr]        関数から戻る。"[expr]" が与えられた場合、それは評価さ
                        れ関数の戻り値として呼出し側に渡される。"[expr]" が与
                        えられない場合、数値0が呼出し側に渡される。
                        関数内に実行されない命令があるかどうかはチェックされな
                        いことに留意すること。つまり、たとえ ":return" 命令の
                        後に何か命令があったとしても、警告も何も与えられない。

                        :try:finallyの間で ":return" が実行された場合、
                        ":finally" から対応する:endtryまでのコマンドがまず実
                        行される。":try" がネストしている場合、それらの全てに
                        対してこのプロセスが適用される。そして最も外側の
                        ":endtry" にて関数を抜ける。

                                                function-argument a:var
引数は、与えられた名前によって定義される。関数のなかでは "a:name" ("a:" を引数
に接頭)のようにして参照することができる。
                                        a:0 a:1 a:000 E740 ...
引数はコンマで区切ることで、最大20まで与えることができる。最後の引数を "..."
にすることで、可変長の引数を使用できる。関数の中では "a:1" や "a:2" のようにし
て可変長の引数にアクセスできる。"a:0" は可変長引数が幾つあるかを示している (0
であること、つまり引数がそれ以上ないこともある)。"a:000" は全引数を持つリスト
Listを示している。Note "a:1" は "a:000[0]" と同じである。
                                                                E742
a: のスコープとこれらの変数は固定されており、変更できない。
しかしリストListや辞書Dictionaryのような複合型が使用された場合は、その内容
を変更できる。よって関数にリストListを渡し、そこに要素を追加させることができ
る。関数にリストや辞書を変更させたくない場合は:lockvarを使うこと。

関数を引数無しで定義することも可能である。その時でも()は付けなければならない。

関数の中で別の関数を定義することも可能である。


                                                optional-function-argument
名前付き固定引数にデフォルト値を指定できる。これにより、関数呼び出しではオプ
ションになる。呼び出し時に固定引数が指定されていない場合は、デフォルトの式を使
用して初期化される。これは :function もしくは :def で宣言された関数に対し
てのみ機能し、ラムダ式 expr-lambda には機能しない。

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

引数のデフォルト式は、定義時ではなく関数呼び出し時に評価される。したがって、関
数が定義された瞬間に無効な式を使用することが可能である。式はまた、呼び出し中に
引数が指定されていない場合にのみ評価される。
                                                none-function_argument
デフォルトの式を使うために v:none を渡すことができる。Note これは、引数にデ
フォルトの式がある場合、v:none を通常の値として渡すことができないことを意味す
る。

例:
  function Something(a = 10, b = 20, c = 30)
  endfunction
  call Something(1, v:none, 3)      " b = 20

                                                                E989
デフォルト式を持つオプション引数は、必須引数の後になければならない。オプション
の名前付き引数すべての後に "..." を使用できる。

後の引数のデフォルトが前の引数を参照することは可能だが、その逆はできない。すべ
ての引数と同様に、それらには "a:" を前に付ける必要がある。

動作する例:
  :function Okay(mandatory, optional = a:mandatory)
  :endfunction
動作しない例:
  :function NoGood(first = a:second, second = 10)
  :endfunction

"..." が使われていない時は、関数呼び出しの時の引数の数は必須の名前付きの引数の
数と少なくとも同じでなければならない。"..." を使った時には引数の数は必須および
オプショナル引数の合計より大きくなるだろう。

                                                        local-variables
関数の中でローカル変数を使うこともできる。これらは関数から戻ると消滅する。
グローバル変数にアクセスするためには "g:" を付ける必要がある。

例:
  :function Table(title, ...)
  :  echohl Title
  :  echo a:title
  :  echohl None
  :  echo a:0 . " items:"
  :  for s in a:000
  :    echon ' ' . s
  :  endfor
  :endfunction

この関数は次のように呼ぶことができる:
  let lines = Table("Table", "line1", "line2")
  let lines = Table("Empty Table")

一つ以上の値を返したい場合には、リストListを返すようにする:
  :function Compute(n1, n2)
  :  if a:n2 == 0
  :    return ["fail", 0]
  :  endif
  :  return ["ok", a:n1 / a:n2]
  :endfunction

この関数は次のように呼ぶことができる:
  :let [success, div] = Compute(102, 6)
  :if success == "ok"
  :  echo div
  :endif


                                                :cal :call E107 E117
:[range]cal[l] {name}([arguments])
                関数を呼び出す。関数の名前と引数は :function によって指定さ
                れるものである。引数は最大20まで使用可能。戻り値は破棄される。
                「範囲」を受け付ける関数に「範囲」を指定しなかった場合、関数は
                カーソルの現在位置について一度だけ呼び出される。
                「範囲」を受け付けない関数に「範囲」を指定した場合、その範囲の
                一行ずつについて関数が呼び出される。その時カーソルは当該行の先
                頭に設定される。カーソルは「範囲」の最下行の左端になる(恐らく
                最後の関数呼出しの結果、動いた先である)。引数は各呼出しについ
                て繰り返し評価される。それは次の例で確かめることができる:
                                                function-range-example 
        :function Mynumber(arg)
        :  echo line(".") . " " . a:arg
        :endfunction
        :1,5call Mynumber(getline("."))

                "a:firstline" と "a:lastline" はとにかく定義されるので、「範
                囲」の最初や最後で何か違った事をするのにも用いることができる。

                「範囲」自身を扱っている関数の例:

        :function Cont() range
        :  execute (a:firstline + 1) . "," . a:lastline . 's/^/\t\\ '
        :endfunction
        :4,8call Cont()

                この関数は「範囲」の最初の行を除いた全ての行の先頭に、継続のた
                めの文字 "\" を挿入する。

                この関数の戻り値からさらに間接参照が行われる場合、その参照先に
                は範囲が渡されない。例:
        :4,8call GetDict().method()
                GetDict()には範囲が渡されるが、method()には渡されない。

                                                                E132
関数の再帰的な使用はオプション 'maxfuncdepth' によって制限することができる。

:eval を使用することもできる。範囲はサポートしていないが、メソッドの連鎖は可
能である、例えば:
        eval GetList()->Filter()->append('$')

関数は、式の評価の一部として、またはメソッドとして使用されるときに呼び出すこと
もできる:
        let x = GetList()
        let y = GetList()->Filter()


自動的に読み込まれる関数
                                                        autoload-functions
たくさんの関数または巨大な関数を使うときは、それらが使用されたときだけ自動的に
定義されるようにすることができる。これには2つの方法がある: 自動コマンドによ
る方法と、'runtimepath' 内の "autoload" ディレクトリによる方法である。


自動コマンドを使う方法

これはユーザーマニュアルのセクション41.14で説明されている。

自動コマンドは、長いVim scriptファイルのプラグインに対して有用である。自動コマ
ンドを定義し、すぐに :finish でそのスクリプトを抜ける。こうするとVimの起動が
速くなる。その後自動コマンドにより :finish コマンドをスキップする変数を定義
し、そのファイルが再び読み込まれる。

定義すべき関数名にマッチするパターンを指定して自動コマンドイベント
FuncUndefinedを使う。例:

        :au FuncUndefined BufNet* source ~/vim/bufnetfuncs.vim

ファイル "~/vim/bufnetfuncs.vim" は "BufNet" で始まる関数を定義しなければなら
ない。FuncUndefinedも参照。


オートロードスクリプトの使い方
                                                        autoload E746
これはユーザーマニュアルのセクション41.15で説明されている。

"autoload" ディレクトリのスクリプトを使う方法はより簡単である。しかし完全に正
しいファイル名を使う必要がある。オートロードされる関数は次のような名前を持つ:

        :call filename#funcname()

これらの関数は常にグローバルで、Vim9 script なら使用するのに "g:" が必要:
        :call g:filename#funcname()

このような関数が呼ばれ、それがまだ定義されていなかった場合、Vimは 'runtimepath'
内の "autoload" ディレクトリから "filename.vim" というスクリプトファイルを探
す。例えば "~/.vim/autoload/filename.vim" のように。そしてこのファイルは次のよ
うな関数を定義していなければならない:

        function filename#funcname()
           echo "Done!"
        endfunction

このファイル名と関数の # の前の部分は完全に一致しなければならない。そして定義
された関数は呼ばれた関数と完全に同じ名前でなければならない。
 Vim9 script では前置詞 "g:" を使わなくてはならない:
        function g:filename#funcname()

もしくはコンパイル済み関数:
        def g:filename#funcname()

サブディレクトリを使うこともできる。関数名の中の # はパスのセパレータのように
解釈される。つまり、次の関数を呼ぶと:

        :call foo#bar#func()

Vimは 'runtimepath' からファイル "autoload/foo/bar.vim" を探す。

これはまだ定義されていない変数を参照するときにも使える:

        :let l = foo#bar#lvar

しかしこのオートロードスクリプトがすでに読み込まれている場合、未知の変数があっ
てもこのスクリプトは再読み込みされない。

この変数に値を代入するときは、何も特別なことはない。この方法は、オートロードス
クリプトが読み込まれる前に設定を渡すために使うことができる:

        :let foo#bar#toggle = 1
        :call foo#bar#func()

オートロードスクリプト内で定義されるはずの関数を呼んだがスクリプト内で関数が定
義されなかった場合、その関数のエラーメッセージが表示される。修正したなら自動で
は再度読み込まれないオートロードスクリプトを再度読み込む。手動でスクリプトを
sourceするかVimを再スタートさせる。

また、2つのスクリプト間で、互いに自分が定義される前に相手を呼ぶような関数があ
ると、これは動作しない。
トップレベルでオートロード機能を使うのは避けること。

Hint: たくさんのファイルからなるスクリプトを配布する場合には、vimballユーティ
リティを使うとそれらをまとめることができる。ユーザーマニュアルの
distribute-scriptも参照。

==============================================================================
6. 波括弧変数                                           curly-braces-names

変数を使用可能なほとんどの文脈では「波括弧」変数を使うことができる。これは有効
な変数名であり、次のように、1個以上の式を波括弧{}で囲む:
        my_{adjective}_variable

Vimはこれを見つけると、まず波括弧の中の式を評価し、その値をもとの位置に置きか
え、全体を変数名として再解釈する。よって上の例では、変数 "adjective" に
"noisy" が代入されていたとすると、この変数は "my_noisy_variable" となる。ある
いは、"adjective" に "quiet" が代入されていたとすれば "my_quiet_variable" とな
る。

これの応用の1つは、オプション値によって支配される変数の集合を作ることである。
例えば次の文
        echo my_{&background}_message

は現在の 'background' の値に応じて "my_dark_message" か "my_light_message" の
中身を表示する。

波括弧を複数使うこともできる:
        echo my_{adverb}_{adjective}_message
ネストさせることもできる:
        echo my_{ad{end_of_word}}_message
ここで "end_of_word" は "verb" か "jective" のどちらかである。

しかし、波括弧の中の式を評価した結果が有効な変数名とならなければならない。
つまり、次は無効である:
        :let foo='a + b'
        :echo c{foo}d
というのは、展開の結果が "ca + bd" となるからで、これは有効な名前ではない。

                                                curly-braces-function-names
同様の方法で評価した名前により関数を定義したり呼び出したりできる。
例:
        :let func_end='whizz'
        :call my_func_{func_end}(parameter)

この例は関数 "my_func_whizz(parameter)" を呼びだす。

これらは機能しない:
  :let i = 3
  :let @{i} = ''  " error
  :echo @{i}      " error

==============================================================================
7. コマンド                                             expression-commands

Note: Vim9 script では :let は変数の宣言で使い、代入はしない。代入は :let
から除外された。 vim9-declaration

:let {var-name} = {expr1}                               :let E18
                        内部変数{var-name}に式{expr1}の結果をセットする。変数
                        の型は{expr1}によって決定される。{var-name}という変数
                        がまだ存在しない場合、新たに作成される。

:let {var-name}[{idx}] = {expr1}                        E689
                        リストの要素に式{expr1}の結果をセットする。{var-name}
                        はリストを参照し、{idx}はそのリストの有効なインデック
                        スでなければならない。ネストしたリストに対してはイン
                        デックスを繰り返すことができる。
                        このコマンドはリストに要素を追加するためには使えない。
                        文字列の i バイト目をセットするためにも使えない。それ
                        には次のようにする:
                                :let var = var[0:2] . 'X' . var[4:]
                        {var-name}が Blob の場合、{idx}はblobの長さになる。
                        この場合、1バイトが追加される。

                                                        E711 E719
:let {var-name}[{idx1}:{idx2}] = {expr1}                E708 E709 E710
                        リストListの一部を式{expr}の値で置き換える。{expr}
                        値は正しい個数の要素を持つリストでなければならない。
                        {idx1}を省略すると0となる。
                        {idx2}を省略するとリストの末尾となる。
                        指定された範囲の一部がリストの末尾を越える場合、要素が
                        追加される。

                        :let+= :let-= :letstar=
                        :let/= :let%= :let.= :let..= E734 E985
:let {var} += {expr1}   ":let {var} = {var} + {expr1}" と同様。
:let {var} -= {expr1}   ":let {var} = {var} - {expr1}" と同様。
:let {var} *= {expr1}   ":let {var} = {var} * {expr1}" と同様。
:let {var} /= {expr1}   ":let {var} = {var} / {expr1}" と同様。
:let {var} %= {expr1}   ":let {var} = {var} % {expr1}" と同様。
:let {var} .= {expr1}   ":let {var} = {var} . {expr1}" と同様。
:let {var} ..= {expr1}  ":let {var} = {var} .. {expr1}" と同様。
                        {var}がセットされていないときや、{var}{expr1}の型が
                        演算子に合わないときは失敗する。
                        .= はVim scriptバージョン2以降ではサポートされていな
                        い。vimscript-version を参照。


:let ${env-name} = {expr1}                      :let-environment :let-$
                        環境変数{env-name}に式{expr1}の結果をセットする。型は
                        常に文字列。

                        一部のシステムでは、環境変数を空にすると環境変数が削除
                        される。多くのシステムは、設定されていない環境変数と空
                        の環境変数を区別しない。

:let ${env-name} .= {expr1}
                        環境変数{env-name}{expr1}を付け加える。その環境変数
                        が存在しないときは "=" と同様に働く。

:let @{reg-name} = {expr1}                      :let-register :let-@
                        式{expr1}の結果をレジスタ{reg-name}に書きこむ。
                        {reg-name}は単一の文字でかつ、書きこむことのできるレジ
                        スタでなければならない(registersを参照)。"@@" は名前
                        無しレジスタとして使用でき、"@/" はサーチパターンとし
                        て使用できる。
                        {expr1}の結果が<CR><NL>で終了していた場合、レジスタ
                        は行単位で設定され、そうでなければ文字単位で設定される。
                        次のコマンドにより最後に検索したパターンをクリアするこ
                        とができる:
                                :let @/ = ""
                        これは空文字列を検索するのとは異なる。空文字列を検索す
                        ると、いたるところでマッチする。

:let @{reg-name} .= {expr1}
                        レジスタ{reg-name}{expr1}を付け加える。このレジスタ
                        が空のときは、そこに{expr1}をセットする。

:let &{option-name} = {expr1}                   :let-option :let-&
                        オプション{option-name}に式{expr}の値をセットする。文
                        字列や数値の値はそのオプションの型に変換される。
                        ウィンドウやバッファについてローカルなオプションに対し
                        ては、その効果は:setコマンドを使ったときと同様で、ロー
                        カルな値とグローバルな値の両方が変更される。
                        例:
                                :let &path = &path . ',/usr/local/include'
                        これは、t_xx 形式の端末コードにも使える。ただし、英数
                        字の名前に限る。例:
                                :let &t_k1 = "\<Esc>[234;"
                        コードが存在していなかったときは端末キーコードとして作
                        成され、エラーは発生しない。

:let &{option-name} .= {expr1}
                        文字列のオプションの場合: その値に{expr}を付け加える。
                        :set+=とは違い、コンマを挿入しない。

:let &{option-name} += {expr1}
:let &{option-name} -= {expr1}
                        数値または切替のオプションの場合: {expr1}を足す・引く。

:let &l:{option-name} = {expr1}
:let &l:{option-name} .= {expr1}
:let &l:{option-name} += {expr1}
:let &l:{option-name} -= {expr1}
                        上と同様だが、オプションのローカルな値だけをセットする
                        (ローカルな値があるならば)。:setlocalと同様に働く。

:let &g:{option-name} = {expr1}
:let &g:{option-name} .= {expr1}
:let &g:{option-name} += {expr1}
:let &g:{option-name} -= {expr1}
                        上と同様だが、オプションのグローバルな値だけをセットす
                        る(グローバルな値があるならば)。:setglobalと同様に働
                        く。

:let [{name1}{name2}, ...] = {expr1}          :let-unpack E687 E688
                        {expr1}の値はリストListでなければならない。そのリス
                        トの最初の要素が{name1}に代入され、2番目の要素が
                        {name2}に代入される。以下同様。
                        nameの個数がリストListの要素の個数に一致しなければな
                        らない。
                        前述のように各nameは ":let" コマンドの要素の1つになる
                        ことができる。
                        例:
                                :let [s, item] = GetItem(s)
                        詳細: 最初に{expr1}が評価され、それから順番に代入が行
                        われる。{name2}{name1}に依存するかどうかは問題になる。
                        例:
                                :let x = [0, 1]
                                :let i = 0
                                :let [i, x[i]] = [1, 2]
                                :echo x
                        この結果は[0, 2]となる。

:let [{name1}{name2}, ...] .= {expr1}
:let [{name1}{name2}, ...] += {expr1}
:let [{name1}{name2}, ...] -= {expr1}
                        上と同様だが、リストListの各要素に対し連結・足し算・
                        引き算を行う。

:let [{name}, ..., ; {lastname}] = {expr1}                              E452
                        :let-unpackと同様だが、リストListの要素数がnamesの
                        数より多くてもよい。余った要素のリストが{lastname}に代
                        入される。要素の余りがないとき{lastname}は空リストにな
                        る。
                        例:
                                :let [a, b; rest] = ["aval", "bval", 3, 4]

:let [{name}, ..., ; {lastname}] .= {expr1}
:let [{name}, ..., ; {lastname}] += {expr1}
:let [{name}, ..., ; {lastname}] -= {expr1}
                        上と同様だが、リストListの各要素に対して連結・足し算
                        ・引き算を行う。

                                                :let=<< :let-heredoc
                                                E990 E991 E172 E221
:let {var-name} =<< [trim] {endmarker}
text...
text...
{endmarker}
                        内部変数 {var-name} を文字列 {endmarker} で囲まれたテ
                        キスト行を含むリスト List に設定する。{endmarker} は
                        空白を含んではならない。
                        テキストの各行は literal-string として扱われる。
                        {endmarker} は小文字で始めることができない。
                        最後の行は {endmarker} 文字列だけで終わり、他の文字は
                        含まれない。{endmarker} の後の空白に気をつけること!

                        "trim" がない場合は、テキスト行内の全ての空白文字は保
                        持される。もし {endmarker} の前に "trim" が指定されて
                        いる場合、インデントが取り除かれるため以下を実行でき
                        る:
                                let text =<< trim END
                                  if ok
                                    echo 'done'
                                  endif
                                END
                        結果: ["if ok", "  echo 'done'", "endif"]
                        マーカーは "let" のインデントと並ばなければならず、最
                        初の行のインデントは全てのテキスト行から取り除かれる。
                        具体例: 最初の空でないテキスト行の先頭のインデントと完
                        全に一致する全ての先頭のインデントは入力行から削除され
                        る。let の前の先頭のインデントと完全に一致する先頭の
                        インデントはすべて {endmarker} を含む行から削除される。
                        Note スペースとタブの違いが重要であることに注意するこ
                        と。

                        {var-name} がまだ存在しない場合は作成される。
                        他のコマンドを続けることはできないが、コメントを続ける
                        ことはできる。

                        行の継続が適用されないようにするには、'cpoptions' に
                        'C' を追加することを検討すること:
                                set cpo+=C
                                let var =<< END
                                   \ leading backslash
                                END
                                set cpo-=C

                        例:
                                let var1 =<< END
                                Sample text 1
                                    Sample text 2
                                Sample text 3
                                END

                                let data =<< trim DATA
                                        1 2 3 4
                                        5 6 7 8
                                DATA

                                                                E121
:let {var-name} ..      変数{var-name}の値を一覧表示する。変数の名前を複数指定
                        することができる。以下の特別な名前が認識される: E738
                          g:    グローバル変数
                          b:    バッファローカル変数
                          w:    ウィンドウローカル変数
                          t:    タブページローカル変数
                          s:    スクリプトローカル変数
                          l:    関数ローカル変数
                          v:    Vimの変数
                        Vim9 script では動作しない。 vim9-declaration

:let                    全変数の値を一覧表示する。値の前に変数の型が示される:
                            <nothing>   文字列
                                #       数値
                                *       Funcref
                        Vim9 script では動作しない。 vim9-declaration

:unl[et][!] {name} ...                          :unlet :unl E108 E795
                        内部変数{name}を削除する。複数の変数名を指定すると、そ
                        れらが全て削除される。名前はリストListや辞書
                        Dictionaryの要素でもよい。
                        [!]をつけると存在しない変数に対するエラーメッセージを
                        表示しない。
                        リストListから1個以上の要素を削除することができる:
                                :unlet list[3]    " 4番目の要素を削除
                                :unlet list[3:]   " 4番目から最後までの要素を
                                                    削除
                        辞書からは一度に1個の要素を削除することができる:
                                :unlet dict['two']
                                :unlet dict.two
                        グローバル変数とスクリプトローカル変数をクリーンアップ
                        するために特に便利である(これらはスクリプト終了時に検
                        出されない)。関数ローカルな関数は、その関数から抜ける
                        ときに自動的に削除される。

:unl[et] ${env-name} ...                        :unlet-environment :unlet-$
                        環境変数 {env-name} を削除する。
                        一つの :unlet コマンドの中に {name} と ${env-name} を
                        混ぜることができる。! が付いていない場合でも、存在しな
                        い変数に対してエラーメッセージは表示されない。
                        システムが環境変数の削除をサポートしていない場合は空に
                        する。

                                                :cons :const
:cons[t] {var-name} = {expr1}
:cons[t] [{name1}{name2}, ...] = {expr1}
:cons[t] [{name}, ..., ; {lastname}] = {expr1}
:cons[t] {var-name} =<< [trim] {marker}
text...
text...
{marker}
                        :letに似ているが、加えて、値がセットされたあとに変数
                        がロックされる。これは、ロックされた変数と同じで、
                        :letのすぐ後に:lockvarを使うことで変数をロックする
                        ことと同義である。したがって:
                                :const x = 1
                        は、以下と同義である:
                                :let x = 1
                                :lockvar! x
                        NOTE: Vim9 script では :const とは異なった動きをする、
                        vim9-const を参照。
                        これは、変数が変更されないことを確実にしたいときに便利
                        である。
                        この値がリストか辞書のリテラルならその項目もまた変更で
                        きない:
                                const ll = [1, 2, 3]
                                let ll[1] = 5  " Error!
                        参照の入れ子はロックされない:
                                let lvar = ['a']
                                const lconst = [0, lvar]
                                let lconst[0] = 2  " Error!
                                let lconst[1][0] = 'b'  " OK
                                                        E995
                        :constは変数の変更をすることができない:
                                :let x = 1
                                :const x = 2  " エラー!
                                                        E996
                        Note 環境変数、オプション値およびレジスタ値はロックで
                        きないため、ここでは使用できない。

:cons[t]
:cons[t] {var-name}
                        引数が指定されていない場合、または {var-name} のみが指
                        定されている場合、動作は :let と同じである。

:lockv[ar][!] [depth] {name} ...                        :lockvar :lockv
                        内部変数{name}をロックする。ロックすると、それ以降変更
                        ができなくなる(アンロックするまで)。
                        ロックされた変数を削除することはできる:
                                :lockvar v
                                :let v = 'asdf'   " 失敗!
                                :unlet v          " 動作する
                                                        E741 E940
                        ロックされた変数を変更しようとするとエラーメッセージ
                        "E741: Value is locked: {name}" が表示される。
                        もしも組み込み変数をロック・アンロックしようとすると、
                        エラーメッセージ "E940: Cannot lock or unlock variable
                        {name}" が表示される。

                        [depth]はリストListや辞書Dictionaryをロックすると
                        きに意味がある。どれだけ深くロックするかを指定する:
                                0       変数 {name} をロックするが値はロックし
                                        ない。
                                1       リストや辞書それ自身をロックする。要素
                                        を追加したり削除はできないが、要素の値
                                        を変えることはできる。
                                2       要素の値もロックする。その要素がリスト
                                        や辞書である場合、その中の要素の追加や
                                        削除はできないが、値の変更はできる。
                                3       2と同様だが、リスト・辞書内のリスト・
                                        辞書に対してもあてはまる。1レベル深い。
                        [depth]の既定値は2であり、{name}がリストまたは辞書であ
                        る場合、その値は変更できない。

                        [depth] 0 の例:
                                let mylist = [1, 2, 3]
                                lockvar 0 mylist
                                let mylist[0] = 77      " OK
                                call add(mylist, 4]     " OK
                                let mylist = [7, 8, 9]  " エラー!
                                                                E743
                        深さを無限にするには[!]を使い、[depth]を省略する。しか
                        しループを捕捉するために深さの最大値は100に設定されて
                        いる。

                        Note 2つの変数が同じリストListを参照している場合、片
                        方の変数をロックすると、もう一方の変数を介してアクセス
                        した場合もロックされている。
                        例:
                                :let l = [0, 1, 2, 3]
                                :let cl = l
                                :lockvar l
                                :let cl[1] = 99         " 代入できない!

                        これを回避するにはリストのコピーを作るとよい。
                        deepcopy()を参照。


:unlo[ckvar][!] [depth] {name} ...                      :unlockvar :unlo
                        内部変数{name}をアンロックする。:lockvarの逆を行う。

:if {expr1}                     :if :end :endif :en E171 E579 E580
:en[dif]                {expr1}が非ゼロと評価された場合に、対応する ":else" か
                        ":endif" までの命令を実行する。

                        バージョン4.5から5.0まで間のVimは、":if" と ":endif"
                        の間の全てのExコマンドは無視する。この2つのコマンドは
                        将来の拡張性を、下位互換と同時に提供するためのものであ
                        る。ネスティング (入れ子) が可能である。":else" や
                        ":elseif" は無視され、"else" 部分は一切実行されないこ
                        とに注意。

                        あなたはこれを、旧バージョンとの互換性を保ったまま使用
                        することができる:
                                :if version >= 500
                                :  version-5-specific-commands
                                :endif
                        しかしそれでも "endif" を見つけるために後続のコマンド
                        をパースする必要がある。古いVimで新しいコマンドを使う
                        と問題が起こることがある。例えば ":silent" が
                        ":substitute" コマンドと認識されるなど。その場合には、
                        ":execute" を使うと問題を避けることができる:
                                :if version >= 600
                                :  execute "silent 1,$delete"
                                :endif

                        NOTE: ":append" と ":insert" コマンドは ":if" と
                        ":endif" の間では正しく動かない。

                                                :else :el E581 E583
:el[se]                 対応する ":if" ブロックが実行されなかった場合には、こ
                        れに対応する ":else" か ":endif" までのコマンドが実行
                        される。

                                        :elseif :elsei E582 E584
:elsei[f] {expr1}       ":else" ":if" の省略形。":endif" を付け加える (入れ子
                        にする) 手間を省くことができる。

:wh[ile] {expr1}                        :while :endwhile :wh :endw
                                                E170 E585 E588 E733
:endw[hile]             {expr1}が非ゼロとして評価される間、":while" と
                        ":endwhile" の間のコマンドを繰り返し実行する。
                        ループの内側でエラーが生じた場合、endwhileの直後から実
                        行が再開される。
                        例:
                                :let lnum = 1
                                :while lnum <= line("$")
                                   :call FixLine(lnum)
                                   :let lnum = lnum + 1
                                :endwhile

                NOTE: ":append" や ":insert" コマンドは ":while" ループの内側
                では正しく動かない。

:for {var} in {object}                                  :for E690 E732
:endfo[r]                                               :endfo :endfor
                        {object}の各要素に対し、":for" と ":endfor" の間のコマ
                        ンドを繰り返す。{object}はリスト List または Blob
                        である。変数{var}に各要素の値がセットされる。ループの
                        内側のコマンドでエラーが検出されたときは "endfor" の後
                        から実行が継続される。ループの内側で{object}を変更する
                        とどの要素が使われるかに影響を与える。それを望まない場
                        合はコピーを作ること:
                                :for item in copy(mylist)
                        {object}が List でコピーを作らない場合、Vimは現在の
                        要素に対してコマンドを実行する前に、List の次の要素
                        への参照を保存する。そのため副作用なしに現在の要素を削
                        除することができる。それ以降の要素を変更すると、それが
                        見つからなくなる。つまり以下の例は動作する(List を空
                        にする非効率な方法):
                                for item in mylist
                                   call remove(mylist, 0)
                                endfor
                        Note List を並べ替える(例えばsort()やreverse()で)と
                        予期しない結果になることがある。

                        {object}が Blob の場合、Vimは常にコピーを作成して繰
                        り返す。List とは異なり、Blob を変更しても繰り返し
                        には影響しない。

:for [{var1}{var2}, ...] in {listlist}
:endfo[r]
                        上の ":for" と同様だが、{listlist}の各要素がリストでな
                        ければならない点が異なる。そのリストの各要素が{var1},
                        {var2}などに代入される。例:
                                :for [lnum, col] in [[1, 3], [2, 5], [3, 8]]
                                   :echo getline(lnum)[col]
                                :endfor

                                                :continue :con E586
:con[tinue]             ":while" または ":for" ループの内側で使われたときは、
                        そのループの開始位置まで戻る。
                        ループの内側の:try:finallyの間で使われた場合、
                        :finallyから:endtryまでの間のコマンドがまず実行さ
                        れる。ループの内側で ":try" がネストしている場合、全て
                        の ":try" に対してこのプロセスが適用される。最も外側の
                        ":endtry" の後ループの開始位置まで戻る。

                                                :break :brea E587
:brea[k]                ":while" または ":for" ループの内側で使われたときは、
                        対応する ":endwhile" または ":endfor" の後のコマンドま
                        でスキップする。
                        ループの内側の:try:finallyの間で使われた場合、
                        :finallyから:endtryまでの間のコマンドがまず実行さ
                        れる。ループの内側で ":try" がネストしている場合、全て
                        の ":try" に対してこのプロセスが適用される。最も外側の
                        ":endtry" の後ループの後までジャンプする。

:try                            :try :endt :endtry E600 E601 E602
:endt[ry]               ":try" と ":endtry" の間のコマンド (":source" コマン
                        ド、関数呼び出し、自動コマンド実行を含めた全てのコマン
                        ド実行) のエラー制御を変更する。

                        エラーや割り込みが検出された場合、後に:finallyコマン
                        ドがあるならば、":finally" の後から実行が継続される。
                        そうでなければ、または ":endtry" に達した後は次の動的
                        に囲んでいる ":try" に対応する ":finally" などが探され
                        る。その後スクリプトは実行を停止する。関数定義に引数
                        "abort" がついているかどうかは関係ない。
                        例:
                try | call Unknown() | finally | echomsg "cleanup" | endtry
                echomsg "not reached"

                        さらに、(動的に) ":try" と ":endtry" の内側にあるエラー
                        や割り込みは例外に変換される。そしてそれは:throwコマ
                        ンドによって投げたときと同様に捕捉できる(:catchを参
                        照)。この場合はスクリプトの実行は停止しない。

                        割り込み例外には "Vim:Interrupt" という値が使われる。
                        Vimコマンドにおけるエラーは "Vim({command}):{errmsg}"
                        という形式の値に変換される。その他のエラーは
                        "Vim:{errmsg}" という形式のエラーに変換される。ここで
                        {command}はコマンドの完全な名前であり、{errmsg}はその
                        例外が捕捉されなかった場合に表示されるメッセージで、常
                        にエラー番号で始まる。
                        例:
                try | sleep 100 | catch /^Vim:Interrupt$/ | endtry
                try | edit | catch /^Vim(edit):E\d\+/ | echo "error" | endtry

                                        :cat :catch E603 E604 E605
:cat[ch] /{pattern}/    {pattern}にマッチする例外が発生し、より前の:catch
                        で捕捉されなかった場合、このコマンドから次の:catch,
                        :finally:endtryまでのコマンドが実行される。その
                        ような例外が発生しなかった場合、そのコマンドはスキップ
                        される。
                        {pattern}が省略された場合は全てのエラーが捕捉される。
                        例:
                :catch /^Vim:Interrupt$/         " 割り込み (CTRL-C) を捕捉
                :catch /^Vim\%((\a\+)\)\=:E/     " 全Vimエラーを捕捉
                :catch /^Vim\%((\a\+)\)\=:/      " 例外と割り込みを捕捉
                :catch /^Vim(write):/            " :writeにおける全エラーを捕捉
                :catch /^Vim\%((\a\+)\)\=:E123:/ " エラーE123を捕捉
                :catch /my-exception/            " ユーザー定義例外を捕捉
                :catch /.*/                      " 全てを捕捉
                :catch                           " /.*/と同じ

                        {pattern}を囲むのに/以外の文字を使うことができる。ただ
                        しその文字は特別な意味(例: '|' や '"' など)を持ってい
                        てはならず、{pattern}の内側に現れてはならない。
                        例外の情報は v:exception で得られる。
                        throw-variables も参照。
                        NOTE: エラーメッセージの本文によって ":catch" すること
                        は確実ではない。メッセージはロケールによって異なるから
                        である。

                                        :fina :finally E606 E607
:fina[lly]              :tryと ":finally" の間を抜ける前に必ず、このコマンド
                        から対応する:endtryの間のコマンドが実行される。つま
                        り正常に進んだ場合、:continue:break:finish,
                        :returnを使った場合、エラー・割り込み・例外が発生し
                        た場合(:throwを参照)のいずれの場合でも。

                                                        :th :throw E608
:th[row] {expr1}        {expr1}を評価し、例外として投げる。:try:catch
                        間で ":throw" が使われた場合、{expr1}にマッチする最初
                        の:catchまでのコマンドはスキップされる。そのような
                        ":catch" がない場合、または ":catch" と:finallyの間
                        で ":throw" が使われた場合、":finally" から:endtry
                        でのコマンドが実行される。":throw" が ":finally" の後
                        で実行された場合、":endtry" までのコマンドはスキップさ
                        れる。
                        ":endtry" において、動的に囲んでいる次の ":try" (これ
                        は関数呼び出しやスクリプトsourceも含めて探される) から
                        対応する ":catch" までに対しこのプロセスが再び適用され
                        る。例外が捕捉されない場合、コマンドの処理は終了する。
                        例:
                :try | throw "oops" | catch /^oo/ | echo "caught" | endtry
                        Note: エラーによって行のパースがスキップされ、"|" によ
                        るコマンド区切りが解釈されないような場合は "catch" は
                        行を分けて書く必要がある。

                                                        :ec :echo
:ec[ho] {expr1} ..      各{expr1}をスペースで区切って表示する。最初の{expr1}
                        表示は、常に新しい行から始まる。
                        :commentも参照。
                        改行が必要な場合 "\n" を使用する。カーソルを第1桁に
                        持って行くには "\r" を使用する。
                        色強調を行うにはコマンド:echohlを使用する。
                        コメント文を同じ行に続けることはできない。
                        例:
                :echo "the value of 'shell' is" &shell
                                                        :echo-redraw
                        このコマンドの後、再描画を行うと表示したメッセージが消
                        えてしまう。Vim は一連のコマンドが完了するまで再描画を
                        後回しにするため、この現象は頻繁に発生する。例えば、
                        ":echo" より前に実行したコマンドが後で再描画を引き起こ
                        し、メッセージが消えてしまうということがある(再描画は
                        しばしばユーザーが何か入力するまで後回しにされる)。こ
                        の問題を避けるには、:redraw を使って強制的に再描画す
                        ること。例:
                :new | redraw | echo "there is a new window"


                                                        :echon
:echon {expr1} ..       改行を付けずに、{expr1}を表示する。:commentも参照。
                        色強調を行うにはコマンド:echohlを使用する。
                        コメント文を同じ行に続けることはできない。
                        例:
                                :echon "the value of 'shell' is " &shell

                        Vimコマンドの ":echo" と、外部のシェルコマンドである
                        ":!echo" との違いに注意:
                :!echo %                --> filename
                        ":!" の引数は展開される。:_%を参照。
                :!echo "%"              --> filename or "filename"
                        前の例のように働く。ダブルクォートが表示されるかどうか
                        は、使用している 'shell' に依存する。
                :echo %                 --> 何も表示されない
                        '%' は式として不当な文字である。
                :echo "%"               --> %
                        単に文字 '%' を表示する。
                :echo expand("%")       --> filename
                        '%' を展開するために関数expand()を呼び出している。

                                                        :echoh :echohl
:echoh[l] {name}        次の :echo:echon:echomsg コマンドから、ハイ
                        ライトグループ{name}を適用する。input()のプロンプト
                        に対しても適用される。例:
                :echohl WarningMsg | echo "Don't panic!" | echohl None
                        使用した後にはグループを "None" に戻すことを忘れないよ
                        うに。さもないとそれ以降のechoの表示全てがハイライトさ
                        れてしまう。

                                                        :echom :echomsg
:echom[sg] {expr1} ..   式を本当のメッセージとして表示し、そのメッセージをメッ
                        セージ履歴message-historyに保存する。
                        :echoコマンド同様に、引数の間にスペースが挿入される。
                        しかし印字不可能な文字は解釈されずに表示される。
                        :echoとはかなり異なり、むしろ:executeに近い方法で
                        解析がされる。なんらかを表示する前に、まず最初に全ての
                        式が数値または文字列に評価されない場合は、string() を
                        使用して文字列に変換する。
                        強調を行うには:echohlコマンドを使う。
                        例:
                :echomsg "It's a Zizzer Zazzer Zuzz, as you can plainly see."
                        画面を再描画したときメッセージが消去されてしまうのを避
                        ける方法については:echo-redrawを参照。
                                                        :echoe :echoerr
:echoe[rr] {expr1} ..   式をエラーメッセージとして表示し、そのメッセージを
                        メッセージ履歴message-historyに保存する。スクリプト
                        や関数の中で使用されたときは行番号が付け加えられる。
                        :echomsg コマンドと同様に引数の間にスペースが挿入さ
                        れる。try条件文の中で使用されたときは、このメッセージ
                        がエラー例外として投げられる。(try-echoerrを参照)
                        例:
                :echoerr "This script just failed!"

                        単にメッセージを強調させたい場合には:echohlを使うこ
                        と。ビープを鳴らしたいときには次のようにする:
                :exe "normal \<Esc>"


:echoc[onsole] {expr1} ..                               :echoc :echoconsole
                        テスト用である: :echomsg のように動作するが、GUI で
                        実行中で端末から起動した場合、標準出力にテキストを書き
                        出す。

                                                        :eval
:eval {expr}            {expr} を評価し結果を破棄する。例:
                                :eval Getlist()->Filter()->append('$')

                        結果の値は使用されないため、式には副作用があると想定さ
                        れる。この例では、append() 呼び出しはテキスト付きリ
                        ストをバッファに追加する。これは :call に似ている
                        が、どの式でも動作する。

                        このコマンドは :ev や :eva に短縮できるが、これら
                        は認識しにくいため、使用するべきでない。

                        このコマンドでは、"|" は式の一部として扱われるため、
                        "|" と他のコマンドを後ろに置けない。

                                                        :exe :execute
:exe[cute] {expr1} ..   {expr1}の評価結果の文字列をExコマンドとして実行する。
                        複数の引数は連結され、間にスペースが挿入される。余計な
                        スペースを入れたくない場合は ".." オペレータを使って文
                        字列を連結すること。
                        {expr1}は処理されたコマンドとして扱われ、コマンドライ
                        ン編集用のキーは認識されない。
                        コメント文を同じ行に続けることはできない。
                        例:
                :execute "buffer" nextbuf
                :execute "normal" count .. "w"

                        ":execute" は '|' を受けつけないコマンドに、次のコマン
                        ドを続けて実行させるのにも使用できる。例:
                :execute '!ls' | echo "theend"
                        {訳注: 普通の使い方では ":!ls" の後には '|' を使って、
                        Exコマンドを続けることはできない}
                        また ":execute" は、Vim script 内でコマンド ":normal"
                        の引数に制御文字を書くことを避けるために役に立つ。
                :execute "normal ixxx\<Esc>"
                        これで<Esc>文字を表す。expr-stringを参照。

                        ファイル名の中の特殊文字を正しくエスケープするように
                        注意すること。Vim コマンドに与えるファイル名をエス
                        ケープするには fnameescape() を使う。:! コマンドに
                        与えるときは shellescape() を使う。
                        例:
                :execute "e " .. fnameescape(filename)
                :execute "!ls " .. shellescape(filename, 1)

                        Note: execute に渡す文字列はいかなるコマンドでも構わな
                        いが、"if" や "while"、"for" の開始や終了は常に機能す
                        るとは限らない。なぜならコマンドをスキップするときには
                        ":execute" は解釈されないので Vim はブロックの開始や終
                        了を認識することができない。"break" と "continue" も
                        ":execute" で実行すべきではない。
                        次の例は機能しない。":execute" は評価されず、Vim は
                        "while" を認識しないので、":endwhile" を見つけたときに
                        エラーが発生する:
                :if 0
                : execute 'while i > 5'
                :  echo "test"
                : endwhile
                :endif

                        文字列の中に完全な "while" や "if" コマンドが含まれる
                        ことが求められる:
                :execute 'while i < 5 | echo i | let i = i + 1 | endwhile'


                                                        :exe-comment
                        ":execute" や ":echo" そして ":echon" は、同一行に直接
                        コメントを続けることはできない。何故ならそれらのコマン
                        ドにとって '"' は文字列の始まりに見えてしまうからであ
                        る。しかし '|' の後にコメントを書くことは可能である。
                        例:
                :echo "foo" | "this is a comment

==============================================================================
8. 例外処理                                     exception-handling

Vim script 言語は例外処理機構を備えている。この節では例外処理をどのように行
うかについて説明する。

例外はエラー発生時や割り込み発生時にVimによって投げられる。それについては
catch-errorscatch-interruptを参照。ユーザーはコマンド:throwによって明示
的に例外を投げることができる。throw-catchを参照。


TRY 条件文                                      try-conditionals

例外を捕捉したり、例外を引き金として後始末のコードを実行することができる。try
条件文を使う事によってcatch節(これが例外を捕捉する)やfinally節(後始末のために
実行される)を指定する事ができる。
try条件文はコマンド:tryによって始まり、対応するコマンド:endtryによって終了
する。その間でコマンド:catchによりcatch節を定めたり、コマンド:finally
よってfinally節を定めることができる。catch節は1個もなかったり、複数個あっても
よい。しかしfinally節は1個までしか持てない。finally節の後にcatch節があってはな
らない。catch節とfinally節の前の部分はtryブロックと呼ばれる。

     :try
     :  ...
     :  ...                             try ブロック
     :  ...
     :catch /{pattern}/
     :  ...
     :  ...                             catch 節
     :  ...
     :catch /{pattern}/
     :  ...
     :  ...                             catch 節
     :  ...
     :finally
     :  ...
     :  ...                             finally 節
     :  ...
     :endtry

try条件文により、コードから発生する例外を監視したり、適切な対応を取ることがで
きる。tryブロック内で発生した例外は捕捉される。tryブロックとcatch節内で発生し
た例外は捕捉され、後始末が行われる。
tryブロックの実行中に例外が発生しなかった場合は、制御は (もしあれば) finally節
に移動する。その実行後に、スクリプトは ":endtry" の後の行から実行を継続する。
tryブロックの実行中に例外が発生した場合は、tryブロックの残りの行はスキップされ
る。例外はコマンド ":catch" の引数として指定された正規表現に照合される。最初に
マッチした ":catch" の後のcatch節が実行される。他のcatch節は実行されない。
catch節は次に ":catch", ":finally", ":endtry" が現れたところで終了する (どれで
もよい)。
":endtry" に達すると、スクリプトは次の行から通常通り実行が続けられる。
発生した例外が、コマンド ":catch" で指定されたどの正規表現にもマッチしないとき、
その例外はそのtry条件文で捕捉されず、どのcatch節も実行されない。finally節があ
るならば実行される。finally節の実行中は例外は後回しにされ、":endtry" のときに
実行される。そして ":endtry" の後のコマンドは実行されず、例外は他のどこかで捕
捉される。try-nestingを参照。
catch節の実行中に新たな例外が発生した場合は、そのcatch節の残りの行は実行されな
い。新しい例外は同じtry条件文のどの ":catch" コマンドの正規表現にも照合されず、
どのcatch節も実行されない。しかしfinally節があるならばそこが実行され、その間そ
の例外は保留される。":endtry" の後のコマンドは実行されない。新しい例外は他のど
こかで捕捉される。try-nestingを参照。
finally節の実行中に例外が発生した場合は、そのfinally節の残りの行は実行されない。
tryブロックやそのcatch節のどこかで例外が発生してからそのfinally節が実行されて
いた場合は、元の(保留されていた)例外は破棄される。":endtry" の後のコマンドは実
行されない。finally節で発生した例外は伝播し、他のどこかで捕捉される。
try-nestingを参照。

完全なtry条件文を囲む ":while" ループ内で、tryブロックやcatch節において
":break" や ":continue" が実行されたときもfinally節が実行される。
また、関数の中やsourceされたスクリプト中で、tryブロックやtry条件文のcatch節に
おいて ":return" や ":finish" が実行されたときもfinally節が実行される。finally
節の実行中は ":break", ":continue", ":return", ":finish" は保留され、":endtry"
に達したとき再開される。しかしこれらは、そのfinally節内で例外が発生したときは
破棄される。
完全なtry条件節を囲む ":while" ループ内での ":break" や ":continue"、または
finally節内で ":return" や ":finish" に出会ったときは、finally節の残りはスキッ
プされ、通常通り ":break", "continue", ":return", "finish" が実行される。もし
そのfinally節の前に、tryブロックやcatch節内で例外が発生したり、":break",
":continue", ":return", ":finally" が行われていた場合は、それらの保留されてい
た例外やコマンドは破棄される。

例として throw-catch と try-finally を参照。


try条件文のネスト                                       try-nesting

try条件文は任意にネストさせられる。つまり、try条件文のtryブロック・catch節・
finally節のなかに別の完全なtry条件文を書くことができる。内側のtry条件文がtryブ
ロックで発生した例外を捕捉しなかったときや、catch節・finally節で新たな例外が発
生したときは、外側のtry条件文がそのルールにしたがって例外を捕捉する。内側の
try条件文が外側の条件文のtryブロックの中にある場合はcatch節が判定されるが、そ
うでない場合はfinally節のみが実行される。これはネストの仕方には関係ない。つま
り、内側のtry条件文が直接外側のtry条件文に含まれていてもよいし、外側がスクリプ
トをsourceしたり、内側のtry条件文を含む関数を呼び出していてもよい。

有効なtry条件文のどれも例外を捕捉しなかったときは、それらのfinally節が実行され
る。その後、スクリプトの実行は停止する。":throw" コマンドにより明示的に投げら
れた例外が捕捉されなかった場合は、エラーメッセージが表示される。Vimによって暗
黙的に投げられたエラーや割り込み例外については、通常通りエラーメッセージや割り
込みメッセージが表示される。

例として throw-catch を参照。


例外処理コードの検査                                    except-examine

例外処理のコードはトリッキーになりがちである。何が起こっているか知りたいときは
スクリプトファイルをsourceするときに 'verbose' を13に設定するか、コマンド修飾
子 ":13verbose" を使う。すると例外が発生・破棄・捕捉・完了したときには表示され
るようになる。冗長度のレベルを14以上にすると、finally節において保留されている
ものも表示されるようになる。この情報はデバッグモードでも表示される
(debug-scriptsを参照)。


例外の生成と捕捉                                        throw-catch

任意の数値や文字列を例外として投げることができる。コマンド:throwを使い、投げ
られる値を引数に渡す:
        :throw 4711
        :throw "string"
                                                        throw-expression
式を引数に指定することもできる。まずその式が評価され、その結果が投げられる:
        :throw 4705 + strlen("string")
        :throw strpart("strings", 0, 6)

":throw" コマンドの引数を評価している最中に例外が発生することもありうる。その
例外が捕捉されない限り、その式の評価は破棄される。
よって、その ":throw" コマンドは例外を投げることができない。
   例:

        :function! Foo(arg)
        :  try
        :    throw a:arg
        :  catch /foo/
        :  endtry
        :  return 1
        :endfunction
        :
        :function! Bar()
        :  echo "in Bar"
        :  return 4710
        :endfunction
        :
        :throw Foo("arrgh") + Bar()

この例を実行すると "arrgh" が投げられ、Bar()が実行されないため "in Bar" は表示
されない。しかし次のようにすると
        :throw Foo("foo") + Bar()
"in Bar" を表示し、4711を投げる。

式を引数として受け取る他のコマンドでも、式の評価中に捕捉されない例外が発生する
とコマンドが破棄される。そして例外はそのコマンドを呼び出した位置へ伝播する。
   例:

        :if Foo("arrgh")
        :  echo "then"
        :else
        :  echo "else"
        :endif

この例で、"then" と "else" のどちらも表示されない。

                                                        catch-order
例外は、1個以上の:catchコマンドを持つtry条件文で捕捉することができる。これに
ついてはtry-conditionalsを参照。各 ":catch" コマンドで捕捉される値は、引数に
て正規表現で指定できる。マッチする例外が捕捉されると、その後に続くcatch節が実
行される。
   例:

        :function! Foo(value)
        :  try
        :    throw a:value
        :  catch /^\d\+$/
        :    echo "Number thrown"
        :  catch /.*/
        :    echo "String thrown"
        :  endtry
        :endfunction
        :
        :call Foo(0x1267)
        :call Foo('string')

最初のFoo()の呼び出しは "Number thrown" を表示し、2番目の呼び出しは "String
thrown" を表示する。例外は、順番に ":catch" コマンドに照合される。最初にマッチ
したcatch節だけが実行される。そのため、より限定的な ":catch" を先に書くべきで
ある。次の順序で書くと無意味になってしまう:

        :  catch /.*/
        :    echo "String thrown"
        :  catch /^\d\+$/
        :    echo "Number thrown"

最初の ":catch" は常にマッチするため、2番目のcatch節は決して実行されない。

                                                        throw-variables
一般的な正規表現により例外を捕捉した場合、その正確な値には変数v:exception
よりアクセスできる:

        :  catch /^\d\+$/
        :    echo "Number thrown.  Value is" v:exception

また、どこで例外が発生したかも知りたいだろう。これはv:throwpointに保持されて
いる。Note "v:exception" と "v:throwpoint" は最も直近に捕捉された例外に対し、
それが終了するまで有効である。
   例:

        :function! Caught()
        :  if v:exception != ""
        :    echo 'Caught "' . v:exception . '" in ' . v:throwpoint
        :  else
        :    echo 'Nothing caught'
        :  endif
        :endfunction
        :
        :function! Foo()
        :  try
        :    try
        :      try
        :        throw 4711
        :      finally
        :        call Caught()
        :      endtry
        :    catch /.*/
        :      call Caught()
        :      throw "oops"
        :    endtry
        :  catch /.*/
        :    call Caught()
        :  finally
        :    call Caught()
        :  endtry
        :endfunction
        :
        :call Foo()

上の例は次のように表示する 

        Nothing caught
        Caught "4711" in function Foo, line 4
        Caught "oops" in function Foo, line 10
        Nothing caught

実用的な例:  次のコマンド ":LineNumber" は、それが呼び出されたスクリプトや関数
中の行番号を表示する:

        :function! LineNumber()
        :    return substitute(v:throwpoint, '.*\D\(\d\+\).*', '\1', "")
        :endfunction
        :command! LineNumber try | throw "" | catch | echo LineNumber() | endtry

                                                        try-nested
try条件文によって捕捉されない例外はそれを囲むtry条件文によって捕捉することがで
きる:

        :try
        :  try
        :    throw "foo"
        :  catch /foobar/
        :    echo "foobar"
        :  finally
        :    echo "inner finally"
        :  endtry
        :catch /foo/
        :  echo "foo"
        :endtry

内側のtry条件文はこの例外を捕捉せず、finally節が実行されるだけである。そしてこ
の例外は外側のtry条件文で捕捉される。この例を実行すると "inner finally" と
"foo" が表示される。

                                                        throw-from-catch
例外を捕捉した後、新しい例外を投げて他のcatch節で捕捉させることができる:

        :function! Foo()
        :  throw "foo"
        :endfunction
        :
        :function! Bar()
        :  try
        :    call Foo()
        :  catch /foo/
        :    echo "Caught foo, throw bar"
        :    throw "bar"
        :  endtry
        :endfunction
        :
        :try
        :  call Bar()
        :catch /.*/
        :  echo "Caught" v:exception
        :endtry

これを実行すると "Caught foo, throw bar" と "Caught bar" が表示される。

                                                        rethrow
Vim script言語には本物のrethrowはないが、代わりに "v:exception" を使うことがで
きる:

        :function! Bar()
        :  try
        :    call Foo()
        :  catch /.*/
        :    echo "Rethrow" v:exception
        :    throw v:exception
        :  endtry
        :endfunction
                                                        try-echoerr
Note この方法はVimのエラーや割り込み例外を "rethrow" するためには使えない。Vim
の内部例外を偽装することはできないからである。それを行おうとするとエラー例外が
発生する。その状況を表す自分自身の例外を投げるべきである。独自のエラー例外値を
含むVimのエラー例外を発生させたい場合には、コマンド:echoerrを使うことができ
る:

        :try
        :  try
        :    asdf
        :  catch /.*/
        :    echoerr v:exception
        :  endtry
        :catch /.*/
        :  echo v:exception
        :endtry

このコードを実行すると次が表示される

        Vim(echoerr):Vim:E492: Not an editor command:   asdf


後始末処理                                              try-finally

しばしばスクリプト中でグローバルな設定を変更し、最後に元の設定を復元することが
ある。しかしユーザーがCTRL-Cを押してスクリプトを中断すると、設定が一貫しない状
態になってしまう。スクリプトの開発段階においても、エラーが発生したり、明示的に
例外を投げたが捕捉されなかった場合に、同じことが起こりうる。この問題は、try条
件文を使ってfinally節で設定を復元することで解決できる。finally節は、通常の制御
フロー・エラー時・明示的な ":throw" 時・割り込み時に実行されることが保証されて
いる。(Note try条件文の内側で発生したエラーと割り込みは例外に変換される。これ
らが捕捉されなかったときには、finally節の実行の後にスクリプトの実行が停止す
る。)
例:

        :try
        :  let s:saved_ts = &ts
        :  set ts=17
        :
        :  " Do the hard work here.
        :
        :finally
        :  let &ts = s:saved_ts
        :  unlet s:saved_ts
        :endtry

関数やスクリプトの一部でグローバルな設定を変更し、その関数・スクリプトの失敗時・
通常終了時に設定を復元する必要があるときは、必ず局所的にこの手法を使うべきであ
る。

                                                        break-finally
":continue", ":break", ":return", ":finish" などによってtryブロックやcatch節を
抜けるときも後始末処理が働く。
   例:

        :let first = 1
        :while 1
        :  try
        :    if first
        :      echo "first"
        :      let first = 0
        :      continue
        :    else
        :      throw "second"
        :    endif
        :  catch /.*/
        :    echo v:exception
        :    break
        :  finally
        :    echo "cleanup"
        :  endtry
        :  echo "still in while"
        :endwhile
        :echo "end"

上の例を実行すると "first", "cleanup", "second", "cleanup", "end" と表示される:

        :function! Foo()
        :  try
        :    return 4711
        :  finally
        :    echo "cleanup\n"
        :  endtry
        :  echo "Foo still active"
        :endfunction
        :
        :echo Foo() "returned by Foo"

上の例を実行すると "cleanup" と "4711 returned by Foo" が表示される。finally節
に余計な ":return" を書く必要はない。(そうすると戻り値が上書きされてしまう)

                                                        except-from-finally
finally節で ":continue", ":break", ":return", ":finish", ":throw" を使うことは
可能である。しかしそうするとtry条件文の後始末を破棄してしまうことになるので推
奨されていない。しかし、当然、finally節の中で割り込みとエラー例外が発生するこ
とはありうる。
finally節におけるエラーにより、割り込みが正しく動作しなくなる例:

        :try
        :  try
        :    echo "Press CTRL-C for interrupt"
        :    while 1
        :    endwhile
        :  finally
        :    unlet novar
        :  endtry
        :catch /novar/
        :endtry
        :echo "Script still running"
        :sleep 1

失敗する可能性のあるコマンドをfinally節に書く必要があるときは、それらのコマン
ドにより発生するエラーを捕捉したり無視したりすることについて考えること。
catch-errors と ignore-errors を参照。


エラーを変更する                                        catch-errors

特定のエラーを捕捉するには、監視したいコードをtryブロックに入れ、そのエラー
メッセージに対するcatch節を加えるだけでよい。try条件節が存在すると全てのエラー
は例外に変換される。そのため、メッセージはまったく表示されず、v:errmsgは設定
されない。":catch" コマンドに対する正しい正規表現を作るには、エラー例外のフォー
マットがどのようなものか知っていなければならない。
   エラー例外は次のフォーマットを持つ:

        Vim({cmdname}):{errmsg}
または
        Vim:{errmsg}

{cmdname}は失敗したコマンド名である。2番目の形式はコマンド名が不明のとき用いら
れる。{errmsg}は、そのエラーがtry条件文の外で発生したときに通常表示されるエラー
メッセージである。エラーメッセージは必ず大文字の "E" で始まり、その後に2,3桁の
エラー番号、コロン、スペースが続く。

例:

次のコマンドを実行すると、
        :unlet novar
通常次のエラーメッセージが表示される 
        E108: No such variable: "novar"
これはtry条件文の中では例外に変換される
        Vim(unlet):E108: No such variable: "novar"

次のコマンドを実行すると、
        :dwim
通常次のエラーメッセージが表示される 
        E492: Not an editor command: dwim
これはtry条件文の中では例外に変換される
        Vim:E492: Not an editor command: dwim

":unlet" の全てのエラーを次によって捕捉できる
        :catch /^Vim(unlet):/
また、全てのミススペルされたコマンドのエラーは次で捕捉できる 
        :catch /^Vim:E492:/

複数のコマンドによって同一のエラーメッセージが表示される場合もある:
        :function nofunc
と 
        :delfunction nofunc
は両方とも次のエラーメッセージを表示する。
        E128: Function name must start with a capital: nofunc
これはtry条件節の中では例外に変換される。それぞれ
        Vim(function):E128: Function name must start with a capital: nofunc
または 
        Vim(delfunction):E128: Function name must start with a capital: nofunc
となる。どのコマンドによって発生したかに関係なくこのエラーを捕捉するには、次の
正規表現を使う:
        :catch /^Vim(\a\+):E128:/

複数のエラーメッセージを表示するコマンドもある: 
        :let x = novar
は次のエラーメッセージを表示する:
        E121: Undefined variable: novar
        E15: Invalid expression:  novar
最初のエラーメッセージのみが例外の値として使われる。それが最も限定的なメッセー
ジだからである(except-several-errorsを参照)。これは次のようにして捕捉できる

        :catch /^Vim(\a\+):E121:/

"nofunc" という名前に関係したエラー全てを捕捉するには
        :catch /\<nofunc\>/

コマンド ":write" と ":read" による全てのVimエラーを捕捉するには
        :catch /^Vim(\(write\|read\)):E\d\+:/

全てのVimエラーを捕捉するには次の正規表現を使う
        :catch /^Vim\((\a\+)\)\=:E\d\+:/

                                                        catch-text
NOTE: エラーメッセージの本文によって捕捉しようとしてはならない
        :catch /No such variable/
こうすると英語の環境では動作するが、コマンド :languageにより他の言語を使って
いるユーザーの環境では動作しなくなる。しかし、コメントとしてメッセージテキスト
を引用することは役に立つ:
        :catch /^Vim(\a\+):E108:/   " No such variable

エラーを無視する                                        ignore-errors

特定のコマンドで発生したエラーを捕捉すれば、エラーを無視することができる:

        :try
        :  write
        :catch
        :endtry

しかしこの単純な形は使わないよう強く推奨されている。なぜなら、これはあなたが望
むより多くの例外を捕捉してしまうからである。":write" コマンドを使うと自動コマ
ンドが実行され、書き込みとは関係ないエラーが発生する可能性がある。例えば:

        :au BufWritePre * unlet novar

このようなエラーの中には、スクリプトの作者が責任を負わないものもある: つまり、
スクリプトのユーザーがそのような自動コマンドを定義している場合である。その場
合、上の例のようにすると、ユーザーからエラーを隠してしまうことになる。エラーを
無視するには、次のようにした方がよい

        :try
        :  write
        :catch /^Vim(write):/
        :endtry

これは書き込みエラーだけを捕捉する。つまり、あなたが意図的に無視したいエラーだ
けである。

自動コマンドを発生させないような1つのコマンドに対しては、":silent!" を使えばエ
ラーを例外に変換すること自体を抑制させることができる:
        :silent! nunmap k
これはtry条件文が有効なときも機能する。


割り込みを捕捉する                                      catch-interrupt

有効なtry条件文内では、割り込み(CTRL-C)は例外 "Vim:Interrupt" に変換される。こ
れを他の例外と同様に捕捉することができる。するとそのスクリプトは停止しない。
   例:

        :function! TASK1()
        :  sleep 10
        :endfunction

        :function! TASK2()
        :  sleep 20
        :endfunction

        :while 1
        :  let command = input("Type a command: ")
        :  try
        :    if command == ""
        :      continue
        :    elseif command == "END"
        :      break
        :    elseif command == "TASK1"
        :      call TASK1()
        :    elseif command == "TASK2"
        :      call TASK2()
        :    else
        :      echo "\nIllegal command:" command
        :      continue
        :    endif
        :  catch /^Vim:Interrupt$/
        :    echo "\nCommand interrupted"
        :    " 例外捕捉。次のプロンプトから継続する。
        :  endtry
        :endwhile

ここでCTRL-Cを押すとタスクに割り込むことができる。その後スクリプトは新しいコマ
ンドを要求する。プロンプトでCTRL-Cを押すとスクリプトが終了する。

スクリプト中の特定の行でCTRL-Cが押されたとき何が起こるかをテストするにはデバッ
グモードを使い、その行の上で>quit>interruptコマンドを使う。
debug-scriptsを参照。


全てを捕捉する                                          catch-all

次のコマンド

        :catch /.*/
        :catch //
        :catch

は全てをエラー例外・割り込み例外・:throwコマンドにより明示的に投げられた例外
の捕捉する。これは、スクリプトのトップレベルで、予期しないことを捕捉するために
役に立つ。
   例:

        :try
        :
        :  " ここで難しいことをする
        :
        :catch /MyException/
        :
        :  " 既知の問題を制御する
        :
        :catch /^Vim:Interrupt$/
        :    echo "Script interrupted"
        :catch /.*/
        :  echo "Internal error (" . v:exception . ")"
        :  echo " - occurred at " . v:throwpoint
        :endtry
        :" スクリプトの終わり

Note: 全てを捕捉すると、期待していた以上のものを捕捉してしまうかもしれない。そ
れゆえ、":catch" コマンドの引数に正規表現を指定することにより、自分が本当に制
御できる問題だけを捕捉することが強く推奨されている。
全てを捕捉してしまうと、CTRL-C を押してスクリプトを中断することがほぼ不可能に
なってしまうことがある。その例:

        :while 1
        :  try
        :    sleep 1
        :  catch
        :  endtry
        :endwhile


例外と自動コマンド                              except-autocmd

自動コマンドの実行中に例外を使うこともできる。例:

        :autocmd User x try
        :autocmd User x   throw "Oops!"
        :autocmd User x catch
        :autocmd User x   echo v:exception
        :autocmd User x endtry
        :autocmd User x throw "Arrgh!"
        :autocmd User x echo "Should not be displayed"
        :
        :try
        :  doautocmd User x
        :catch
        :  echo v:exception
        :endtry

上の例を実行すると "Oops!" と "Arrgh!" が表示される。

                                                        except-autocmd-Pre
いくつかのコマンドでは、それ自身が実行される前に自動コマンドが実行される。例外
が発生し、それが一連の自動コマンドの中で捕捉されない場合、一連の自動コマンド
と、その引き金となったコマンドは破棄され、例外がそのコマンドを呼んだ位置へ伝播
する。
   例:

        :autocmd BufWritePre * throw "FAIL"
        :autocmd BufWritePre * echo "Should not be displayed"
        :
        :try
        :  write
        :catch
        :  echo "Caught:" v:exception "from" v:throwpoint
        :endtry

ここで ":write" コマンドは現在編集しているファイルを書き込まない ('modified'
を確認すればわかる)。BufWritePreの自動コマンドで発生した例外により、":write"
が破棄されたためである。そしてその例外は捕捉され、次を表示する:

        Caught: FAIL from BufWrite Auto commands for "*"

                                                        except-autocmd-Post
いくつかのコマンドでは、それ自身が実行された後で自動コマンドが実行される。引き
金となったコマンド自身が失敗して、それが有効なtry条件文の内側にあった場合、自
動コマンドはスキップされ、エラー例外が発生する。その例外は、コマンドを呼んだ位
置で捕捉することができる。
   例:

        :autocmd BufWritePost * echo "File successfully written!"
        :
        :try
        :  write /i/m/p/o/s/s/i/b/l/e
        :catch
        :  echo v:exception
        :endtry

この例は次を表示する:

        Vim(write):E212: Can't open file for writing (/i/m/p/o/s/s/i/b/l/e)

引き金となったコマンドが失敗したときでさえも自動コマンドを実行したいという場合
は、catch節の中でそのイベントを引き起こすことできる。
   例:

        :autocmd BufWritePre  * set noreadonly
        :autocmd BufWritePost * set readonly
        :
        :try
        :  write /i/m/p/o/s/s/i/b/l/e
        :catch
        :  doautocmd BufWritePost /i/m/p/o/s/s/i/b/l/e
        :endtry

":silent!" を使うこともできる:

        :let x = "ok"
        :let v:errmsg = ""
        :autocmd BufWritePost * if v:errmsg != ""
        :autocmd BufWritePost *   let x = "after fail"
        :autocmd BufWritePost * endif
        :try
        :  silent! write /i/m/p/o/s/s/i/b/l/e
        :catch
        :endtry
        :echo x

上の例は "after fail" を表示する。

引き金となったコマンドが失敗しなかった場合、自動コマンドから発生した例外は、元
のコマンドを呼んだ位置から捕捉できる:

        :autocmd BufWritePost * throw ":-("
        :autocmd BufWritePost * echo "Should not be displayed"
        :
        :try
        :  write
        :catch
        :  echo v:exception
        :endtry

                                                        except-autocmd-Cmd
いくつかのコマンドでは、通常の処理を一連の自動コマンドで置き換えることができ
る。そのコマンド列で発生した例外は元のコマンドの呼び出し位置で捕捉できる。
   例: ":write" コマンドでは、例外が発生したとき、呼び出し側は実際にファイルが
書き込まれたのかどうかを知ることができない。これを教える必要があるときは、なん
らかの手段を使わねばならない。

        :if !exists("cnt")
        :  let cnt = 0
        :
        :  autocmd BufWriteCmd * if &modified
        :  autocmd BufWriteCmd *   let cnt = cnt + 1
        :  autocmd BufWriteCmd *   if cnt % 3 == 2
        :  autocmd BufWriteCmd *     throw "BufWriteCmdError"
        :  autocmd BufWriteCmd *   endif
        :  autocmd BufWriteCmd *   write | set nomodified
        :  autocmd BufWriteCmd *   if cnt % 3 == 0
        :  autocmd BufWriteCmd *     throw "BufWriteCmdError"
        :  autocmd BufWriteCmd *   endif
        :  autocmd BufWriteCmd *   echo "File successfully written!"
        :  autocmd BufWriteCmd * endif
        :endif
        :
        :try
        :       write
        :catch /^BufWriteCmdError$/
        :  if &modified
        :    echo "Error on writing (file contents not changed)"
        :  else
        :    echo "Error after writing"
        :  endif
        :catch /^Vim(write):/
        :    echo "Error on writing"
        :endtry

バッファに変更を行った後でこのスクリプトを数回sourceすると、1回目は次のように
表示される
        File successfully written!
2回目は
        Error on writing (file contents not changed)
3回目は
        Error after writing
以下同様。

                                                        except-autocmd-ill
異なるイベントに対する自動コマンドにわたってtry条件文を展開することはできない。
以下のコードは不正である:

        :autocmd BufWritePre  * try
        :
        :autocmd BufWritePost * catch
        :autocmd BufWritePost *   echo v:exception
        :autocmd BufWritePost * endtry
        :
        :write


例外の階層と付加情報つき例外                            except-hier-param

プログラミング言語の中には例外クラスを階層化したり、例外クラスのオブジェクトに
付加的な情報を渡すことができるものがある。これと似たことをVimでもできる。
階層構造を持った例外を投げるには、各部分をコロンで区切った完全なクラス名を投げ
ればよい。例えば、数学ライブラリ内でオーバーフローが発生したときに
"EXCEPT:MATHERR:OVERFLOW" を投げる。
例外クラスに付加的な情報を与えたいときは、それを括弧の中に書く。例えば、
"myfile" の書き込み中にエラーが発生したときに文字列 "EXCEPT:IO:WRITEERR(myfile)"
を投げる。
":catch" コマンドにおいて適切な正規表現を使えば、階層の基底クラスや派生クラス
を捕捉できる。括弧の中の付加情報は、":substitute" コマンドを使ってv:exception
から切り出すことができる。
例:

        :function! CheckRange(a, func)
        :  if a:a < 0
        :    throw "EXCEPT:MATHERR:RANGE(" . a:func . ")"
        :  endif
        :endfunction
        :
        :function! Add(a, b)
        :  call CheckRange(a:a, "Add")
        :  call CheckRange(a:b, "Add")
        :  let c = a:a + a:b
        :  if c < 0
        :    throw "EXCEPT:MATHERR:OVERFLOW"
        :  endif
        :  return c
        :endfunction
        :
        :function! Div(a, b)
        :  call CheckRange(a:a, "Div")
        :  call CheckRange(a:b, "Div")
        :  if (a:b == 0)
        :    throw "EXCEPT:MATHERR:ZERODIV"
        :  endif
        :  return a:a / a:b
        :endfunction
        :
        :function! Write(file)
        :  try
        :    execute "write" fnameescape(a:file)
        :  catch /^Vim(write):/
        :    throw "EXCEPT:IO(" . getcwd() . ", " . a:file . "):WRITEERR"
        :  endtry
        :endfunction
        :
        :try
        :
        :  " 計算やI/Oを行う
        :
        :catch /^EXCEPT:MATHERR:RANGE/
        :  let function = substitute(v:exception, '.*(\(\a\+\)).*', '\1', "")
        :  echo "Range error in" function
        :
        :catch /^EXCEPT:MATHERR/        " catches OVERFLOW and ZERODIV
        :  echo "Math error"
        :
        :catch /^EXCEPT:IO/
        :  let dir = substitute(v:exception, '.*(\(.\+\),\s*.\+).*', '\1', "")
        :  let file = substitute(v:exception, '.*(.\+,\s*\(.\+\)).*', '\1', "")
        :  if file !~ '^/'
        :    let file = dir . "/" . file
        :  endif
        :  echo 'I/O error for "' . file . '"'
        :
        :catch /^EXCEPT/
        :  echo "Unspecified error"
        :
        :endtry

エラー時やCTRL-Cを押したときにVim自身によって投げられる例外は平坦な階層になっ
ている: つまりこれらは全て "Vim" クラスに入っている。ユーザーは接頭辞 "Vim" を
つけた例外を投げることはできない。これらはVim用に予約されている。
Vimのエラー例外は失敗したコマンドの名前(わかっているならば)という付加情報がつ
いている。catch-errorsを参照。


変わった特性
                                                        except-compat
例外制御のコンセプトは、例外を引き起こしたコマンドは即座に異常終了し、制御が
finally節またはcatch節に移るという前提に基づいている。

Vim script言語では、エラーの後もスクリプトや関数が処理を続行する場合がある。
"abort" フラグのない関数や、":silent!" をつけて実行されたコマンドでは、制御は
次の行、そして関数の外へ移り、制御フローは最外側の ":endwhile" や ":endif" の
次の行へ移る。一方、エラーは例外と同様に捕捉できるべきである (つまり、即座に異
常終了することが要求される)。

この問題は、try条件文が有効なときだけエラーを例外に変換し、(":silent!" で抑制
されていない限り)即座に異常終了することで解決される。(エラー)例外は有効なtry条
件文でのみ捕捉可能であるため、これはなんら制約とはならない。エラーを捕捉せずに
即座に終了してほしいなら、単にcatch節を持たないtry条件文を使えばよい。(finally
節を指定すれば、終了の前に後始末処理を行うことができる)

有効なtry条件文がないとき、即座の異常終了でなく、通常の異常終了と継続が行われ
る。これによってVim6.1以前用に書かれたスクリプトの互換性を保証している。

しかし、有効なtry条件文の中から、例外処理コマンドを使っていない既存のスクリプ
トをsourceする(またはその関数の1つを呼ぶ)と、エラー発生時に既存のスクリプトの
制御フローが変わるかもしれない。エラー発生時に即座に異常終了し、新しい方のスク
リプト内でエラーを捕捉できる。しかしsourceされたスクリプトが ":silent!" コマン
ドでエラーメッセージを抑制していた場合(それが適切なスクリプトならv:errmsg
見ることでエラーを確認している)、実行パスは変わらない。そのエラーは例外に変換
されない(:silentを参照)。これが起こる残りのただ1つの原因は、エラーに関心を
払っていなく、エラーメッセージを表示させるスクリプトである。おそらく新しいスク
リプトからそのようなコードを使いたいとは思わないだろう。

                                                        except-syntax-err
例外処理コマンドにおける構文エラーは、それが属するtry条件文のどの ":catch" コ
マンドでも決して捕捉されない。しかしfinally節は実行される。
   例:

        :try
        :  try
        :    throw 4711
        :  catch /\(/
        :    echo "in catch with syntax error"
        :  catch
        :    echo "inner catch-all"
        :  finally
        :    echo "inner finally"
        :  endtry
        :catch
        :  echo 'outer catch-all caught "' . v:exception . '"'
        :  finally
        :    echo "outer finally"
        :endtry

上の例を実行すると次が表示される:
    inner finally
    outer catch-all caught "Vim(catch):E54: Unmatched \("
    outer finally
元の例外は破棄され、代わりにエラー例外が投げられる。

{訳注: throw 4711により例外が発生したが、その後の catch /\(/ に構文エラーがあ
       るためエラー例外が発生し、最初の例外は破棄された。}

                                                        except-single-line
コマンド ":try", ":catch", ":finally", ":endtry" は1行の中に書くことができる。
しかし構文エラーがあったとき "catch" の行を認識するのが難しくなるので、避けた
方がよい。
   例:
        :try | unlet! foo # | catch | endtry
この例は ":unlet!" の後に余計な文字があるためエラー例外を発生させる。そして
":catch" と ":endtry" が認識されないため、この例外は破棄され、"E488: Trailing
characters" のメッセージが表示される。

                                                        except-several-errors
1つのコマンドにより複数のエラーが発生した場合、普通は最初のエラーメッセージが
最も限定的であるため、それがエラー例外に変換される。
   例:
        echo novar
は次を発生させる:
        E121: Undefined variable: novar
        E15: Invalid expression: novar
try条件文の中のエラー例外の値は次になる:
        Vim(echo):E121: Undefined variable: novar
                                                        except-syntax-error
しかし、同じコマンドにおいて通常のエラーの後に構文エラーが検出されたときは、構
文エラーが例外として投げられる。
   例:
        unlet novar #
これは次を発生させる:
        E108: No such variable: "novar"
        E488: Trailing characters
try条件文の中のエラー例外の値は次になる:
        Vim(unlet):E488: Trailing characters
この理由は、構文エラーによってユーザーが予期していない実行パスになってしまうか
もしれないためである。例:
        try
            try | unlet novar # | catch | echo v:exception | endtry
        catch /.*/
            echo "outer catch:" v:exception
        endtry
これは "outer catch: Vim(unlet):E488: Trailing characters" を表示し、次にエラー
メッセージ "E600: Missing :endtry" が表示される。except-single-lineを参照。

==============================================================================
9. 例                                                       eval-examples

16進数で表示する

  :" 関数 Nr2Bin() は数値の2進文字列表現を返す。
  :func Nr2Bin(nr)
  :  let n = a:nr
  :  let r = ""
  :  while n
  :    let r = '01'[n % 2] . r
  :    let n = n / 2
  :  endwhile
  :  return r
  :endfunc

  :" 関数 String2Bin() は文字列中の各文字を2進文字列に変換して、ハイフン(-)で
  :" 区切って返す。
  :func String2Bin(str)
  :  let out = ''
  :  for ix in range(strlen(a:str))
  :    let out = out . '-' . Nr2Bin(char2nr(a:str[ix]))
  :  endfor
  :  return out[1:]
  :endfunc

使い方の例:
  :echo Nr2Bin(32)
結果: "100000"
  :echo String2Bin("32")
結果: "110011-110010"



行をソート(並べ替え)する (by Robert Webb)

以下は、指定した比較関数を使って行をソートする例である。

  :func SortBuffer()
  :  let lines = getline(1, '$')
  :  call sort(lines, function("Strcmp"))
  :  call setline(1, lines)
  :endfunction

ワンライナーにすると次のようになる:
  :call setline(1, sort(getline(1, '$'), function("Strcmp")))

scanf() の代替
                                                        sscanf
Vimにはsscanf()に相当する関数が無い。行の一部を取り出す必要がある場合には、
matchstr()やsubstitute()を使えば実現できる。以下の例は、"foobar.txt, 123, 45"
というような行から、ファイル名と行番号とカラム番号を取り出す方法を示している。

   :" 正規表現を設定
   :let mx='\(\f\+\),\s*\(\d\+\),\s*\(\d\+\)'
   :" 正規表現全体にマッチする部分を取り出す
   :let l = matchstr(line, mx)
   :" マッチ結果から各要素を取り出す
   :let file = substitute(l, mx, '\1', '')
   :let lnum = substitute(l, mx, '\2', '')
   :let col = substitute(l, mx, '\3', '')

入力は変数 "line"、結果は "file" と "lnum" と "col" に格納される(このアイデア
はMichael Geddesによる)。


辞書からscriptnamesを取り出す
                                                scriptnames-dictionary
コマンド:scriptnamesにより今までにsourceされた全てのスクリプトファイルのリス
トを取得することができる。これと等価な関数や変数は存在しない(めったに必要にな
らないからである)。そのような場合には次のコードが利用できる:
    " ":scriptnames" の出力を変数scriptnames_outputに入れる。
    let scriptnames_output = ''
    redir => scriptnames_output
    silent scriptnames
    redir END

    " 出力を行のリストに分割し、各行をパースする。辞書 "scripts" に要素を追加
    " する。
    let scripts = {}
    for line in split(scriptnames_output, "\n")
      " 空行以外に対して実行
      if line =~ '\S'
        " 行内の最初の番号を取得
        let nr = matchstr(line, '\d\+')
        " ファイル名を取得。スクリプト番号" 123: "を削除。
        let name = substitute(line, '.\+:\s*', '', '')
        " 辞書に要素を追加
        let scripts[nr] = name
      endif
    endfor
    unlet scriptnames_output

==============================================================================
10. Vim scriptバージョン        vimscript-version vimscript-versions
                                                        scriptversion
時間が経つにつれて多くの機能がVim scriptに追加された。これにはExコマンド、関
数、変数タイプなどが含まれる。それぞれの個々の機能は has() と exists()関数
でチェックできる。

時々、機能の古い構文がVimをより良くすることを妨げることがある。サポートが奪わ
れると、これは古いVim scriptを壊すだろう。これを明確にするために
:scriptversion コマンドを使うことができる。Vim scriptが古いバージョンのVimと
互換性がない場合、不可解な方法で失敗するのではなく、明示的なエラーを与える。

                                                        scriptversion-1 
 :scriptversion 1
        これはオリジナルのVim scriptであり、:scriptversion コマンドを使用し
        ていないのと同じである。行の範囲について古い構文に戻るために使用するこ
        とができる。以下でサポートを検査する:
                has('vimscript-1')

                                                        scriptversion-2 
 :scriptversion 2
        "." による文字列連結はサポートされていない、代わりに ".." を使用するこ
        と。これにより、Dictメンバーアクセスと浮動小数点数に "." を使用するこ
        とによる曖昧さが回避される。".5" は数値 0.5 を意味する。

                                                        scriptversion-3 
 :scriptversion 3
        すべてのVimの定義済変数 vim-variable には "v:" という接頭辞を付けな
        ければならない。例えば "version" は v:version とは違うので、普通の変
        数として使うことができる。
        "count" やその他のいくつかの分かり切った名前でも同様である。

        以下でサポートを検査する:
                has('vimscript-3')

                                                        scriptversion-4 
 :scriptversion 4
        先頭が 0 の数字は8進数として認識されない。"0o" もしくは "0O" は引き続
        き8進数として認識される。以前のバージョンでは以下が得られる:
                echo 017   " 15 を表示 (8進数)
                echo 0o17  " 15 を表示 (8進数)
                echo 018   " 18 を表示 (10進数)
        script version 4 では:
                echo 017   " 17 を表示 (10進数)
                echo 0o17  " 15 を表示 (8進数)
                echo 018   " 18 を表示 (10進数)
        数字の中に一重引用符を使用して読みやすくすることもできる:
                echo 1'000'000
        引用符は数字で囲まれている必要がある。

        以下でサポートを検査する:
                has('vimscript-4')

==============================================================================
11. +eval機能が無効                             no-eval-feature

コンパイル時に+eval機能が無効とされている場合、全ての式評価(eval)コマンドは
提供されない。その場合、Vim script が全ての種類のエラーを引き起こすことを避
ける為、":if" と ":endif" は解釈される。":if" とそれに対応する ":endif" に挟ま
れた内容は無視される。":if" の後に続く引数も無視される。この ":if" コマンドは
ネスティングが可能である。しかし必ず行の先頭に書かれている必要がある。":else"
コマンドは認識されない。

+eval 機能が存在しなかった場合、どのようにコマンドが実行を免れるかの例:

        :if 1
        :  echo "Expression evaluation is compiled in"
        :else
        :  echo "You will _never_ see this message"
        :endif

+eval 機能が無効になっている場合にのみコマンドを実行するには、2つの方法があ
る。最も簡単なのは、スクリプト(またはVim)を途中で終了することである:
        if 1
           echo "commands executed with +eval"
           finish
        endif
        args  " command executed without +eval

スクリプトのロードを中止したくない場合は、次の例に示すようなトリックを使用する
ことができる:

        silent! while 0
          set history=111
        silent! endwhile

+eval 機能が有効なとき、"while 0" のためにコマンドはスキップされる。+eval
機能がない場合、"while 0" はエラーとなり黙って無視されるため、コマンドが実行さ
れる。

==============================================================================
12. サンドボックス                              eval-sandbox sandbox E48

オプション 'foldexpr''formatexpr''includeexpr''indentexpr',
'statusline''foldtext' はサンドボックスの中で評価される。これによって、悪質
な副作用を持つ式からの保護がなされている。これによって、これらのオプションが
モードラインから設定された場合にある種の安全性がもたらされている。tagsファイル
からのコマンドが実行されたときとコマンドラインでのCTRL-R =に対してもサンドボッ
クスが使われる。
コマンド:sandboxに対してもサンドボックスが使われる。

サンドボックス内では以下の事が禁止される:
        - バッファの変更
        - マッピング、自動コマンド、ユーザー定義コマンドの定義・変更
        - ある種のオプションの設定 (option-summaryを参照)
        - ある種のVim定義済変数(v:)の設定 (v:varを参照)  E794
        - シェルコマンドの実行
        - ファイルの読み書き
        - 他のバッファへの移動・ファイルを開く
        - Python, Perl等のコマンドの実行
これは100%安全と保証するものではない。しかし、ある種の攻撃を防ぐ事はできるはず
である。

                                                        :san :sandbox
:san[dbox] {cmd}        サンドボックス内で{cmd}を実行する。モードラインから設
                        定された可能性のあるオプションを評価するために使える。
                        例: 'foldexpr'.

                                                        sandbox-option
いくつかのオプションは式を含んでいる。その式を評価するときはセキュリティ上の危
険性を回避するためにサンドボックス内で行わねばならない。しかしサンドボックスに
は制限があるので、これはそのオプションが安全でない場所で設定されたときのみ行わ
れる。ここで「安全でない」とは次の場合をいう:
- カレントディレクトリの .vimrc や .exrc を source するとき
- サンドボックス内で実行している最中
- モードラインから設定された値
- サンドボックス内で定義された関数の実行

Note サンドボックス内でオプションの値を退避し、それから復元した場合、そのオプ
ションはやはりサンドボックス内で設定されたものとマークされる。

==============================================================================
13. テキストロック                                              textlock

いくつか状況においては、バッファを変更する・他のウィンドウへジャンプするなど、
Vimの現在の処理を混乱させたり破壊してしまうような動作は禁止される。これはVimが
実際に他の何かをしているときに起こることに対して当てはまる。例えば、
'balloonexpr' の評価は、マウスカーソルがある位置に留まっているどんなときにでも
起こりうる。

テキストロックが有効になっているときは、以下の事が禁止される:
        - バッファのテキスト変更
        - 他のバッファやウィンドウへの移動
        - 他のファイルを開く
        - ウィンドウを閉じたりVimを終了したり
        - その他

 vim:tw=78:ts=8:noet:ft=help:norl: