繰り返し
Nvim の :help
ページ。生成されたもので、ソースは tree-sitter-vimdoc パーサーを使用して生成されています。
コマンド、Vim スクリプト、およびデバッグの繰り返し
. . 直前の変更を繰り返します。カウントは[count]で置き換えられます。'y' フラグが
'cpoptions' に含まれている場合、yank コマンドも繰り返します。コマンドラインコマンドは繰り返し実行されません。
単純な変更は "." コマンドで繰り返すことができます。カウントを指定しない場合、直前の変更のカウントが使用されます。カウントを入力すると、直前のカウントが置き換えられます。
v:count と
v:count1 が設定されます。
直前の変更に番号付きレジスタの指定が含まれていた場合、レジスタ番号が増分されます。使用方法の例については、
redo-register を参照してください。
Visual 選択を使用したコマンドを繰り返す場合、同じサイズの領域が使用されることに注意してください。
visual-repeat を参照してください。
@: @: 直前のコマンドラインを [count] 回繰り返します。
:g :global E148 :[range]g[lobal]/{pattern}/[cmd]
{pattern}
が一致する [range] 内の行に対して、Ex コマンド [cmd](デフォルトは ":p")を実行します。
:[range]g[lobal]!/{pattern}/[cmd] {pattern}
が一致しない [range] 内の行に対して、Ex コマンド [cmd](デフォルトは ":p")を実行します。
:v :vglobal :[range]v[global]/{pattern}/[cmd] :g! と同じです。
例
:g/^Obsolete/d _
:d
の後にアンダースコアを使用すると、レジスタやクリップボードを上書きすることがなくなります。これにより、速度も向上します。
{pattern}
を囲む '/' の代わりに、英字、'\'、'"'、'|'、'!' 以外の任意の1バイト文字を使用できます。これは、検索パターンまたは置換文字列に '/' を含めたい場合に役立ちます。
グローバルコマンドは、まず [range] の行をスキャンし、一致する行をそれぞれマークします(複数行のパターンでは、一致の先頭のみが重要です)。2回目のスキャンで、カーソルがその行にあるかのように、マークされた各行に対して [cmd] が実行されます。":v" と ":g!" の場合、コマンドはマークされていない各行に対して実行されます。行が削除されると、そのマークは消えます。[range] のデフォルトはバッファ全体 (1,$) です。"CTRL-C" を使用してコマンドを中断できます。行に対してエラーメッセージが表示された場合、その行に対するコマンドは中止され、グローバルコマンドは次のマーク付きまたはマークされていない行に進みます。
E147コマンドが再帰的に使用されると、1行のみで機能します。この場合、範囲を指定することはできません。これは、パターンに一致し、別のパターンに一致しないすべての行を見つけるのに役立ちます。
:g/found/v/notfound/{cmd}
これはまず "found" を含むすべての行を見つけますが、"notfound" に一致しない場合にのみ
{cmd}
を実行します。
任意の Ex コマンドを使用できます。
ex-cmd-index を参照してください。ノーマルモードコマンドを実行するには、
:normal
コマンドを使用できます。
:g/pat/normal {commands}
{commands}
が完全なコマンドで終わるようにしてください。そうでない場合、Vim は各一致に対してコマンドの残りの部分をタイプするまで待ちます。画面は更新されないため、何をしているのかわかりません。
:normal を参照してください。
元に戻す/やり直しコマンドは、グローバルコマンド全体を一度に元に戻す/やり直しします。前のコンテキストマークは一度だけ設定されます("''" を使用すると、グローバルコマンドの前にカーソルがあった場所に移動します)。
グローバルコマンドは、最後に使用された検索パターンと最後に使用された置換パターンの両方を設定します(これは vi と互換性があります)。これにより、文字列をグローバルに置き換えるのが容易になります。
:g/pat/s//PAT/g
"pat" のすべての出現箇所を "PAT" に置き換えます。同じことは以下のようにすることもできます。
:%s/pat/PAT/g
これは2文字短縮されます!
Ex モードで "global" を使用する場合、特別なケースとして ":visual" をコマンドとして使用します。これにより、一致する行に移動し、ノーマルモードになり、
gQ を使用して Ex モードに戻るまでそこでコマンドを実行できます。これは、一致する各行に対して繰り返されます。これを行っている間は、":global" を使用できません。中止するには、
CTRL-C
を2回押してください。
q recording q{0-9a-zA-Z"} 入力された文字をレジスタ
{0-9a-zA-Z"}
に記録します(大文字で追加)。レジスタを実行中は 'q' コマンドが無効になり、マッピング内および
:normal 内では機能しません。
注記: 記録に使用されているレジスタが
y と
p にも使用されている場合、put は記録されたマクロを貼り付け、yank は記録されたマクロを上書きするため、結果は期待どおりにならない可能性が高いです。
注記: 記録は入力中に発生し、レジスタの再生はキーがマッピングから来たかのように発生します。これは、コマンドが入力された場合にのみ同期される元に戻すなど、いくつかの点で重要です。
q 記録を停止します。実装上の注記:記録を停止する 'q' は、マッピングの結果でない限り、レジスタに保存されません。
@ @{0-9a-z".=*+} レジスタ
{0-9a-z".=*+}
の内容を [count] 回実行します。レジスタ '%'(現在のファイル名)と '#'(代替ファイル名)は使用できません。レジスタはマッピングのように実行されるため、
'wildchar' と
'wildcharm' の違いが適用され、元に戻す操作の同期方法が異なる場合があります。"@=" の場合、式を入力するよう求められます。その式の結果が実行されます。
@: も参照してください。
@@ E748 @@ 直前の @{0-9a-z":*} を [count] 回繰り返します。
:@ :[addr]@{0-9a-z".=*+} レジスタ
{0-9a-z".=*+}
の内容を Ex コマンドとして実行します。最初にカーソルを [addr] 行に設定します(デフォルトは現在の行)。レジスタの最後の行に
<CR>
がない場合、'e' フラグが
'cpoptions' に存在すると自動的に追加されます。":@=" の場合、最後に使用された式が使用されます。式を評価した結果が Ex コマンドとして実行されます。これらのコマンドではマッピングは認識されません。
line-continuation 文字 (\) が行単位のレジスタ内の行の先頭に存在する場合、前の行と結合されます。これは、Vim スクリプトの一部を yank して実行する場合に役立ちます。
:@: :[addr]@: 直前のコマンドラインを繰り返します。最初にカーソルを [addr] 行に設定します(デフォルトは現在の行)。
:[addr]@
:@@:[addr]@@ 直前の :@{register} を繰り返します。最初にカーソルを [addr] 行に設定します(デフォルトは現在の行)。
Vim スクリプトの作成については、ユーザーマニュアルの第41章を参照してください。
usr_41.txt
例
:runtime syntax/c.vim
:runtime syntax/c.lua
複数のスペース区切りの
{file}
引数を含めることができます。各
{file}
は、
'runtimepath' の最初のディレクトリ、次に2番目のディレクトリなどで検索されます。
[!] が含まれている場合、見つかったすべてのファイルがソースされます。それ以外の場合は、最初に発見されたファイルのみがソースされます。
{file}
にワイルドカードが含まれている場合、一致するすべてのファイルに展開されます。例
:runtime! plugin/**/*.{vim,lua}
これは、Nvimが起動時にプラグインファイルをロードするために使用するものです。この同様のコマンド
:runtime plugin/**/*.{vim,lua}
は、最初のファイルのみをソースします。
各{file}
パターンについて、拡張子のみが異なる2つの.vim
ファイルと.lua
ファイル名が一致する場合、.vim
ファイルが最初にソースされます。
"pack/*/start"からのパッケージの読み込みがスキップされた場合、このディレクトリが最初に検索されます。
pack/*/start/{name}
{name}
は.vimファイル名ではなく、ディレクトリ名であることに注意してください。次のパターンに一致するすべてのファイル
pack/*/opt/{name}/plugin/**/*.vim
と
pack/*/opt/{name}/plugin/**/*.lua
がソースされます。これにより、
'runtimepath'のプラグインと同様に、「plugin」以下のサブディレクトリを使用できます。
ファイルタイプ検出が既に有効になっていて(通常は、
vimrc内の
syntax enable
または
filetype on
コマンド、または
初期化中に自動的に実行されます)、パッケージが"pack/*/opt/{name}"に見つかった場合、このコマンドは"{name}/ftdetect/*.vim"ファイルも検索します。
最初に、検出されたすべてのディレクトリが
'runtimepath'に追加され、次に、ディレクトリ内で見つかったプラグインがソースされます。これにより、プラグインが別のプラグインの何か(例:"autoload"ディレクトリ)に依存することが可能になります。これがどのように役立つかは
packload-two-stepsを参照してください。
これは通常、
vimrcファイルのロード後に、起動時に自動的に実行されます。このコマンドを使用すると、より早く実行できます。
パッケージは一度だけロードされます。:packloadall
を2回目に使用しても効果はありません。オプションの!を追加すると、このコマンドは以前に行った場合でもパッケージをロードします。
エラーが発生しても、スクリプトのソースが中断された箇所でのみソースが中断され、それ以降のプラグインはロードされます。
packagesを参照してください。
[encoding]が空の場合、変換は行われません。これは、変換を特定の行数に制限するために使用できます。
scriptencoding euc-jp
... lines to be converted ...
scriptencoding
... not converted ...
システムで変換がサポートされていない場合、エラーメッセージは表示されず、変換は行われません。行を変換できない場合、エラーは発生せず、元の行が保持されます。
"ucs-2"または"ucs-4"を使用しないでください。スクリプトはこれらのエンコーディングにすることはできません(NULLバイトが含まれるためです)。ソースされたスクリプトがutf-8形式のBOM(バイト順序マーク)で始まる場合、Vimはそれを認識するため、":scriptencoding utf-8"を使用する必要はありません。
:scr[iptnames][!]
{scriptId}
:scriptスクリプト
{scriptId}
を編集します。":scriptnames name"は機能しますが、":script name"の使用をお勧めします。現在のバッファを
破棄できず、!が存在しない場合、コマンドは失敗します。
:fini :finish E168 :fini[sh] スクリプトのソースを停止します。Vimスクリプトファイルでのみ使用できます。これは、ファイルの残りをスキップする簡単な方法です。
:tryの後で、対応する
:finally(存在する場合)の前に使用すると、対応する
:endtryまでの":finally"に続くコマンドが最初に実行されます。このプロセスは、スクリプト内のすべてのネストされた":try"に適用されます。最も外側の":endtry"で、スクリプトのソースが停止します。
すべてのコマンドとコマンドシーケンスは、名前付きレジスタに入れて実行することで繰り返すことができます。レジスタにコマンドを取得するには2つの方法があります。
記録コマンド"q"を使用します。コマンドを一度入力すると、実行中にレジスタに保存されます。実行している内容が見えるため簡単です。間違えた場合は、レジスタをファイルに"p"utしてコマンドシーケンスを編集し、レジスタに再度削除します。レジスタに追加することで記録を続けることができます(大文字を使用します)。
コマンドシーケンスをレジスタに削除または yank します。
頻繁に使用されるコマンドシーケンスは、':map'コマンドを使用してファンクションキーの下に配置できます。
別の方法は、コマンドをファイルに配置し、':source!'コマンドで実行することです。長いコマンドシーケンスに役立ちます。':map'コマンドと組み合わせて、複雑なコマンドをファンクションキーの下に配置できます。
':source'コマンドは、ファイルからExコマンドを1行ずつ読み取ります。必要なキーボード入力をタイプする必要があります。':source!'コマンドは、スクリプトファイルから1文字ずつ読み取り、各文字を入力したかのように解釈します。
例:":!ls"コマンドを入力すると、
hit-enterプロンプトが表示されます。ファイルに"!ls"という行があるファイルを':source'すると、自分で
<Enter>
を入力する必要があります。しかし、ファイルに":!ls"という行があるファイルを':source!'すると、
<CR>
が見つかるまでそのファイルから次の文字が読み取られます。":!ls"がファイルの最後の行でない限り、自分で
<CR>
を入力する必要はありません。
':source[!]'コマンドをスクリプトファイルに配置できるため、スクリプトファイルの上位階層を作成できます。':source'コマンドは、一度に開くことができるファイルの数(約15)までネストできます。':source!'コマンドは最大15レベルまでネストできます。
ソースされたファイル内でファイル名が必要な場所に、"<sfile>"文字列(文字通り、特別なキーではありません)を使用できます。ソースされたファイルのファイル名に置き換えられます。たとえば、
init.vimファイルと同じディレクトリに"other.vimrc"ファイルがある場合、このコマンドを使用して
init.vimファイルからソースできます。
:source <sfile>:h/other.vimrc
スクリプトファイルでは、ターミナル依存のキーコードはターミナル非依存の2文字コードで表されます。つまり、さまざまな種類のターミナルで同じように使用できます。キーコードの最初の文字は0x80または128で、画面には"~@"と表示されます。2番目の文字は、
key-notationのリストにあります。これらのコードはすべて、
CTRL-V
の後に3桁の10進コードを続けて入力することもできます。
:source_crnl W15 Windows:":source"で読み取られるファイルは通常、
<CR>
<NL>
<EOL>
を持ちます。これらは常に機能します。
<NL>
<EOL>
を持つファイル(たとえば、Unixで作成されたファイル)を使用している場合、
'fileformats'が空ではなく、最初の行が
<CR>
で終わらない場合、これは認識されます。最初の行に":map
<F1>
:help^M"のようなもの("^M"は
<CR>
)がある場合、これは失敗します。最初の行が
<CR>
で終わるが、その後の行がそうでない場合、最初の行の
<CR>
が失われるため、エラーメッセージが表示されます。
他のシステムでは、Vimは":source"されたファイルが<NL>
で終わることを期待しています。これらは常に機能します。<CR>
<NL>
<EOL>
を持つファイル(たとえば、MS-Windowsで作成されたファイル)を使用している場合、すべての行に末尾に<CR>
が付きます。これにより、一部のコマンド(例:マッピング)に問題が発生する可能性があります。<EOL>
の自動検出はありません。マッピングを定義する行で始まることが一般的で、それが<CR>
で終わると、オートマトンが混乱するためです。
行継続 ":source"されたExコマンドスクリプトファイル内の長い行は、次の行の先頭に行継続記号"\"(バックスラッシュ)を挿入することで分割できます。バックスラッシュの前に空白文字を含めることができ、無視されます。
例:次の行
:set comments=sr:/*,mb:*,el:*/,
\://,
\b:#,
\:%,
\n:>,
\fb:-
は、1行で入力されたかのように解釈されます。
:set comments=sr:/*,mb:*,el:*/,://,b:#,:%,n:>,fb:-
バックスラッシュの手前の行の先頭にあるすべての空白文字は無視されます。ただし、その手前の行の末尾の空白文字は自由に挿入できません。コマンドが分割される位置によって、追加の空白文字が許可されるかどうかが決まります。
スペースが必要な場合は、バックスラッシュの直後に配置することをお勧めします。行末のスペースは見にくく、誤って削除される可能性があります。
:syn match Comment
\ "very long regexp"
\ keepend
":append"コマンドと":insert"コマンドに問題があります。
:1append
\asdf
.
バックスラッシュは行継続記号として認識されるため、次のコマンドになります。
:1appendasdf
.
これを回避するには、
'cpoptions'オプションに'C'フラグを追加します。
:set cpo+=C
:1append
\asdf
.
:set cpo-=C
コマンドが関数内にある場合、関数を定義するときに'C'フラグを追加する必要があることに注意してください。実行するときは関係ありません。
:set cpo+=C
:function Foo()
:1append
\asdf
.
:endfunction
:set cpo-=C
行間にコメントを追加するには、
'"\ '
で始めます。バックスラッシュの後のスペースに注意してください。例
let array = [
"\ first entry comment
\ 'first',
"\ second entry comment
\ 'second',
\ ]
理由:ほとんどのプログラムは、行継続を示すために末尾のバックスラッシュを使用しています。これをVimで使用すると、Viとの互換性がなくなります。たとえば、このViマッピングの場合
:map xx asdf\
そのため、特殊な先頭バックスラッシュが使用されています。
継続行でコメントを開始すると、後続のすべての継続行がコメントの一部になります。長らくこのようになっていたため、継続行の途中でコメントを追加できるようにした際、有効な継続行であるため「\」を使用することができませんでした。'"\ '
が最も近い方法ですが、少し奇妙に見えるかもしれません。バックスラッシュの後にスペースを付けることで、これが通常のコメント行である可能性を非常に低くしています。
Vimの「パッケージ」とは、
プラグインを含むディレクトリです。通常のプラグインと比較して、パッケージは…
アーカイブとしてダウンロードして独自のディレクトリに展開できるため、他のプラグインのファイルとファイルが混在しません。
git、mercurialなどのリポジトリにすることができるため、簡単に更新できます。
相互に依存する複数のプラグインを含めることができます。
起動時に自動的にロードされるプラグイン(「start」パッケージ、「pack/*/start/*」に配置)と、
:packaddを使用して必要な場合にのみロードされるプラグイン(「opt」パッケージ、「pack/*/opt/*」に配置)を含めることができます。
「pack/*/start/*」パスは
'runtimepath'に明示的に含まれていないため、「:set rtp」または「echo &rtp」では報告されません。スクリプトは
nvim_list_runtime_paths()を使用して使用されているすべてのディレクトリをリストし、
nvim_get_runtime_file()を使用してランタイムパス内の特定のファイルまたはサブフォルダーを照会できます。例
" List all runtime dirs and packages with Lua paths.
:echo nvim_get_runtime_file("lua/", v:true)
パッケージの使用と自動ロード
Nvimファイルが「~/.local/share/nvim/site」にあり、zipアーカイブ「/tmp/foopack.zip」からパッケージを追加する場合を想定します。
% mkdir -p ~/.local/share/nvim/site/pack/foo
% cd ~/.local/share/nvim/site/pack/foo
% unzip /tmp/foopack.zip
ディレクトリ名「foo」は任意であり、好きな名前を選択できます。
これにより、~/.local/share/nvim/site下に次のファイルが作成されます: pack/foo/README.txt pack/foo/start/foobar/plugin/foo.vim pack/foo/start/foobar/syntax/some.vim pack/foo/opt/foodebug/plugin/debugger.vim
configの処理後、起動時にNvimは
'packpath'内のすべてのディレクトリを「pack/*/start/*」内のプラグインについてスキャンし、プラグインをロードします。
この例では、Nvimは「pack/foo/start/foobar/plugin/foo.vim」を見つけ、ロードします。
「foobar」プラグインが起動し、
'filetype'を「some」に設定した場合、そのディレクトリがランタイム検索パスにあるため、Nvimはsyntax/some.vimファイルを見つけます。
Nvimは、存在する場合、ftdetectファイルもロードします。
「pack/foo/opt」の下のファイルは自動的にはロードされず、「pack/foo/start」の下のファイルのみがロードされます。「opt」ディレクトリの使用方法については、下記の
pack-addを参照してください。
プラグインのロードが無効になっている場合、パッケージの自動ロードは行われません。
load-pluginsを参照してください。
プラグイン/ファイルがソースされるように、パッケージをより早くロードするには、:packloadallを使用します。これは、プラグインのロードが無効になっている場合でも機能します。自動ロードは一度だけ行われます。
パッケージに「after」ディレクトリがある場合、そのディレクトリは
'runtimepath'の最後に追加されるため、そこに含まれるものは後でロードされます。
パッケージではなく単一のプラグインがある場合は、追加のディレクトリレベルを作成する必要があります。
% mkdir -p ~/.local/share/nvim/site/pack/foo/start/foobar
% cd ~/.local/share/nvim/site/pack/foo/start/foobar
% unzip /tmp/someplugin.zip
これにより、次のファイルが作成されます: pack/foo/start/foobar/plugin/foo.vim pack/foo/start/foobar/syntax/some.vim
以降は上記と同じように動作します。
オプションプラグイン
pack-add パックからオプションプラグインをロードするには、
:packadd
コマンドを使用します。
:packadd foodebug
これは
'packpath'で「pack/*/opt/foodebug」を検索し、~/.local/share/nvim/site/pack/foo/opt/foodebug/plugin/debugger.vimを見つけ、ソースします。
これは、特定の条件が満たされた場合に行うことができます。例えば、Nvimが機能をサポートしているか、依存関係が不足しているかによって異なります。
configにこのコマンドを配置することで、起動時にオプションプラグインをロードすることもできます。
:packadd! foodebug
追加の「!」は、Nvimが
--nopluginで起動された場合にプラグインがロードされないようにするためです。
パッケージに「opt」ディレクトリにのみファイルがあるのは完全に正常です。その場合は、使用する際に各プラグインをロードする必要があります。
:colorscheme
でロードされるカラースキーマは「pack/*/start」と「pack/*/opt」の下にあるため、どこにでも配置できます。「pack/*/opt」の下に配置することをお勧めします。例:~/.config/nvim/pack/mycolors/opt/dark/colors/very_dark.vim
ファイルタイププラグインは「pack/*/start」の下に配置して、常に検出できるようにする必要があります。ファイルタイプに複数のプラグインがあり、
:packadd
を使用してロードするプラグインを選択する場合を除きます。例えば、コンパイラのバージョンによって異なります。
if foo_compiler_version > 34
packadd foo_new
else
packadd foo_old
endif
「after」ディレクトリは、パッケージではおそらく役に立ちません。ただし、禁止されてはいません。
これは、パッケージとして配布する1つ以上のプラグインを作成することを前提としています。
関連のない2つのプラグインがある場合は、2つのパッケージを使用します。これにより、Vimユーザーは含めるものと含めないものを選択できます。または、オプションプラグインを含む1つのパッケージを使用し、ユーザーに:packadd
を使用して好みのプラグインを追加するように指示することもできます。
パッケージの配布方法を決定します。アーカイブを作成することも、リポジトリを使用することもできます。アーカイブはより多くのユーザーが使用できますが、新しいバージョンに更新するのが少し難しくなります。リポジトリは通常、簡単に最新の状態に保つことができますが、「git」などのプログラムが必要です。両方を行うこともでき、githubはリリースに対して自動的にアーカイブを作成できます。
ディレクトリレイアウトは次のようになります: start/foobar/plugin/foo.vim " 常にロードされ、コマンドを定義します start/foobar/plugin/bar.vim " 常にロードされ、コマンドを定義します start/foobar/autoload/foo.vim " fooコマンドが使用されたときにロードされます start/foobar/doc/foo.txt " foo.vimのヘルプ start/foobar/doc/tags " ヘルプタグ opt/fooextra/plugin/extra.vim " オプションプラグイン、コマンドを定義します opt/fooextra/autoload/extra.vim " extraコマンドが使用されたときにロードされます opt/fooextra/doc/extra.txt " extra.vimのヘルプ opt/fooextra/doc/tags " ヘルプタグ
これにより、ユーザーは次のことができます。
mkdir ~/.local/share/nvim/site/pack
cd ~/.local/share/nvim/site/pack
git clone https://github.com/you/foobar.git myfoobar
ここで「myfoobar」はユーザーが選択できる名前であり、唯一の条件は他のパッケージとは異なることです。
ドキュメントでは、プラグインの機能を説明し、ユーザーにオプションプラグインのロード方法を指示します。
:packadd! fooextra
オプションプラグインが必要なときに実行されるように、プラグインの1つにこのpackaddコマンドを追加できます。
:helptags
コマンドを実行してdoc/tagsファイルを作成します。この生成されたファイルをパッケージに含めることで、ユーザーはパッケージをpackディレクトリに配置するだけで、ヘルプコマンドがすぐに機能します。プラグインのヘルプを変更した後は、コマンドを再実行することを忘れないでください。
:helptags path/start/foobar/doc
:helptags path/opt/fooextra/doc
プラグイン間の依存関係
packload-two-steps 同じ機能に依存する2つのプラグインがあるとします。共通の機能をautoloadディレクトリに配置して、自動的に検出できるようにすることができます。パッケージには次のファイルが含まれます。
pack/foo/start/one/plugin/one.vim
call foolib#getit()
pack/foo/start/two/plugin/two.vim
call foolib#getit()
pack/foo/start/lib/autoload/foolib.vim
func foolib#getit()
これは、プラグインのソース時にstartパッケージがautoloadファイルを検索するため機能します。
スクリプトが何をしているのかを調べるためにスクリプトに追加できる明らかなメッセージに加えて、Vimはデバッグモードを提供しています。これにより、ソースされたファイルまたはユーザー関数をステップ実行し、ブレークポイントを設定できます。
注記: デバッグモードは完璧からはほど遠いです。デバッグはVimの動作に副作用があります。すべてをデバッグするために使用することはできません。例えば、デバッグメッセージによって表示が乱れます。
デバッグモードの代替手段として、
'verbose'オプションを設定できます。数値を大きくすると、Vimが実行していることについてより詳細なメッセージが表示されます。
デバッグモードに入るには、次のいずれかの方法を使用します。1.
-D引数を使用してVimを起動します。
vim -D file.txt
最初のvimrcファイルがソースされるとすぐにデバッグが開始されます。これは、Vimの起動時に何が起こっているのかを調べるのに役立ちます。副作用として、Vimは初期化が完了する前にターミナルモードを切り替えるため、予測できない結果になります。(Windowsの)GUIのみのバージョンでは、GUIウィンドウが開かれるとすぐにデバッグが開始されます。これを早期に行うには、vimrcファイルに「:gui」コマンドを追加します。
:debug2. コマンドの先頭に「:debug」を付けて実行します。デバッグはこのコマンドの実行中のみ実行されます。特定のスクリプトまたはユーザー関数のデバッグに役立ちます。また、autocommandで使用されるスクリプトや関数にも役立ちます。例
:debug edit test.txt.gz
3. ソースされたファイルまたはユーザー関数にブレークポイントを設定します。コマンドラインでこれを行うことができます。
vim -c "breakadd file */explorer.vim" .
これにより、Vimが実行され、「explorer.vim」スクリプトの最初の行で停止します。ブレークポイントはデバッグモード中でも設定できます。
デバッグモードでは、実行されるすべてのコマンドが実行前に表示されます。コメント行、空行、実行されない行はスキップされます。「|」で区切られた2つのコマンドを含む行の場合、各コマンドは別々に表示されます。
デバッグモード
デバッグモードに入ると、通常のExコマンドを使用できます。例えば、変数の値を検査するには
echo idx
ユーザー関数内では、これによりローカル変数「idx」の値が出力されます。グローバル変数の値を取得するには、「g:」を先頭に付けます。
echo g:idx
すべてのコマンドは、現在の関数またはスクリプトのコンテキストで実行されます。オプションを設定することもできます。例えば、
'verbose'を設定またはリセットすると何が起こるかが表示されますが、関心のある行を実行する直前に設定することをお勧めします。
:set verbose=20
画面を更新する必要があるコマンドは避ける必要があります。その効果は、デバッグモードを終了するまで認識されません。例えば
:help
はあまり役に立ちません。
デバッグモードには、別々のコマンドライン履歴があります。
関数行の行番号は、関数の先頭からの相対的な番号です。位置がわからない場合は、関数を定義するファイルを別のVimで編集し、関数の先頭を探して「99j」を実行します。「99」を行番号に置き換えます。
さらに、次のコマンドを使用できます。
>contcont 次のブレークポイントに到達するまで実行を続けます。
>quitquit 実行を中断します。これは
CTRL-C
を使用するのと同じで、一部のものはまだ実行される可能性があり、すべてを中断するわけではありません。それでも次のブレークポイントで停止します。
>nextnext コマンドを実行し、完了したらデバッグモードに戻ります。これは、ユーザー関数の呼び出しとソースされたファイルをステップオーバーします。
>stepstep コマンドを実行し、次のコマンドに対してデバッグモードに戻ります。これは、呼び出されたユーザー関数とソースされたファイルにステップインします。
>interruptinterrupt これは
CTRL-C
を使用するのと同じですが、「>quit」とは異なり、実行される次のコマンドに対してデバッグモードに戻ります。
:finallyと
:catchを割り込み例外でテストするのに役立ちます。
>finishfinish 現在のスクリプトまたはユーザー関数を終了し、ソースまたは呼び出したコマンドの後のコマンドに対してデバッグモードに戻ります。
>bt
>backtrace
>where backtrace 現在のデバッグセッションのコールスタックトレースを表示します。bt where
>frameframe N バックトレースレベルNに移動します。+と-の記号は相対的な移動を行います。例:「:frame +3」は3フレーム上に移動します。
>upup コールスタックトレースから一つ上のレベルに移動します。
>downdown コールスタックトレースから一つ下のレベルに移動します。
デバッグモードの追加コマンドについて
これらのコマンドにはコマンドライン補完がありません。通常のExコマンドのみ補完されます。
複数のコマンドが同じ文字で始まらない限り、1文字まで短縮できます。「f」は「finish」、「fr」は「frame」を表します。
<CR>
を押すと、前のコマンドが繰り返されます。別のコマンドを実行すると、これはリセットされます(何を繰り返したいのかが不明なため)。
同じ名前のExコマンドを使用する場合は、コロンを前に付けます。例:「:cont」、「:next」、「:finish」(または短縮形)。
バックトレースは関数呼び出しの階層を示します。例:
>bt
3 function One[3]
2 Two[3]
->1 Three[3]
0 Four
line 1: let four = 4
「->」は現在のフレームを示しています。「up」、「down」、「frame N」を使用して別のフレームを選択してください。
現在のフレームでは、ローカルな関数変数を評価できます。現在の行のコマンドを表示する方法はまだありません。
ブレークポイントの設定
:breaka :breakadd :breaka[dd] func [lnum]
{name}
関数にブレークポイントを設定します。例
:breakadd func Explore
有効な関数名かどうかはチェックしないため、関数が定義される前にブレークポイントを設定できます。
:breaka[dd] file [lnum]
{name}
ソースファイルにブレークポイントを設定します。例
:breakadd file 43 init.vim
:breaka[dd] here 現在のファイルの現在の行にブレークポイントを設定します。以下と同じです。
:breakadd file <cursor-line> <current-file>
これは、ファイルのソース時に実行されるコマンドにのみ有効であり、そのファイルで定義された関数には有効ではありません。
:breaka[dd] expr
{expression}
{expression}
の評価結果が異なる値になったときにブレークするブレークポイントを設定します。例
:breakadd expr g:lnum
グローバル変数lnumが変更されるたびにブレークします。
評価エラーは抑制されます。まだ存在しない変数の名前を使用できます。これは、式に間違いがあっても何も気づかないことを意味します。
スクリプト変数を監視する場合、スクリプトを切り替える際にブレークします。スクリプト変数は、定義されているスクリプトでのみ有効であり、そのスクリプトが複数の他のスクリプトから呼び出される場合、その特定の変数が再び表示可能またはアクセス不能になるたびに停止します。
[lnum]はブレークポイントの行番号です。Vimはこの行以降で停止します。省略した場合は行1が使用されます。
:debug-name
{name}
は、ファイル名または関数名と照合されるパターンです。パターンは、autocommandで使用されるものと同じです。完全一致が必要です(パターンが"^"で始まり"$"で終わる場合と同じ)。"*"は任意の文字列と一致します。
'ignorecase'は使用されませんが、パターン内で"\c"を使用して大文字と小文字を区別しないようにできます
/\c。関数名のための()を含めないでください!
ソースされたスクリプトの照合は、完全なファイル名に対して行われます。パスを指定しない場合は、現在のディレクトリが使用されます。例
breakadd file explorer.vim
現在のディレクトリにある"explorer.vim"と一致します。
breakadd file *explorer.vim
".../plugin/explorer.vim"、".../plugin/iexplorer.vim"など、と一致します。
breakadd file */explorer.vim
他のディレクトリにある".../plugin/explorer.vim"と"explorer.vim"と一致します。
関数の照合は、「:function」の出力に表示される名前に対して行われます。ローカル関数の場合、"99_"のようなものが前に付けられます。
関数は最初にロードされ、後で実行されます。「file」ブレークポイントはロード時にチェックされ、「func」ブレークポイントは実行時にチェックされます。
:breakd[el] * すべてのブレークポイントを削除します。
:breakd[el] func [lnum] {name}
関数のブレークポイントを削除します。
:breakd[el] file [lnum] {name}
ソースファイルのブレークポイントを削除します。
:breakd[el] here 現在のファイルの現在の行にあるブレークポイントを削除します。
[lnum]を省略すると、関数またはファイルの最初のブレークポイントが削除されます。{name}
は、":breakadd"コマンドで入力したものと完全に一致する必要があります。"explorer"、"*explorer.vim"、"*explorer*"は異なります。
その他
:debugg :debuggreedy :debugg[reedy] ユーザーから直接取得する代わりに、通常の入力ストリームからデバッグモードのコマンドを読み取ります。テストスクリプトでのみ役立ちます。例
echo 'q^Mq' | vim -e -s -c debuggreedy -c 'breakadd file script.vim' -S script.vim
:0debugg[reedy] ":debuggreedy"を元に戻します。デバッグモードのコマンドをユーザーから直接取得し、デバッグコマンドにタイピングを使用しません。
プロファイリングとは、Vimが関数やスクリプトの実行に費やされた時間を測定することです。
例えば、one_script.vimスクリプトファイルをプロファイルするには
:profile start /tmp/one_script_profile
:profile file one_script.vim
:source one_script.vim
:exit
:prof[ile] start
{fname}
:prof :profile E750 プロファイリングを開始し、終了時または
:profile stop
コマンドまたは
:profile dump
コマンドが呼び出されたときに、出力を
{fname}
に書き込みます。「~/」と環境変数は
{fname}
で展開されます。
{fname}
が既に存在する場合は、静かに上書きされます。変数
v:profilingは1に設定されます。
:prof[ile] stop 収集されたプロファイリング情報をログファイルに書き込み、プロファイリングを停止します。:profile start
コマンドを使用して、プロファイリング統計をクリアし、プロファイリングを再開できます。
:prof[ile] pause 次の:profile continue
コマンドまでプロファイリングを停止します。カウントしないもの(例:外部コマンド)を実行する場合に使用できます。ネストしません。
:prof[ile] continue :profile pause
の後、プロファイリングを続行します。
:prof[ile] func
{pattern}
パターン
{pattern}
に一致する関数をプロファイルします。
{pattern}
の使用方法については、
:debug-nameを参照してください。
:prof[ile][!] file
{pattern}
パターン
{pattern}
に一致するスクリプトファイルをプロファイルします。
{pattern}
の使用方法については、
:debug-nameを参照してください。これは、スクリプト自体のみをプロファイルし、その中で定義された関数はプロファイルしません。[!]を追加すると、スクリプトで定義されたすべての関数がプロファイルされます。プロファイリングは、このコマンドの後でスクリプトがロードされたときにのみ開始されます。スクリプト自体の`:profile`コマンドは機能しません。
:prof[ile] dump 現在のプロファイリングの状態をすぐにログファイルに書き込みます。このコマンドを実行した後も、Vimはプロファイリング統計の収集を続けます。
:profd[el] ...
:profd :profdel 指定された引数についてプロファイリングを停止します。
:breakdelで引数を確認してください。例
profdel func MyFunc
profdel file MyScript.vim
profdel here
常に":profile start fname"コマンドで開始する必要があります。結果のファイルはVimが終了したときに書き込まれます。たとえば、特定の関数をプロファイルするには
profile start /tmp/vimprofile
profile func MyFunc
説明のために行番号を前に付けた出力の例を以下に示します。
1 FUNCTION Test2()
2 Called 1 time
3 Total time: 0.155251
4 Self time: 0.002006
5
6 count total (s) self (s)
7 9 0.000096 for i in range(8)
8 8 0.153655 0.000410 call Test3()
9 8 0.000070 endfor
10 " Ask a question
11 1 0.001341 echo input("give me an answer: ")
ヘッダー(1~4行目)は関数の全体にかかった時間を示しています。「合計」時間は、関数が実行されている間に経過した時間です。「自己」時間は、「合計」時間から他のユーザー定義関数で費やされた時間を差し引いた時間です。
他のユーザー定義関数
ソースされたスクリプト
実行されたautocommand
外部(シェル)コマンド
7~11行目は、各実行行で費やされた時間を示しています。実行されていない行はカウントされません。したがって、コメント行は決してカウントされません。
Count列は、行が実行された回数を示しています。7行目の"for"コマンドは、後続の行よりも1回多く実行されます。これは、ループの終わりを検出するためにも行が実行されるためです。
Vimがユーザー入力待ちに費やす時間はまったくカウントされません。したがって、input()プロンプトへの応答にかかる時間は関係ありません。
プロファイリングは、時間がどこで費やされているかの良い指標を与えるはずです。ただし、結果を台無しにする可能性のあるさまざまな要因があることに注意してください。
実際の経過時間が測定されます。他のプロセスがビジー状態の場合、予測できないタイミングで遅延が発生する可能性があります。プロファイリングを数回実行し、最も低い結果を使用することをお勧めします。
1行に複数のコマンドがある場合、時間は1つしか取得されません。個々のコマンドの時間を見るには、行を分割してください。
合計された行の時間は、関数の全体時間よりも短いことがほとんどです。間にオーバーヘッドがあります。
Vimが終了する前に削除された関数は、プロファイリング情報を生成しません。必要に応じて
v:profiling変数を確認できます。
:if !v:profiling
: delfunc MyFunc
:endif
スリープモードが有効になった場合、またはプロセッサ周波数が電力を節約するために低減された場合、マルチプロセッサシステムではプロファイリングが奇妙な結果を与える可能性があります。
関数が再帰的に使用されると、「自己」時間は間違っています。
エディターの状態は、コンテキストという概念で表されます。これには、現在の
ジャンプリスト、
レジスタの値など、以下に説明するものが含まれます。
コンテキスト辞書 コンテキストオブジェクトは、次のキーと値のペアを持つ辞書です。