Nvim の :help
ページは、生成されたもので、ソースをtree-sitter-vimdocパーサーを使用して作成されています。
{"blue": "#0000ff", "red": "#ff0000"} #{blue: "#0000ff", red: "#ff0000"}Blob: バイナリラージオブジェクト。任意のバイトシーケンスを格納します。詳細については Blob を参照してください。例: 0zFF00ED015DAF 0z は空のBlobです。
:echo "0100" + 0
:if "foo" :" NOT executed"foo" は 0 に変換され、これは FALSE を意味します。文字列がゼロ以外の数値で始まる場合は TRUE を意味します。
:if "8foo" :" executed空でない文字列をテストするには、empty() を使用します。
:if !empty("foo")
:let Fn = function("MyFunc") :echo Fn()
:function dict.init() dict : let self.val = 0 :endfunction辞書のキーは小文字で始めることができます。実際の関数名はここでは使用されません。numbered-function も参照してください。
:call Fn() :call dict.init()参照されている関数の名前は string() で取得できます。
:let func = string(Fn)関数参照を呼び出し、引数にリスト変数を使用するには call() を使用できます。
:let r = call(Fn, mylist)
let Cb = function('Callback', ['foo'], myDict) call Cb('bar')これは、次のように使用した場合と同じように関数を呼び出します
call myDict.Callback('foo', 'bar')関数が辞書のメンバーである場合にも、関数を辞書にバインドすることが発生することに注意してください。
let myDict.myFunction = MyFunction call myDict.myFunction()ここで、MyFunction() は "self" として myDict を渡されます。これは、"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" になります。これは、明示的にバインドされたためです。
:let mylist = [1, two, 3, "four"] :let emptylist = []項目は任意の式にできます。項目にリストを使用すると、リストのリストが作成されます。
:let nestlist = [[11, 12], [21, 22], [31, 32]]最後の項目の後の余分なコンマは無視されます。
:let item = mylist[0] " get the first item: 1 :let item = mylist[2] " get the third item: 3結果の項目がリストである場合は、これを繰り返すことができます。
:let item = nestlist[0][1] " get the first list, second item: 12
:let last = mylist[-1] " get the last item: "four"無効なインデックスでエラーが発生するのを防ぐには、get() 関数を使用します。項目が利用できない場合は、ゼロまたは指定したデフォルト値を返します。
:echo get(mylist, idx) :echo get(mylist, idx, "NONE")
:let longlist = mylist + [5, 6] :let longlist = [5, 6] + mylist項目を先頭に追加または末尾に追加するには、[] で囲んでリストに変換します。
:let mylist += [7, 8] :call extend(mylist, [7, 8])
:let shortlist = mylist[2:-1] " get List [3, "four"]最初のインデックスを省略するとゼロに類似します。最後のインデックスを省略すると、-1 に類似します。
:let endlist = mylist[2:] " from item 2 to the end: [3, "four"] :let shortlist = mylist[2:2] " List with one item: [3] :let otherlist = mylist[:] " make a copy of the List最後のインデックスは包含的であることに注意してください。排他的なインデックスを使用したい場合は、slice()メソッドを使用してください。
:let mylist = [0, 1, 2, 3] :echo mylist[2:8] " result: [2, 3]注意: mylist[s:e] は、変数 "s:e" をインデックスとして使用することを意味します。「:」の前に単一の文字変数を使用する場合は注意してください。必要に応じてスペースを挿入してください: mylist[s : e]。
:let aa = [1, 2, 3] :let bb = aa :call add(aa, 4) :echo bb
:let aa = [[1, 'a'], 2, 3] :let bb = copy(aa) :call add(aa, 4) :let aa[0][1] = 'aaa' :echo aa
:echo bb
:let alist = [1, 2, 3] :let blist = [1, 2, 3] :echo alist is blist
:echo alist == blist
echo 4 == "4"
echo [4] == ["4"]
:let a = 5 :let b = "5" :echo a == b
:echo [a] == [b]
:let [var1, var2] = mylist変数の数がリスト内の項目の数と一致しない場合、エラーが発生します。リストからの追加の項目を処理するには、";" と変数名を追加します。
:let [var1, var2; rest] = mylistこれは次のように機能します。
:let var1 = mylist[0] :let var2 = mylist[1] :let rest = mylist[2:]ただし、項目が2つしかない場合はエラーが発生しません。"rest" は空のリストになります。
:let list[4] = "four" :let listlist[0][3] = itemリストの一部を変更するには、変更する最初の項目と最後の項目を指定できます。値は、その範囲内の項目の数を少なくとも持っている必要があります。
:let list[3:5] = [3, 4, 5]リストに項目をインプレースで追加するには、:let+= (リストの連結)を使用できます。
:let listA = [1, 2] :let listA += [3, 4]
:let listA = [1, 2] :let listB = listA :let listB += [3, 4] :echo listA [1, 2, 3, 4]
:call insert(list, 'a') " prepend item 'a' :call insert(list, 'a', 3) " insert item 'a' before list[3] :call add(list, "new") " append String item :call add(list, [1, 2]) " append a List as one new item :call extend(list, [1, 2]) " extend the list with two more items :let i = remove(list, 3) " remove item 3 :unlet list[3] " idem :let l = remove(list, 3, -1) " remove items 3 to last item :unlet list[3 : ] " idem :call filter(list, 'v:val !~ "x"') " remove items with an 'x'リスト内の項目の順序の変更
:call sort(list) " sort a list alphabetically :call reverse(list) " reverse the order of items :call uniq(sort(list)) " sort and remove duplicates
: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() 関数の方が簡単な方法です。
:for [lnum, col] in [[1, 3], [2, 8], [3, 0]] : call Doit(lnum, col) :endforこれは、リスト項目ごとに :let コマンドが実行されるのと同様に機能します。繰り返しますが、エラーを回避するために、型は同じである必要があります。
:for [i, j; rest] in listlist : call Doit(i, j) : if !empty(rest) : echo "remainder: " .. string(rest) : endif :endforBlob の場合は、一度に1バイトずつ使用されます。
for c in text echo 'This character is ' .. c endfor
:let r = call(funcname, list) " call a function with an argument list :if empty(list) " check if list is empty :let l = len(list) " number of items in list :let big = max(list) " maximum value in list :let small = min(list) " minimum value in list :let xs = count(list, 'x') " count nr of times 'x' appears in list :let i = index(list, 'x') " index of first 'x' in list :let lines = getline(1, 10) " get ten text lines from buffer :call append('$', lines) " append text lines in buffer :let list = split("a b c") " create list from items in a string :let string = join(list, ', ') " create string from list items :let s = string(list) " String representation of list :call map(list, '">> " .. v:val') " prepend ">> " to each item機能の組み合わせで物事を簡単にするできることを忘れないでください。たとえば、リスト内のすべての数値を合計するには
:exe 'let sum = ' .. join(nrlist, '+')
:let mydict = {1: 'one', 2: 'two', 3: 'three'} :let emptydict = {}
:let mydict = #{zero: 0, one_key: 1, two-key: 2, 333: 3}ここで、333 は文字列 "333" です。空のキーは #{} では使用できません。
:let nestdict = {1: {11: 'a', 12: 'b'}, 2: {21: 'c'}}最後のエントリの後の余分なコンマは無視されます。
:let val = mydict["one"] :let mydict["four"] = 4リストとは異なり、この方法で既存の辞書に新しいエントリを追加できます。
:let val = mydict.one :let mydict.four = 4エントリには任意の型(リストや辞書も含む)を使用できるため、インデックス作成とキー検索を繰り返すことができます。
:echo dict.key[idx].key
:for key in keys(mydict) : echo key .. ': ' .. mydict[key] :endforキーのリストはソートされていません。最初にソートすることもできます。
: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
:let onedict = {'a': 1, 'b': 2} :let adict = onedict :let adict['a'] = 11 :echo onedict['a'] 11すべてのキーと値のペアが等しいと見なされる場合、2つの辞書は等しいと見なされます。詳細については、リストの同一性を参照してください。
:let dict[4] = "four" :let dict['one'] = item辞書からエントリを削除するには、remove() または :unlet を使用します。dict からキー "aaa" を持つエントリを削除する3つの方法
:let i = remove(dict, 'aaa') :unlet dict.aaa :unlet dict['aaa']辞書を別の辞書とマージするには、extend() を使用します。
:call extend(adict, bdict)これにより、adict は bdict のすべてのエントリで拡張されます。キーが重複すると、adict のエントリが上書きされます。オプションの3番目の引数でこれを変更できます。辞書内のエントリの順序は無関係であるため、":echo adict" が adict の古いエントリの後に bdict の項目を表示することを期待しないでください。
:call filter(dict, 'v:val =~ "x"')これにより、値が 'x' と一致しない "dict" からすべてのエントリが削除されます。これを使用してすべてのエントリを削除することもできます。
call filter(dict, 0)
:function Mylen() dict : return len(self.data) :endfunction :let mydict = {'data': [0, 1, 2, 3], 'len': function("Mylen")} :echo mydict.len()これは、オブジェクト指向プログラミングのメソッドのようなものです。辞書内のエントリは Funcref です。ローカル変数 "self" は、関数が呼び出された辞書を参照します。
:let mydict = {'data': [0, 1, 2, 3]} :function mydict.len() : return len(self.data) :endfunction :echo mydict.len()すると、関数には番号が付けられ、dict.len の値は、この関数を参照する Funcref になります。関数は Funcref を介してのみ使用できます。それを参照する Funcref が残っていない場合は、自動的に削除されます。
:function g:42
:if has_key(dict, 'foo') " TRUE if dict has entry with key "foo" :if empty(dict) " TRUE if dict is empty :let l = len(dict) " number of items in dict :let big = max(dict) " maximum value in dict :let small = min(dict) " minimum value in dict :let xs = count(dict, 'x') " count nr of times 'x' appears in dict :let s = string(dict) " String representation of dict :call map(dict, '">> " .. v:val') " prepend ">> " to each item
:let b = 0zFF00ED015DAF可読性のため、バイト(16進数のペア)の間にドットを挿入できます。これらは値を変更しません。
:let b = 0zFF00.ED01.5DAFBlobは、例えば、
{type}
引数を "B" に設定してreadfile()でファイルから読み込むことができます。:let b = readfile('image.png', 'B')
:let myblob = 0z00112233 :let byte = myblob[0] " get the first byte: 0x00 :let byte = myblob[2] " get the third byte: 0x22負のインデックスは末尾から数えます。インデックス-1はBlobの最後のバイト、-2は最後から2番目のバイトなどを指します。
:let last = myblob[-1] " get the last byte: 0x33無効なインデックスによるエラーを避けるには、get()関数を使用します。項目がない場合は-1または指定したデフォルト値を返します。
:echo get(myblob, idx) :echo get(myblob, idx, 999)
:for byte in 0z112233 : call Doit(byte) :endforこれは、0x11、0x22、および0x33でDoit()を呼び出します。
:let longblob = myblob + 0z4455 :let longblob = 0z4455 + myblob
:let myblob += 0z6677
:let myblob = 0z00112233 :let shortblob = myblob[1:2] " get 0z1122 :let shortblob = myblob[2:-1] " get 0z2233最初のインデックスを省略するとゼロに類似します。最後のインデックスを省略すると、-1 に類似します。
:let endblob = myblob[2:] " from item 2 to the end: 0z2233 :let shortblob = myblob[2:2] " Blob with one byte: 0z22 :let otherblob = myblob[:] " make a copy of the Blob最初のインデックスがBlobの最後のバイトを超えている場合、または2番目のインデックスが最初のインデックスの前にある場合、結果は空のBlobになります。エラーメッセージはありません。
:echo myblob[2:8] " result: 0z2233
:let blob[4] = 0x44インデックスがBlobの末尾の直後の場合、追加されます。それより大きいインデックスはエラーです。
let blob[1:3] = 0z445566置換されるバイトの長さは、提供される値とまったく同じである必要があります。E972
:let blob[3:5] = 0z334455Blobにインプレースで項目を追加するには、:let+= (blob連結) を使用できます。
:let blobA = 0z1122 :let blobA += 0z3344
:let blobA = 0z1122 :let blobB = blobA :let blobB += 0z3344 :echo blobA 0z11223344
if blob == 0z001122また、同一性も比較できます。
if blob is otherblob
:let blob = 0z112233 :let blob2 = blob :echo blob == blob2
:echo blob is blob2
:let blob3 = blob[:] :echo blob == blob3
:echo blob is blob3
'string'
(文字列定数、'は二重化) [expr1, ...] (リスト) {expr1: expr1, ...}
(辞書) #{key: expr1, ...} (辞書) &option (オプション値) (expr1) (ネストされた式) (変数) (内部変数) va{ria}ble (中括弧を使用した内部変数) $VAR (環境変数) @r (レジスタ "r" の内容) function(expr1, ...) (関数呼び出し) func{ti}on(expr1, ...) (中括弧を使用した関数呼び出し) {args -> expr1}
(ラムダ式)&nu || &list && &shell == "csh"1つのレベル内のすべての式は、左から右に解析されます。
:echo lnum == 1 ? "top" : lnum最初の式は「expr2」であるため、別の?:を含めることはできません。他の2つの式は含めることができるため、?:の再帰的な使用が可能です。例:
:echo lnum == 1 ? "top" : lnum == 1000 ? "last" : lnumこれを読みやすくするには、行継続を使用することをお勧めします。
:echo lnum == 1 :\ ? "top" :\ : lnum == 1000 :\ ? "last" :\ : lnum':' の前には必ずスペースを配置する必要があります。そうしないと、「a:1」などの変数での使用と間違われる可能性があります。
echo theList ?? 'list is empty' echo GetName() ?? 'unknown'これらは似ていますが、等しくはありません。
expr2 ?? expr1 expr2 ? expr2 : expr12行目では、"expr2" が2回評価されます。
&nu || &list && &shell == "csh""&&" は "||" よりも優先順位が高いため、これは次のような意味になります。
&nu || (&list && &shell == "csh")結果が分かると、式は「ショートサーキット」します。つまり、それ以上の引数は評価されません。これはCで発生することに似ています。例:
let a = 1 echo a || b"a" が TRUEなので結果は TRUE である必要があるため、"b" という変数がなくてもこれは有効です。同様に以下:
echo exists("b") && b == "yes"これは、"b" が定義されているかどうかに関係なく有効です。2番目の句は、"b" が定義されている場合にのみ評価されます。
{cmp}
expr5if get(Part1, 'name') == get(Part2, 'name') " Part1 and Part2 refer to the same functionList、Dictionary、または Blob で "is" または "isnot" を使用すると、式が同じ List、Dictionary、または Blob インスタンスを参照しているかどうかがチェックされます。List のコピーは、元の List とは異なります。List、Dictionary、または Blob なしで "is" を使用すると、"equal" を使用する場合と同じになり、"isnot" を使用すると "not equal" を使用する場合と同じになります。ただし、異なる型は値が異なることを意味します。
echo 4 == '4' 1 echo 4 is '4' 0 echo 0 is [] 0"is#"/"isnot#" と "is?"/"isnot?" は、大文字と小文字を区別して、または無視してマッチングするために使用できます。
echo 0 == 'x' 1'x' が Number に変換されると 0 になるためです。しかし
echo [0] == ['x'] 0List または Dictionary 内では、この変換は使用されません。
1 . 90 + 90.0以下のように
(1 . 90) + 90.0String "190" は自動的に Number 190 に変換され、Float 90.0 に加算できるため、これは機能します。ただし
1 . 90 * 90.0以下のように読み取る必要があります。
1 . (90 * 90.0)'.' は '*' よりも優先順位が低いためです。これは、Float と String を連結しようとするため、機能しません。
byteidx()
を使用するか、split()
を使用して文字列を文字のリストに変換してください。例: カーソルの下のバイトを取得するには:let c = getline(".")[col(".") - 1]インデックス 0 は最初のバイトを与えます。これは C での動作と同じです。注意: テキスト列番号は 1 から始まります! 例: カーソルの下のバイトを取得するには
:let c = getline(".")[col(".") - 1]インデックス 0 は最初のバイトを与えます。注意: テキスト列番号は 1 から始まります!
:let item = mylist[-1] " get last item一般に、List のインデックスが List の長さ以上であるか、List の長さよりも負である場合、エラーになります。
:let c = name[-1:] " last byte of a string :let c = name[0:-1] " the whole string :let c = name[-2:-2] " last but one byte of a string :let s = line(".")[4:] " from the fifth byte to the end :let s = s[:-3] " remove last two bytes
:let l = mylist[:3] " first four items :let l = mylist[4:4] " List with one item :let l = mylist[:] " shallow copy of a Listexpr8がBlobの場合、これはインデックスexpr1aとexpr1bのバイトを含む新しいBlobになります。例
:let b = 0zDEADBEEF :let bs = b[1:2] " 0zADBE :let bs = b[] " copy of 0zDEADBEEFFuncrefでexpr8[expr1]またはexpr8[expr1a : expr1b]を使用すると、エラーが発生します。
mylist[n:] " uses variable n mylist[s:] " uses namespace s:, error!Dictionary内のexpr8.nameエントリexpr-entry
:let dict = {"one": 1, 2: "two"} :echo dict.one " shows "1" :echo dict.2 " shows "two" :echo dict .2 " error because of space before the dotドットは文字列連結にも使用されることに注意してください。混乱を避けるために、文字列連結には常にドットの周りにスペースを置いてください。
mylist->filter(filterexpr)->map(mapexpr)->sort()->join()
GetPercentage()->{x -> x * 100}()->printf('%d%%')
-1.234->string()次のものと同等です
(-1.234)->string()以下ではありません
-(1.234->string())
mylist \ ->filter(filterexpr) \ ->map(mapexpr) \ ->sort() \ ->join()ラムダ形式を使用する場合、}と の間に空白があってはなりません
{N}
と{M}
は数値です。{N}
と{M}
の両方が存在する必要があり、数字のみを含めることができます。[-+]はオプションのプラスまたはマイナス記号があることを意味します。{exp}
は指数であり、10のべき乗です。小数点のみが受け入れられ、コンマは受け入れられません。現在のロケールがどうであれ。{M}
1e40 欠落している .{M}:let pi = 3.14159265359 :let e = 2.71828182846または、浮動小数点リテラルとして書き込みたくない場合は、次のような関数を使用することもできます
:let pi = acos(-1.0) :let e = exp(1.0)
:echo printf('%.15e', atan(1))
<BS>
\e エスケープ <Esc>
\f 改ページ 0x0C \n 改行 <NL>
\r 復帰 <CR>
\t タブ <Tab>
\\ バックスラッシュ \" 二重引用符 \<xxx> "xxx" という名前の特殊キー。例:CTRL-W
の場合は "\<C-W>" 。これはマッピングで使用するためのもので、0x80バイトはエスケープされます。二重引用符文字を使用するには、エスケープする必要があります: "<M-\">"。UTF-8文字を取得するために<Char-xxxx>
を使用しないでください。上記のように\uxxxxを使用してください。 \<*xxx> \<xxx>と同様ですが、文字に含めるのではなく、修飾子を先頭に追加します。たとえば、"\<C-w>" は1文字の0x17ですが、"\<*C-w>" は4バイトです。CTRL修飾子の3バイトと、文字 "W" です。:let b = 0zFF00ED015DAF
if a =~ "\\s*" if a =~ '\s*'
let your_name = input("What's your name? ")
echo echo $"Hello, {your_name}!"
echo $"The square root of {{9}} is {sqrt(9)}"
{9}
の平方根は3.0ですecho "tabstop is " .. &tabstop if &expandtabここには、任意のオプション名を使用できます。optionsを参照してください。ローカル値を使用し、バッファローカルまたはウィンドウローカルの値がない場合、グローバル値が使用されます。
getenv()
および setenv()
関数も使用でき、英数字以外の名前の環境変数にも機能します。 environ()
関数を使用すると、すべての環境変数を含む辞書を取得できます。:echo $shell :echo expand("$shell")最初のものは何もエコーしない可能性がありますが、2番目のものは$shell変数をエコーします(シェルがそれをサポートしている場合)。
:let F = {arg1, arg2 -> arg1 - arg2} :echo F(5, 2)
:let F = {-> 'error function'} :echo F('ignored')
:function Foo(arg) : let i = 3 : return {x -> x + i - a:arg} :endfunction :let Bar = Foo(4) :echo Bar(6)
if has('lambda')sort()、map()、およびfilter()でラムダ式を使用する例
:echo map([1, 2, 3], {idx, val -> val + 1})
:echo sort([3,7,2,1,4], {a, b -> a - b})
:let timer = timer_start(500, \ {-> execute("echo 'Handler called'", "")}, \ {'repeat': 3})
function Function() let x = 0 let F = {-> x} endfunctionクロージャは関数スコープの「x」を使用し、同じスコープの「F」はクロージャを参照します。このサイクルにより、メモリが解放されません。推奨:これをしないでください。
<lambda>
42」のような内部名があります。ラムダ式のエラーが発生した場合、次のコマンドでそれを特定できます。:function <lambda>42こちらも参照してください:numbered-function
:for k in keys(s:) : unlet s:[k] :endfor
:if my_changedtick != b:changedtick : let my_changedtick = b:changedtick : call My_Update() :endif
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」のみが使用されます。
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()がどこから呼び出されたかは関係なく、s:counter変数はMyCounter()でアクセス可能になります。
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これは、ファイルタイププラグインが各バッファに対して異なるスクリプト変数のセットを取得しないことを意味します。代わりにローカルバッファ変数b:varを使用してください。
my_{adjective}_variableVim がこれに遭遇すると、波括弧内の式を評価し、その式を置き換え、全体を変数名として再解釈します。したがって、上記の例では、変数 "adjective" が "noisy" に設定されている場合、参照は "my_noisy_variable" になります。一方、"adjective" が "quiet" に設定されている場合は、"my_quiet_variable" になります。
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" であり、これは変数名ではないためです。
:let func_end='whizz' :call my_func_{func_end}(parameter)これにより、関数 "my_func_whizz(parameter)" が呼び出されます。
:let i = 3 :let @{i} = '' " error :echo @{i} " error
{var-name}
= {expr1}
:let E18 内部変数 {var-name}
を式 {expr1}
の結果に設定します。変数は {expr}
から型を取得します。{var-name}
がまだ存在しない場合は、作成されます。{var-name}
[{idx}
] = {expr1}
E689{expr1}
の結果に設定します。{var-name}
はリストを参照する必要があり、{idx}
はそのリスト内の有効なインデックスである必要があります。ネストされたリストの場合、インデックスを繰り返すことができます。これは、List に項目を追加するために使用することはできません。これは、String内のバイトを設定するために使用することはできません。これは次のように行うことができます。:let var = var[0:2] .. 'X' .. var[4:]
{var-name}
[{idx1}
:{idx2}
] = {expr1}
E708 E709 E710 List 内の項目のシーケンスを式 {expr1}
の結果に設定します。これは、正しい数の項目を持つリストである必要があります。{idx1}
は省略できます。代わりにゼロが使用されます。{idx2}
は省略できます。リストの末尾を意味します。選択した項目の範囲がリストの末尾を一部過ぎている場合、項目が追加されます。{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}
の型が演算子に適合しない場合、これらは失敗します。+=
は新しいものを作成するのではなく、List または Blob をインプレースで変更します。{expr1}
:let-environment :let-$ 環境変数 {env-name}
を式 {expr1}
の結果に設定します。型は常にStringです。:let ${env-name} .= {expr1}
{expr1}
を環境変数 {env-name}
に追加します。環境変数がまだ存在しない場合は、"=" のように機能します。{expr1}
:let-register :let-@ 式 {expr1}
の結果をレジスタ {reg-name}
に書き込みます。{reg-name}
は 1 文字である必要があり、書き込み可能なレジスタの名前である必要があります(registers を参照してください)。無名レジスタには "@@" を、検索パターンには "@/" を使用できます。{expr1}
の結果が <CR>
または <NL>
で終わる場合、レジスタは行単位になり、それ以外の場合は文字単位に設定されます。これは、最後の検索パターンをクリアするために使用できます。:let @/ = ""
{expr1}
{expr1}
をレジスタ {reg-name}
に追加します。レジスタが空の場合、{expr1}
に設定するようなものです。{expr1}
:let-option :let-& オプション {option-name}
を式 {expr1}
の結果に設定します。String または Number の値は、常にオプションの型に変換されます。ウィンドウまたはバッファにローカルなオプションの場合、効果は :set コマンドを使用するのとまったく同じです。ローカル値とグローバル値の両方が変更されます。例::let &path = &path .. ',/usr/local/include':let &{option-name} .=
{expr1}
文字列オプションの場合:{expr1}
を値に追加します。:set+= のようにコンマは挿入しません。{expr1}
:let &{option-name} -= {expr1}
数値またはブールオプションの場合:{expr1}
を加算または減算します。{expr1}
:let &l:{option-name} .= {expr1}
:let &l:{option-name} += {expr1}
:let &l:{option-name} -= {expr1}
上記と同様ですが、オプションのローカル値のみを設定します(存在する場合)。:setlocal のように機能します。{expr1}
:let &g:{option-name} .= {expr1}
:let &g:{option-name} += {expr1}
:let &g:{option-name} -= {expr1}
上記と同様ですが、オプションのグローバル値のみを設定します(存在する場合)。:setglobal のように機能します。{name1}
, {name2}
, ...] = {expr1}
:let-unpack E687 E688 {expr1}
は List に評価される必要があります。リストの最初の項目は {name1}
に、2 番目の項目は {name2}
に、といったように割り当てられます。名前の数は、List 内の項目数と一致する必要があります。各名前は、上記で説明した ":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
{name1}
, {name2}
, ...] .= {expr1}
:let [{name1}
, {name2}
, ...] += {expr1}
:let [{name1}
, {name2}
, ...] -= {expr1}
上記と同様ですが、List の各項目に対して値を追加/加算/減算します。{name}
, ..., ; {lastname}
] = {expr1}
E452{lastname}
に割り当てられます。残りの項目がない場合、{lastname}
は空のリストに設定されます。例::let [a, b; rest] = ["aval", "bval", 3, 4]
{name}
, ..., ; {lastname}
] .= {expr1}
:let [{name}
, ..., ; {lastname}
] += {expr1}
:let [{name}
, ..., ; {lastname}
] -= {expr1}
上記と同様ですが、List の各項目に対して値を追加/加算/減算します。{var-name}
=<< [trim] [eval] {endmarker}
テキスト... テキスト... {endmarker}
内部変数 {var-name}
を、文字列 {endmarker}
で区切られたテキスト行を含む List に設定します。{expr}
形式の Vim 式が評価され、interpolated-string のように、結果が式を置き換えます。$HOME が展開される例:let lines =<< trim eval END some text See the file {$HOME}/.vimrc more text END
{endmarker}
には空白文字を含めることはできません。{endmarker}
は小文字で始めることはできません。最後の行は、他の文字なしで {endmarker}
文字列のみで終わる必要があります。{endmarker}
の後の空白に注意してください!{endmarker}
の前に指定されている場合、インデントが削除されるため、次のように実行できます。let text =<< trim END if ok echo 'done' endif END
["if ok", " echo 'done'", "endif"]
マーカーは "let" と整列する必要があり、最初の行のインデントはすべてのテキスト行から削除されます。具体的には、最初の空でないテキスト行の先頭のインデントと完全に一致するすべての先頭のインデントが、入力行から削除されます。let
の前の先頭のインデントと完全に一致するすべての先頭のインデントは、{endmarker}
を含む行から削除されます。スペースとタブの違いがここで重要であることに注意してください。{var-name}
がまだ存在しない場合は、作成されます。別のコマンドを続けることはできませんが、コメントを続けることはできます。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 let code =<< trim eval CODE let v = {10 + 20} let h = "{$HOME}" let s = "{Str1()} abc {Str2()}" let n = {MyFunc(3, 4)} CODE
{var-name}
.. 変数 {var-name}
の値をリスト表示します。複数の変数名を指定できます。ここで認識される特殊な名前: E738<nothing>
String # Number * Funcref{name}
... :unlet :unl E108 E795 内部変数 {name}
を削除します。複数の変数名を指定でき、すべて削除されます。名前は、リストまたは辞書の項目にすることもできます。 [!] を指定すると、存在しない変数に対するエラーメッセージは表示されません。リストから1つ以上の項目を削除できます:unlet list[3] " remove fourth item :unlet list[3:] " remove fourth item to last
:unlet dict['two'] :unlet dict.two
{env-name}
を削除します。 :unlet コマンドで {name}
と ${env-name} を混在させることができます。存在しない変数に対してエラーメッセージは表示されません。! がなくても同様です。システムが環境変数の削除をサポートしていない場合は、空になります。{var-name}
= {expr1}
:cons[t] [{name1}
, {name2}
, ...] = {expr1}
:cons[t] [{name}
, ..., ; {lastname}
] = {expr1}
:cons[t] {var-name}
=<< [trim] [eval] {marker}
text... text... {marker}
:let と似ていますが、値の設定後に変数をロックします。これは、:let の直後に :lockvar で変数をロックするのと同じです。したがって、:const x = 1
:let x = 1 :lockvar! x
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
{name}
... :lockvar :lockv 内部変数 {name}
をロックします。ロックとは、(ロック解除されるまで) 変更できなくなることを意味します。ロックされた変数は削除できます:lockvar v :let v = 'asdf' " fails! :unlet v " works
{name}
」というエラーメッセージが表示されます。組み込み変数をロックまたはロック解除しようとすると、「E940: Cannot lock or unlock variable {name}
」というエラーメッセージが表示されます。{name}
をロックしますが、その値はロックしません。 1 リストまたは辞書自体をロックし、項目の追加または削除はできませんが、値を変更することはできます。 2 値もロックし、項目を変更することはできません。項目がリストまたは辞書の場合、項目の追加または削除はできませんが、値を変更することはできます。 3 レベルが1つ深い、リスト / 辞書内のリスト / 辞書の場合、2 と同様。デフォルトの [depth] は 2 です。したがって、{name}
が リストまたは辞書の場合、値は変更できません。let mylist = [1, 2, 3] lockvar 0 mylist let mylist[0] = 77 " OK call add(mylist, 4) " OK let mylist = [7, 8, 9] " Error!
:let l = [0, 1, 2, 3] :let cl = l :lockvar l :let cl[1] = 99 " won't work!
{name}
が存在しない場合はエラーは表示されません。{expr1}
:if :end :endif :en E171 E579 E580 :en[dif] {expr1}
がゼロ以外と評価された場合、次の対応する :else
または :endif
までのコマンドを実行します。短い形式も機能しますが、混乱を避けて自動インデントを適切に機能させるために、常に :endif
を使用することをお勧めします。: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
:append
コマンドと :insert
コマンドは、:if
と :endif
の間では正しく機能しません。{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
:append
コマンドと :insert
コマンドは、:while
ループと :for
ループ内では正しく機能しません。{var}
in {object}
:for E690 E732 :endfo[r] :endfo :endfor {object}
の各項目に対して、:for
と :endfor
の間のコマンドを繰り返します。{object}
は、リスト、Blob、または文字列にすることができます。{var}
は、各項目の値に設定されます。endfor
の後に実行が続行されます。ループ内で {object}
を変更すると、使用される項目に影響します。これが不要な場合は、コピーを作成します:for item in copy(mylist)
{object}
がリストで、コピーを作成しない場合、Vim は、現在の項目でコマンドを実行する前に、リスト内の次の項目への参照を保存します。したがって、現在の項目を削除しても影響はありません。後続の項目を削除すると、その項目が見つかりません。したがって、次の例は機能します (リストを空にする非効率的な方法)for item in mylist call remove(mylist, 0) endfor
{object}
が文字列の場合、各項目は1文字と結合文字を含む文字列です。{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
:try
の後、一致する :finally
(存在する場合) の前に使用すると、一致する :endtry
までの :finally
に続くコマンドが最初に実行されます。このプロセスは、ループ内のすべてのネストされた :try
に適用されます。最も外側の :endtry
は、ループの先頭に戻ります。:while
または :for
ループ内で使用すると、対応する :endwhile
または :endfor
の後のコマンドにスキップします。ループ内の :try
の後、対応する :finally
(存在する場合) の前に使用された場合、:finally
に続くコマンドが、対応する :endtry
まで最初に実行されます。このプロセスは、ループ内のすべてのネストされた :try
に適用されます。最も外側の :endtry
は、ループ後のコマンドにジャンプします。:try
と :endtry
の間のコマンドのエラー処理を変更します。これには、:source
コマンド、関数呼び出し、または自動コマンドの呼び出しを介して実行されるすべてが含まれます。:finally
コマンドがある場合、実行は :finally
の後で続行されます。それ以外の場合、またはその後 :endtry
に到達した場合、次の(動的な)周囲の :try
で対応する :finally
などがないかどうかが確認されます。その後、スクリプト処理は終了します。関数定義に "abort" 引数があるかどうかは関係ありません。例try | call Unknown() | finally | echomsg "cleanup" | endtry echomsg "not reached"
:try
と :endtry
の内部でのエラーまたは割り込みは、例外に変換されます。これは、:throw
コマンドによってスローされたかのようにキャッチできます(:catch
を参照)。この場合、スクリプト処理は終了しません。{command}
):{errmsg}" 形式の値に変換され、その他のエラーは "Vim:{errmsg}" 形式の値に変換されます。{command}
は完全なコマンド名であり、{errmsg}
はエラー例外がキャッチされなかった場合に表示されるメッセージであり、常にエラー番号で始まります。例try | sleep 100 | catch /^Vim:Interrupt$/ | endtry try | edit | catch /^Vim(edit):E\d\+/ | echo "error" | endtry
:catch
が属する同じ :try
に属する次の :catch
、:finally
、または :endtry
までの次のコマンドは、{pattern}
に一致する例外がスローされ、前の :catch
でまだキャッチされていない場合に実行されます。それ以外の場合、これらのコマンドはスキップされます。{pattern}
が省略されている場合は、すべてのエラーがキャッチされます。例:catch /^Vim:Interrupt$/ " catch interrupts (CTRL-C) :catch /^Vim\%((\a\+)\)\=:E/ " catch all Vim errors :catch /^Vim\%((\a\+)\)\=:/ " catch errors and interrupts :catch /^Vim(write):/ " catch all errors in :write :catch /^Vim\%((\a\+)\)\=:E123:/ " catch error E123 :catch /my-exception/ " catch user exception :catch /.*/ " catch everything :catch " same as /.*/
{pattern}
の周りの / の代わりに別の文字を使用できます。ただし、特別な意味を持たない(例:'|' または '"')であり、{pattern}
内にないことが条件です。例外に関する情報は v:exception で利用できます。また、throw-variables も参照してください。注意: エラーメッセージのテキストを ":catch" することは、ロケールによって異なる場合があるため、信頼性がありません。:try
と :finally
の間の部分が、:finally
にフォールスルーした場合、または :continue
、:break
、:finish
、または :return
、あるいはエラー、割り込み、または例外(:throw
を参照)によって離れるときは常に、次の対応する :endtry
までのコマンドが実行されます。{expr1}
{expr1}
が評価され、例外としてスローされます。:throw
が :try
の後、最初の対応する :catch
の前に使用された場合、{expr1}
に一致する最初の :catch
に到達するまでコマンドはスキップされます。そのような :catch
がない場合、または :throw
が :catch
の後、:finally
の前に使用された場合、:finally
に続くコマンド(存在する場合)は、対応する :endtry
まで実行されます。:throw
が :finally
の後にある場合は、:endtry
までのコマンドはスキップされます。:endtry
で、このプロセスは、一致する :catch
が見つかるまで、次の動的な周囲の :try
(呼び出し関数またはソーススクリプトで見つかる場合がある) に対して再び適用されます。例外がキャッチされない場合、コマンド処理は終了します。例:try | throw "oops" | catch /^oo/ | echo "caught" | endtry
{expr1}
.. 各 {expr1}
を間にスペースを入れてエコーします。最初の {expr1}
は新しい行で開始します。:comment も参照してください。新しい行を開始するには "\n" を使用します。カーソルを最初の列に移動するには "\r" を使用します。:echohl
コマンドで設定された強調表示を使用します。コメントを後に続けることはできません。例:echo "the value of 'shell' is" &shell
:echo
の前のコマンドが後で再描画を引き起こす(再描画は多くの場合、何かを入力するまで延期される)のを避けるには、:redraw
コマンドで再描画を強制します。例:new | redraw | echo "there is a new window"
:let l = [] :call add(l, l) :let l2 = [] :call add(l2, [l2]) :echo l l2
{expr1}
.. 各 {expr1}
を何も追加せずにエコーします。:comment も参照してください。:echohl
コマンドで設定された強調表示を使用します。コメントを後に続けることはできません。例:echon "the value of 'shell' is " &shell
:echo
を使用する場合と、外部シェルコマンドである :!echo
を使用する場合の違いに注意してください。:!echo % --> filename
:!echo "%" --> filename or "filename"
:echo % --> nothing
:echo "%" --> %
:echo expand("%") --> filename
{name}
後続の :echo
、:echon
、および :echomsg
コマンドに、ハイライトグループ {name}
を使用します。input()
プロンプトにも使用されます。例:echohl WarningMsg | echo "Don't panic!" | echohl None
{expr1}
.. 式を真のメッセージとしてエコーし、メッセージを message-history に保存します。:echo
コマンドと同様に、引数の間にスペースが配置されます。ただし、印刷できない文字は解釈されずに表示されます。解析は :echo
とは少し異なり、:execute
に似ています。すべての式は、最初に評価および連結されてから、何もエコーされません。式が Number または String に評価されない場合は、string() を使用して文字列に変換します。:echohl
コマンドで設定された強調表示を使用します。例:echomsg "It's a Zizzer Zazzer Zuzz, as you can plainly see."
{expr1}
.. 式をエラーメッセージとしてエコーし、メッセージを message-history に保存します。スクリプトまたは関数で使用すると、行番号が追加されます。引数の間にスペースが配置されるのは :echomsg
コマンドと同様です。try 条件内で使用すると、メッセージは代わりにエラー例外として発生します(try-echoerr を参照)。例:echoerr "This script just failed!"
:echohl
を使用します。また、ビープ音を鳴らすには:exe "normal \<Esc>"
append()
呼び出しによってテキスト付きの List がバッファーに追加されます。これは :call
に似ていますが、任意の式で動作します。:ev
または :eva
に短縮できますが、これらは認識しにくいため、使用しないでください。{expr1}
.. {expr1}
の評価から得られる文字列を Ex コマンドとして実行します。複数の引数は、間にスペースを入れて連結されます。余分なスペースを避けるには、".." 演算子を使用して文字列を 1 つの引数に連結します。{expr1}
は処理されたコマンドとして使用され、コマンドライン編集キーは認識されません。コメントを後に続けることはできません。例:execute "buffer" nextbuf :execute "normal" count .. "w"
:execute '!ls' | echo "theend"
:execute "normal ixxx\<Esc>"
<Esc>
文字があります。expr-string を参照してください。:execute "e " .. fnameescape(filename) :execute "!ls " .. shellescape(filename, 1)
:if 0 : execute 'while i > 5' : echo "test" : endwhile :endif
:execute 'while i < 5 | echo i | let i = i + 1 | endwhile'
:echo "foo" | "this is a comment
:try : ... : ... TRY BLOCK : ... :catch /{pattern}/ : ... : ... CATCH CLAUSE : ... :catch /{pattern}/ : ... : ... CATCH CLAUSE : ... :finally : ... : ... FINALLY CLAUSE : ... :endtrytry 条件文を使用すると、コード内で例外を監視し、適切なアクションを実行できます。try ブロックからの例外をキャッチできます。try ブロック、および catch 句からの例外は、クリーンアップアクションを引き起こす可能性があります。try ブロックの実行中に例外がスローされない場合、制御は (存在すれば) finally 句に転送されます。その実行後、スクリプトは「:endtry」の次の行から続行されます。try ブロックの実行中に例外が発生すると、try ブロックの残りの行はスキップされます。例外は、「:catch」コマンドの引数として指定されたパターンと照合されます。最初に一致する「:catch」の後の catch 句が実行され、他の catch 句は実行されません。catch 句は、次の「:catch」、「:finally」、または「:endtry」コマンド (最初に到達したコマンド) に達すると終了します。次に、finally 句 (存在する場合) が実行されます。「:endtry」に到達すると、スクリプトの実行は通常どおり次の行で続行されます。try ブロックで「:catch」コマンドで指定されたどのパターンにも一致しない例外がスローされた場合、その例外はその try 条件文によってキャッチされず、どの catch 句も実行されません。finally 句のみが (存在する場合) 実行されます。例外は、finally 句の実行中に保留されます。「:endtry」で再開されるため、「:endtry」後のコマンドは実行されず、例外は別の場所でキャッチされる可能性があります。「try-nesting」を参照してください。catch 句の実行中に別の例外がスローされると、その catch 句の残りの行は実行されません。新しい例外は、同じ try 条件文の「:catch」コマンドのパターンと照合されず、その catch 句はいずれも実行されません。ただし、finally 句がある場合は、それが実行され、例外はその実行中に保留されます。「:endtry」後のコマンドは実行されません。新しい例外は、別の場所でキャッチされる可能性があります。「try-nesting」を参照してください。finally 句 (存在する場合) の実行中に例外がスローされると、finally 句の残りの行はスキップされます。finally 句が try ブロックまたは catch 句のいずれかからの例外のために実行された場合、元の (保留中の) 例外は破棄されます。「:endtry」後のコマンドは実行されず、finally 句からの例外が伝播され、別の場所でキャッチされる可能性があります。「try-nesting」を参照してください。
:throw 4711 :throw "string"
: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」も表示されません。
: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 /.*/ : echo "String thrown" : catch /^\d\+$/ : echo "Number thrown"ここの最初の「:catch」は常に一致するため、2 番目の catch 句が実行されることはありません。
: catch /^\d\+$/ : echo "Number thrown. Value is" v:exception例外がどこでスローされたかを知りたい場合もあります。これは「v:throwpoint」に保存されます。「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 : try : throw "foo" : catch /foobar/ : echo "foobar" : finally : echo "inner finally" : endtry :catch /foo/ : echo "foo" :endtry内部の try 条件文は例外をキャッチせず、finally 句のみが実行されます。例外は、外側の try 条件文によってキャッチされます。例では「inner finally」と「foo」が表示されます。
: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」と表示されます。
:function! Bar() : try : call Foo() : catch /.*/ : echo "Rethrow" v:exception : throw v:exception : endtry :endfunction
:try : try : asdf : catch /.*/ : echoerr v:exception : endtry :catch /.*/ : echo v:exception :endtryこのコードは次のように表示します。
CTRL-C
を押してスクリプトを中断した場合、設定は矛盾した状態のままになります。エラーが発生した場合、またはキャッチせずに明示的に例外をスローした場合、スクリプトの開発段階で同じことが発生する可能性があります。設定を復元するための finally 句を持つ try 条件文を使用することで、これらの問題を解決できます。その実行は、正常な制御フロー、エラー、明示的な「:throw」、および割り込みで保証されます。(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このメソッドは、関数またはスクリプトの一部が、その関数またはスクリプト部分の失敗または正常終了時に復元する必要があるグローバル設定を変更するたびに、ローカルで使用する必要があります。
: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」を追加する必要はありません。(とりわけ、これは戻り値を上書きします。)
: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」を参照してください。
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 /No such variable/は英語ロケールでのみ機能しますが、ユーザーが :language コマンドで別の言語を選択した場合は機能しません。ただし、コメントでメッセージテキストを引用すると役立ちます。
:catch /^Vim(\a\+):E108:/ " No such variable
:try : write :catch :endtryただし、この単純な形式は、意図したものよりも多くのものを捕捉する可能性があるため、使用しないことを強くお勧めします。":write" コマンドでは、いくつか の自動コマンド が実行され、書き込みに関連しないエラーが発生する可能性があります。たとえば、
:au BufWritePre * unlet novarスクリプト作成者として責任のないエラーが発生する可能性もあります。スクリプトのユーザーがそのような自動コマンドを定義している可能性もあります。そうなると、エラーをユーザーから隠蔽することになります。代わりに、次を使用する方がはるかに優れています。
:try : write :catch /^Vim(write):/ :endtryこれは、実際の書き込みエラーのみを捕捉します。したがって、意図的に無視したいものだけを捕捉してください。
:silent! nunmap kこれは、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" : " Caught the interrupt. Continue with next prompt. : endtry :endwhileここで、
CTRL-C
を押すとタスクを中断できます。その後、スクリプトは新しいコマンドを要求します。プロンプトで CTRL-C
を押すと、スクリプトは終了します。CTRL-C
が押された場合に何が起こるかをテストするには、デバッグモードを使用し、その行で >quit または >interrupt コマンドを実行します。debug-scripts を参照してください。:catch /.*/ :catch // :catchは、エラー例外、割り込み例外、および :throw コマンドによって明示的にスローされた例外など、すべてを捕捉します。これは、スクリプトの最上位レベルで、予期しないものを捕捉するために役立ちます。例
:try : : " do the hard work here : :catch /MyException/ : : " handle known problem : :catch /^Vim:Interrupt$/ : echo "Script interrupted" :catch /.*/ : echo "Internal error (" .. v:exception .. ")" : echo " - occurred at " .. v:throwpoint :endtry :" end of script注:すべてを捕捉すると、意図したものよりも多くのものを捕捉する可能性があります。したがって、":catch" にパターン引数を指定して、実際に処理できる問題のみを捕捉することを強くお勧めします。例:すべてを捕捉すると、
CTRL-C
を押してスクリプトを中断することがほぼ不可能になる可能性があります。:while 1 : try : sleep 1 : catch : endtry :endwhile
: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!」と表示します。
: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 "*"
: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
: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
: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このスクリプトが変更後、複数回ソースされると、最初に次のように表示されます。
File successfully written!次に、
Error on writing (file contents not changed)次に、
Error after writing等
:autocmd BufWritePre * try : :autocmd BufWritePost * catch :autocmd BufWritePost * echo v:exception :autocmd BufWritePost * endtry : :write
: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 : : " something with arithmetic and 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" : :endtryVim 自体が(エラー時または
CTRL-C
を押したときに)発生させる例外は、フラットな階層を使用します。それらはすべて「Vim」クラスに属しています。「Vim」プレフィックスを付けて例外をスローすることはできません。これらは Vim 用に予約されています。Vim のエラー例外は、失敗したコマンドの名前がわかっている場合は、コマンドの名前でパラメータ化されます。catch-errors を参照してください。: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元の例外は破棄され、代わりにエラー例外が発生します。
:try | unlet! foo # | catch | endtry":unlet!" 引数の後の後続文字に対してエラー例外が発生しますが、":catch" および ":endtry" コマンドは認識されないため、エラー例外は破棄され、「E488: Trailing characters」メッセージが表示されます。
echo novarは次のようになります。
E121: Undefined variable: novar E15: Invalid expression: novartry 条件文内のエラー例外の値は次のようになります。
Vim(echo):E121: Undefined variable: novar
unlet novar #は次のようになります。
E108: No such variable: "novar" E488: Trailing characterstry 条件文内のエラー例外の値は次のようになります。
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 を参照してください。
:" The function Nr2Bin() returns the binary string representation of a number. :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 :" The function String2Bin() converts each character in a string to a :" binary string, separated with dashes. :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"
:func SortBuffer() : let lines = getline(1, '$') : call sort(lines, function("Strcmp")) : call setline(1, lines) :endfunction1行で
:call setline(1, sort(getline(1, '$'), function("Strcmp")))
:" Set up the match bit :let mx='\(\f\+\),\s*\(\d\+\),\s*\(\d\+\)' :"get the part matching the whole expression :let l = matchstr(line, mx) :"get each item out of the match :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
コマンドを使用すると、読み込まれたすべてのスクリプトファイルの一覧を取得できます。getscriptinfo()
関数もありますが、返される情報は完全に同じではありません。scriptnames
の出力を操作する必要がある場合は、このコードを使用できます。" Get the output of ":scriptnames" in the scriptnames_output variable. let scriptnames_output = '' redir => scriptnames_output silent scriptnames redir END " Split the output into lines and parse each line. Add an entry to the " "scripts" dictionary. let scripts = {} for line in split(scriptnames_output, "\n") " Only do non-blank lines. if line =~ '\S' " Get the first number in the line. let nr = matchstr(line, '\d\+') " Get the file name, remove the script number " 123: ". let name = substitute(line, '.\+:\s*', '', '') " Add an item to the Dictionary let scripts[nr] = name endif endfor unlet scriptnames_output
CTRL-R
= が使用される場合にも使用されます。サンドボックスは、:sandboxコマンドにも使用されます。{cmd}
サンドボックス内で{cmd}
を実行します。modelineから設定された可能性のあるオプション(例:'foldexpr')を評価するのに役立ちます。Error
にリンクするNvimInvalidが使用され、他の中間グループも存在します。=
hl-NvimAugmentedAssignment NvimAssignment 一般的な、+=
/`-=`/`.=` hl-NvimAssignmentWithAddition NvimAugmentedAssignment :let+=の+=
hl-NvimAssignmentWithSubtraction NvimAugmentedAssignment :let-=の-=
hl-NvimAssignmentWithConcatenation NvimAugmentedAssignment :let.=の.=
#
/`?` hl-NvimBinaryPlus NvimBinaryOperator expr-+ hl-NvimBinaryMinus NvimBinaryOperator expr-- hl-NvimConcat NvimBinaryOperator expr-. hl-NvimConcatOrSubscript NvimConcat expr-.またはexpr-entry hl-NvimOr NvimBinaryOperator expr-barbar hl-NvimAnd NvimBinaryOperator expr-&& hl-NvimMultiplication NvimBinaryOperator expr-star hl-NvimDivision NvimBinaryOperator expr-/ hl-NvimMod NvimBinaryOperator expr-%{
/`}` hl-NvimNestingParenthesis NvimParenthesis expr-nestingの(
/`)` hl-NvimCallingParenthesis NvimParenthesis expr-functionの(
/`)`[
/`]` hl-NvimSubscriptColon NvimSubscript expr-[:]の:
hl-NvimCurly NvimSubscript curly-braces-namesの{
/`}`{
/`}` hl-NvimList NvimContainer listリテラルの[
/`]`:
前の文字 hl-NvimIdentifierScopeDelimiter NvimIdentifier 名前空間の文字の後の:
hl-NvimIdentifierName NvimIdentifier 識別子の残りの部分 hl-NvimIdentifierKey NvimIdentifier expr-entryの後の識別子:
hl-NvimComma 区切り文字 dictまたはlistリテラル、またはexpr-functionの,
hl-NvimArrow 区切り文字 lambdaの->
0
、16進数の0x
、2進数の0b
hl-NvimFloat NvimNumber 浮動小数点数&
hl-NvimOptionScope NvimIdentifierScope オプションスコープ(ある場合) hl-NvimOptionScopeDelimiter NvimIdentifierScopeDelimiter オプションスコープの後の:
hl-NvimOptionName NvimIdentifier オプション名'
hl-NvimSingleQuotedBody NvimStringBody expr-' 文字列本体のリテラル部分 hl-NvimSingleQuotedQuote NvimStringSpecial expr-' 文字列本体内の ''
"
hl-NvimDoubleQuotedBody NvimStringBody expr-quote 本体のリテラル部分 hl-NvimDoubleQuotedEscape NvimStringSpecial 有効な expr-quote エスケープシーケンス hl-NvimDoubleQuotedUnknownEscape NvimInvalidValue 未認識の expr-quote エスケープシーケンス