Up: 目次   [Index]


繰り返しコマンド、Vim script、スクリプトのデバッグ

*repeat.txt*    For Vim バージョン 8.1.  Last change: 2019 Sep 20


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

繰り返しコマンド、Vim script とデバッグ

繰り返しについてはユーザーマニュアルの 26 章 |usr_26.txt| に紹介があります。

1. 單發繰り返し|single-repeat|
2. 多重繰り返し|multi-repeat|
3. 複雜な繰り返し|complex-repeat|
4. Vim script を使ふ|using-scripts|
5. Vimパッケージを使ふ|packages|
6. Vimパッケージを作る|package-create|
7. スクリプトのデバッグ|debug-scripts|
8. プロファイリング|profiling|

1. 單發繰り返し

.

最後の變更を繰り返します。變更の回數は [count] で指定した回數で置き換へられます。’cpoptions’ に ’y’ フラグが含まれてる時には、ヤンクコマンドも繰り返します。コマンドラインコマンドは繰り返しません。

單純な變更は "." コマンドで繰り返すことができます。回數を指定しなければ、最後の變更の回數が使用されます。回數を指定した場合、最後のそれと置き換へられます。|v:count| と |v:count1| が設定されます。

最後に行はれた變更が番號付きレジスタの指定を含んでゐた場合、レジスタ番號は增加されます。これをどのやうに使ふかの例は |redo-register| を參照してください。

Note:
ビジュアル選擇を使用したコマンドを繰り返す時は、同じ「サイズ」の範圍が使用されることに注意してください。|visual-repeat| を參照してください。

@:

最後のコマンドラインを [count] 回繰り返します。

{|+cmdline_hist| が無效にされてゐると使へない}

2. 多重繰り返し

:[range]g[lobal]/{pattern}/[cmd]

[range] の範圍で {pattern} にマッチする行に對して、Ex コマンド [cmd] (省略した場合 ":p") を實行します。

:[range]g[lobal]!/{pattern}/[cmd]

[range] の範圍で {pattern} にマッチしない行に對して、Ex コマンド [cmd] (省略した場合 ":p") を實行します。

:[range]v[global]/{pattern}/[cmd]

:g! と同じです。

{pattern} の兩側の ’/’ の代はりにどんなシングルバイト文字でも使ふことができます。しかしアルファベット、’\’、’"’、’|’ は使へません。これは檢索パターンや置換文字列に ’/’ が含まれる場合に便利です。

パターンの定義については |pattern| を參照してください。

Note:
[cmd] は範圍指定を含むかもしれません。實例は |collapse| や |edit-paragraph-join| を參照してください。

global コマンドの動作は、まづ第 1 に [range] の行をスキャンしマッチした行すべてに印をつけます (複數行にかかるパターンではマッチの最初の行だけが重要です)。

次のスキャンでマークされたすべての行について、カーソルがその行にあるかのやうに [cmd] が實行されます。":v" と ":g!" の場合は、マークされてゐないすべての行についてコマンドが實行されmasu。行が削除された場合、そのマークは消滅します。

省略した場合の [range] はバッファ全體 (1,$) です。コマンドを中斷するには "CTRL-C" を使用します。ある行についてエラーメッセージが與へられると、そのラインに對するコマンドは中斷され、global コマンドはマッチした次の行の處理を續けます。

このコマンドが再歸的に使はれるとき、それは一行のみに働きます。この時は範圍の指定は許されてゐません。これはあるパターンにマッチして別のパターンにマッチしない行を見つけるのに便利です:

:g/found/v/notfound/{cmd}

これは、はじめに "found" を含むすべての行を見つけますが、"notfound" にマッチしないものがあるときにだけ {cmd} を實行します。

非 Ex コマンドを實行するために ‘:normal‘ コマンドを使用することができます:

:g/pat/normal {commands}

確實に {commands} が完全なコマンドとして終了するやうにしてください。さうでないと Vim は全部のマッチに 1 つ 1 つについて、コマンドの殘りを期待して貴方の入力を待ち續けるでせう。畫面は更新されないので、いま何をしてゐるのかわからないでせう。|:normal| を參照してください。

undo/redo コマンドは global コマンドを一度に undo/redo します。以前の文脈マークだけが一度設定されます ("”" でグローバルコマンド實行前にカーソルがあつた場所に戾ることができます)。

global コマンドは最後に使用した檢索パターンと、最後に使用した置換パターンの兩方を設定します (これは vi 互換)。これにより全體に對して文字列置換を行ふのが簡單になります:

:g/pat/s//PAT/g

これは全ての "pat" を "PAT" に置き換へます。同じことは次でも可能です:

:%s/pat/PAT/g

こちらのはうが 2 文字短い!

Ex モード中で "global" を使ひ、そのコマンドに ":visual" を指定する場合はやや特殊です。これを行ふと、マッチする行へ移動してノーマルモードに入るので、|Q| を押して Ex モードへ戾るまでコマンドを實行することができます。これがマッチする各行に對して繰り返されます。これを行つてゐる閒は ":global" を使ふことはできません。中止するには CTRL-C を 2 回押してください。

3. 複雜な繰り返し

q{0-9a-zA-Z"}

タイプした文字をレジスタ {0-9a-zA-Z"} にレコーディング (大文字なら追記) します。レジスタを實行中は ’q’ コマンドは無效化されます。マッピングや |:normal| の中でも機能しません。

Note:
もしもレコーディングに使つてゐるレジスタが、その最中に |y| や |p| で使はれた場合、恐らく期待しない結果になることに注意してください。なぜなら、|p| で貼り付けられる內容は記錄されたマクロのものになり、|y| でコピーを行ふと記錄されたマクロを上書きしてしまふからです。

q

レコーディングを終了します。(實裝のメモ: レコーディングを終了する ’q’ は、それがマッピングの結果であつてもレジスタに記錄されません)

@{0-9a-z".=*+}

レジスタ {0-9a-z".=*+} の內容を [count] 回實行します。

Note:
レジスタ ’%’ (現在のファイルの名前) と ’#’ (オルタネートファイルの名前) は使用できないことに注意してください。

レジスタはマッピングと同樣に實行されます。つまり、’wildchar’ と ’wildcharm’ の違ひが動作に影響します。 "@=" を使用すると式を入力するためのプロンプトが表示され、そこに入力した式の評價結果が實行されます。|@:| も參照してください。

@@

直前の @{0-9a-z":*} を [count] 回繰り返します。

:[addr]*{0-9a-z".=+}
:[addr]@{0-9a-z".=*+}

レジスタ {0-9a-z".=*+} の內容を Ex コマンドとして實行します。まづ最初にカーソルを [addr] 行に設定します (省略した場合は現在の行)。レジスタの最終行に <CR> が含まれない場合、’cpoptions’ に ’e’ フラグが含まれてゐれば自動的に追加されます。

Note:
":*" コマンドは ’cpoptions’ に ’*’ フラグが含まれてゐた場合にだけ認識されることに注意してください。これは ’nocompatible’ が使用されてゐる時にはデフォルトにはなりません。

":@=" には最後に評價された式が使用されます。式の評價結果が Ex コマンドとして實行されます。 これらのコマンド內ではマッピングは行はれません。

將來: 指定された範圍の各々の行に對してレジスタの內容が實行されるでせう。

:[addr]@:

最後のコマンドラインを繰り返します。まづカーソルを [addr] 行に設定します (省略した場合は現在の行)。

:[addr]@ or :[addr]@@

最後の :@{0-9a-z"} を繰り返します。まづ最初にカーソルを [addr] 行に設定します (省略した場合は現在の行)。

4. Vim script を使ふ

Vim script の書き方はユーザーマニュアルの 41 章 |usr_41.txt| を參照してください。

:so[urce] {file}

Ex コマンドを {file} から讀み込みます。これは ":" で始まるコマンドを列擧したファイルです。{譯注: 實際に ":" を書く必要はありません}

自動コマンド |SourcePre| が發生します。

:so[urce]! {file}

Vim コマンドを {file} から讀み込みます。ノーマルモードでファイルの內容をあなたがタイプしたのと同じやうに實行されます。

|:global|, |:argdo|, |:windo|, |:bufdo| で使つたとき、ループ中や他のコマンドが續けられたときは、コマンドの實行中は表示は更新されません。

|sandbox| 內では使用できません。

:ru[ntime][!] [where] {file} ..

runtimepath’ か ’packpath’ で示された各ディレクトリの {file}から Ex コマンドを讀み込みます。ファイルがなくてもエラーにはなりません。

例:

:runtime syntax/c.vim

{file} には空白で區切つて複數のファイルを指定できます。指定された {file} は ’runtimepath’ の最初のディレクトリ、次に 2 番目のディレクトリ、と檢索されます。{file} に空白を含めるにはバックスラッシュを使ひます (しかしファイル名に空白を含めるのは望ましくありません。トラブルのもとです)。

[!] を付けると見つかつた全てのファイルを讀み込みます。付けなければ最初に見つかつたファイルだけを讀み込みます。

[where] が省略された場合は ’runtimepath’ が使はれます。

他の値は以下の通り:

STARTpackpath’ の "start" ディレクトリ以下を檢索する
OPTpackpath’ の "opt" ディレクトリ以下を檢索する
PACKpackpath’ の "start" と "opt" ディレクトリ以下を檢索する
ALLまず ’runtimepath’ が使はれ、次に ’packpath’ の "start" と "opt" ディレクトリ以下を檢索する

{file} がワイルドカードを含んでゐるとそれは展開されます。例:

:runtime! plugin/*.vim

これは Vim が起動時にプラグインファイルを讀み込むのに使つてゐるものです。次のは似てゐますが:

:runtime plugin/*.vim

これは最初に見つかつたファイルだけを讀み込みます。

verbose’ が 1 以上ならファイルが見つからないときにメッセージが表示されます。’verbose’ が 2 以上なら見つかつた全てのファイルについてメッセージが表示されます。

:pa[ckadd][!] {name}

packpath’ 中の任意のプラグインディレクトリを檢索し、見つかつたプラグインのファイルを讀み込みます。ディレクトリは以下にマッチしなければなりません:

pack/*/opt/{name} ~

見つかつたディレクトリは、もし含まれてゐなければ ’runtimepath’ に追加されます。もしディレクトリ ‘pack/*/opt/{name}/after’ が存在すれば、’runtimepath’ の最後に追加されます。

もしディレクトリ "pack/*/start" からのパッケージ讀み込みがスキップされた場合、次のディレクトリが最初に檢索されます:

pack/*/start/{name}

Note:
{name} はディレクトリの名前で、.vim ファイルの名前ではないことに注意してください。以下のパターンにマッチする全てのファイルが讀み込まれます。

pack/*/opt/{name}/plugin/**/*.vim

これにより、ちやうど ’runtimepath’ 內のプラグインのやうに、"plugin" 以下のサブディレクトリを使ふことができます。

ファイルタイプの檢知が有效化されてゐない場合 (これは通常 .vimrc 中の "syntax enable" か "filetype on" コマンドにより行はれます)、"{name}/ftdetect/*.vim" ファイルを參照します。

任意の ! が付けられた場合、プラグインのファイルや ftdetect のスクリプトは讀み込まれず、マッチしたディレクトリのみ ’runtimepath’ に追加されます。これは .vimrc に書く場合は便利です。追加されたプラグインは初期化時に讀み込まれます。|load-plugins| を參照してください。

また |pack-add| も參照してください。

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

:packl[oadall][!]

packpath’ 以下の "start" ディレクトリ中の全パッケージを讀み込みます。

最初に、見つかつたディレクトリが全て ’runtimepath’ に追加され、次にそのディレクトリ內で見つかつたプラグインが讀み込まれます。これにより、あるプラグインが別のプラグインの何か、例へば "autoload" ディレクトリに依存することが許可されます。これがどのやうに役立つかは |packload-two-steps| を參照してください。

これは通常起動時に .vimrc が讀み込まれた後に自動的に行はれます。このコマンドはそれよりも前に行ふことができます。

パッケージの讀み込みは一度だけ行はれます。‘:packloadall‘ を再度使用しても效果はありません。任意の ! が付けられた場合はすでに讀み込みが行はれてゐてもパッケージを讀み込みます。

Note:
|vimrc| ファイル內に ‘:packloadall‘ が使はれてゐる場合、’runtimepath’ オプションが更新され、後で ’runtimepath’ 內のすべてのプラグインが讀み込まれることに注意してください。これはそれらが再び讀み込まれることを意味します。プラグインはそれを正しく扱ふことが期待されます。

(スクリプトを讀み込む際の) エラーは讀み込んでゐるスクリプトの讀み込みのみを中止させます。その他のプラグインは讀み込まれます。|packages| を參照してください。

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

:scripte[ncoding] [encoding]

スクリプトで使はれてゐる文字コードを宣言します。それ以降の行は必要なら [encoding] から ’encoding’ オプションの文字コードに變換されます。例:

scriptencoding iso-8859-5
scriptencoding cp932

[encoding] が空のときは變換はされません。これはそれ以降の行の文字コードの變換を限定するために使へます:

scriptencoding euc-jp
... 變換される ...
scriptencoding
... 變換されない ...

變換がシステムによつて提供されない場合、エラーメッセージは表示されず變換もされません。ある行が變換できなかつた場合、エラーにはならず元の行が保持されます。

"ucs-2" や "ucs-4" を使はないでください。スクリプトをその文字コードで書くことはできません (NULバイトが含まれてしまふため)。スクリプトの最初に utf-8 の BOM (Byte Order Mark: バイトオーダーマーク) があると Vim はそれを認識します。":scriptencoding utf-8" と書く必要はありません。

|.vimrc| の中で ’encoding’ オプションを設定してゐる場合は、‘:scriptencoding‘ はそれよりも後に置かなければなりません。例:

set encoding=utf-8
scriptencoding utf-8
:scriptv[ersion] {version}

同じファイルの後に續く行の Vim のバージョンを指定します。讀み込まれるスクリプトのトップレベルにのみ適用され、函數內部には適用されません。

{version} が現在の Vim のバージョンがサポートしてゐるものよりも高い場合は E999 が與へられます。スクリプトを古い Vim バージョンで動作するやうに書き直すか、または Vim を新しいバージョンに更新する必要があります。バージョン閒の變更點については |vimscript-version| を參照してください。

:scr[iptnames]

讀み込まれてゐるスクリプトを讀み込まれた順番どほりに全て表示します。數字はスクリプトの ID (識別子) |<SID>| に使はれてゐます。

{|+eval| 付きでコンパイルしないと使へない}

:scr[iptnames][!] {scriptId}

スクリプト {scriptId} を編輯します。":scriptnames name" は動作しますが、":script name" を使用することを推奬します。カレントファイルを抛棄 |abandon| できず、[!] も付けられてゐないときは、コマンドは失敗します。

:fini[sh]

スクリプトの讀み込みを停止します。スクリプトファイルでのみ使へます。これはファイルの殘りを讀み込ませないための手輕な方法です。|:try| を使つた後で |:finally| を見つける前に使はれると、まづ ":finally" と |:endtry| の閒のコマンドが實行されます。この手續きは入れ子になつてゐる全ての ":try" に對して適用されます。入れ子の一番外側の ":endtry" に達するとスクリプトを停止します。

全てのコマンドとコマンドシーケンスは、名前付きレジスタに格納することで繰り返し實行することができます。レジスタにコマンドを格納する方法は 2 つあります:

良く使ふコマンドシーケンスは ’:map’ コマンドでファンクションキーに割當てることができます。

別の方法としてコマンドをファイルに記述しておき、それを ’:source!’ コマンドで讀込んで實行するといふ方法もあります。長いコマンドシーケンスにとつては便利です。ファンクションキーに複雜なコマンドを割當てるために ’:map’ コマンドと組み合はせることができます。

:source’ コマンドはファイルから 1 行ずつ Ex コマンドを讀込みます。キーボード入力が必要になつた場合にはタイプする必要が生じます。’:source!’ コマンドはスクリプトファイルから 1 字ずつ讀込みます。各々のキャラクタはユーザーがタイプしたものとして解釋されます。

例: ":!ls" コマンドを實行したとすると |hit-enter| プロンプトが表示されます。"!ls" を含むファイルを ’:source’ したなら、自分で <Enter> をタイプする必要があるでせう。しかし ’:!ls’ を含んだファイルを ’:source!’ したなら、<CR> が見つかるまでそのファイルから續く文字が讀込まれます。":!ls" がファイルの最終行でない限り、<CR> を自分でタイプする必要はないでせう。

スクリプトファイルの中で ’:source[!]’ コマンドを使ふことも可能なので、階層關係のあるスクリプトファイルを作ることもできます。’:source’ コマンドは同時に開くことのできるファイル數 (だいたい 15) と同じだけネスト (入れ子に) することができます。’:source!’ コマンドは 15 段までネストすることができます。

讀込まれるファイルの中ではファイル名が必要なところに、"<sfile>" といふ文字列 (文字通りであつてスペシャルキーではありません) を使ふことができます。この文字列は讀込まれたファイルのファイル名に置き換へられます。例へば、".vimrc" ファイルと同じ場所に "other.vimrc" といふファイルがあれば、".vimrc" から次のコマンドでそれを讀込むことができます:

:source <sfile>:h/other.vimrc

スクリプトファイル內では端末依存のキーコードは端末非依存の 2 文字のコードで表現されます。これは異なる種類の端末でも同じ方法で依存キーコードを使用できることを意味します。最初のキーコードの文字は 0x80 つまり 128 で、畫面では "‘~@’" と表されます。2 つ目のキャラクタは |key-notation| の表にて見ることができます。これらのコードはどれも CTRL-V に續けて 3 つの 10 進コードを叩くことで入力できます。これは termcap コード <t_xx> に對しては使用できません。これらはマッピングの中だけで使ふことができます。

MS-DOS, Win32 と OS/2: ":source" で讀込まれるファイルは通常、行末に <CR><NL> を持つてゐます。これらは常に機能します。もしも行末に <NL> を持つファイルを使つてゐるならば (例へば UNIX で作られたファイル)、’fileformats’ が空でかつ先頭行が <CR> で終はつてなければ正しく認識されます。しかしこれは先頭行が "‘:map <F1> :help^M’" (^M は <CR>) のやうな內容だつた場合には失敗します。ファイルの先頭行が <CR> で終はつてゐてその 1 行限りの時、先頭行から <CR> が失はれてしまふのでエラーメッセージが出るでせう。

Mac Classic: ":source" で讀み込まれるファイルは通常、行末に <CR> を持つてゐます。これらは常に機能します。もしも行末に <NL> を持つファイルを使つてゐるならば (例へば UNIX で作られたファイル)、’fileformats’ が空でかつ先頭行が <CR> で終はつてなければ正しく認識されます。先頭行に <CR> を持ち <NL> で改行してゐるファイルを使用しないやうに氣をつけてください。

その他のシステムでは、Vim は ":source" で讀込まれたファイルの行末は <NL> であることを期待します。これは常に機能します。もしも行末が <CR><NL> であるファイル (例へば MS-DOS で作られたファイル) を使つてゐるならば、全ての行が末尾に <CR> を持つてゐることになります。これは幾つかのコマンド (例、マッピング) にとつて問題となるでせう。自動的に行末記號を檢出する機構はありません。なぜなら <CR> で終了するマッピングの定義をファイルの先頭に書くことは一般的で、自動檢出用の仕組みを作るのが難しいからです。

":source" で讀込まれた Ex コマンドスクリプトのファイル內の長い行は、行繼續記號 "\" (backslash) を次行の先頭に插入することで分割できます。バックスラッシュの前に空白を插入することも可能で、これらは無視されます。

例: 次の記述は

:set comments=sr:/*,mb:*,el:*/,
         \://,
         \b:#,
         \:%,
         \n:>,
         \fb:-

次の 1 行と同じ意味として解釋されます:

:set comments=sr:/*,mb:*,el:*/,://,b:#,:%,n:>,fb:-

バックスラッシュの前に先行する空白文字は全部無視されます。しかしながらバックスラッシュのある行の 1 つ前の行末には、自由に空白文字を插入することはできません; 付加的な空白文字が許されるかどうかは、コマンドが分割される位置に依存します。

スペースが必要な場合には、バックスラッシュの直後に書くのがベストです。行末にスペースを書くと、視認が難しく、誤つて削除されてしまふかもしれません。

:syn match Comment
    \ "very long regexp"
    \ keepend

":append" と ":insert" コマンドには 1 つ問題があります:

:1append
\asdf
.

バックスラッシュは行繼續シンボルに見えますが、コマンドの結果はこのやうになります:

:1appendasdf
.

これを避けるには、’cpoptions’ に ’C’ フラグを追加することです:

:set cpo+=C
:function Foo()
:1append
\asdf
:.
:set cpo-=C

Note:
函數の中でその手のコマンドを實行するには、函數定義の際に ’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\

從つて一般的ではないですが、行頭のバックスラッシュを採用してゐます。

繼續行の中でコメントを開始すると、後續のすべての行がコメントの一部になります。それは長い閒このやうなものだつたので、繼續行のシーケンスの途中でコメントを追加しようとしたとき、\" は有效な繼續行であるため、それを使用することはできませんでした。’"\ ’ を使用すると最も近いものになりますが、少し奇妙に見えるかもしれません。バックスラッシュの後にスペースを必要とすることは、これが通常のコメント行にはとても見えないやうにするためです。

5. Vim パッケージを使ふ

Vim script のパッケージは 1 つかそれ以上のプラグインを含むディレクトリです。通常のプラグインと比べた長所は以下の通りです:

パッケージの使用と自動讀み込み

あなたの Vim 關聯のファイルが "~/.vim/" にあるとします。さらに ZIP 壓縮ファイル "/tmp/foopack.zip" からパッケージを追加したい場合は以下の通りです:

% mkdir -p ~/.vim/pack/foo
% cd ~/.vim/pack/foo
% unzip /tmp/foopack.zip

"foo" といふディレクトリ名は任意です。あなたが好きな名前を付けられます。

今あなたの ~/.vim の下には以下のファイルがあるはずです:

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

Vim が起動した時、.vimrc を處理した後、’packpath’ に含まれる "pack/*/start" ディレクトリの下の全てのディレクトリをスキャンします。最初にそのディレクトリは ’runtimepath’ に追加されます。次に全てのプラグインがロードされます。これら 2 つのステップがどのやうに役立つかについては、|packload-two-steps| を參照してください。

上記の例では "pack/foo/start/foobar/plugin/foo.vim" を見つけて "~/.vim/pack/foo/start/foobar" を ’runtimepath’ に追加します。

もし "foobar" プラグインが作動し ’filetype’ を "some" にセットした場合、’runtimepath’ に含まれてゐるため、Vim は上記の syntax/some.vim ファイルを見つけます。

もし存在するなら、Vim は ftdetect ファイルもロードします。

Note:
"pack/foo/opt" 以下のファイルは自動的に讀み込まれず、"pack/foo/start" 以下のファイルのみ讀み込まれることに注意してください。"opt" ディレクトリがどのやうに使はれるかについては下記の |pack-add| を參照してください。

パッケージの自動讀み込みはプラグインの讀み込みを無效化してゐる場合は起こりません。|load-plugins| を參照してください。

runtimepath’ を更新するためにパッケージを讀み込むには:

:packloadall

これはプラグインの讀み込みを無效化してゐても效果があります。自動讀み込みは一度だけ行はれます。

パッケージに "after" ディレクトリがある場合、そのディレクトリは ’runtimepath’ の末尾に追加されます。そのため、そこにあるものは全て後でロードされます。

單一プラグインの使用とその自動讀み込み

パッケージでなく單一のプラグインがある場合は、餘分なディレクトリ階層を作成する必要があります。

% mkdir -p ~/.vim/pack/foo/start/foobar
% cd ~/.vim/pack/foo/start/foobar
% unzip /tmp/someplugin.zip

これで、次のファイルが作成されます:

pack/foo/start/foobar/plugin/foo.vim
pack/foo/start/foobar/syntax/some.vim

ここから上のやうに動作します。

任意のプラグイン

上記の pack ディレクトリから任意のプラグインをロードするには ‘:packadd‘ コマンドを使ひます:

:packadd foodebug

これは ’packpath’ の "pack/*/opt/foodebug" から ~/.vim/pack/foo/opt/foodebug/plugin/debugger.vim を見つけて讀み込みます。

これにより何かしらの條件が滿たされる時に實行されるやうにできます。例へば、Vim がある機能をサポートしてゐるかどうかとか、依存したモノが見つからないとか、さういふことに依存させることができます。

このコマンドをあなたの |.vimrc| に入れることで、起動時に任意のプラグインを讀み込むこともできます。

:packadd! foodebug

餘分な "!" は Vim が |--noplugin| で起動されてゐれば、プラグインがロードされないやうにするためです。

パッケージが "opt" ディレクトリしか持たなかつたとしても一向に構ひません。その場合、それを使ひたいときは (明示的に) 讀み込む必要があります。

どこに何を置くか

:colorscheme‘ で讀み込まれるカラースキームは "pack/*/start" と "pack/*/opt" の下から探し出されるので、どこにでも置くことができます。たとへば、".vim/pack/mycolors/opt/dark/colors/very_dark.vim" のやうに、"pack/*/opt" の下に置くことをお勸めします。

Filetype プラグインはファイルタイプに複數のプラグインがあり、‘:packadd‘ でロードするプラグインを選擇したいのでない限り "pack/*/start" の下に置く必要があります。例へば、コンパイラのバージョンに依存する場合:

if foo_compiler_version > 34
  packadd foo_new
else
  packadd foo_old
endif

"after" ディレクトリはパッケージで使ふには十中八九便利ではありません。しかし、使用が禁じられてゐるわけではありません。

6. Vim パッケージを作る

パッケージとして配布する 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 ~/.vim/pack/myfoobar
cd ~/.vim/pack/myfoobar
git clone https://github.com/you/foobar.git

ここで "myfoobar" はユーザーが選擇できる名前ですが、唯一の條件は他のパッケージとは異なることです。

ドキュメントでは、プラグインの機能について說明し、オプションのプラグインをロードする方法をユーザーに傳へます。

:packadd! fooextra

この packadd コマンドをプラグインの 1 つに追加して、オプションのプラグインが必要なときに實行することができます。

:helptags‘ コマンドを實行して、doc/tags ファイルを生成します。この生成されたファイルをパッケージに含めるといふことは、パッケージディレクトリにパッケージを落とすことができ、ヘルプコマンドがすぐに動作することを意味します。プラグインヘルプを變更した後にコマンドを再實行することを忘れないでください。

:helptags path/start/foobar/doc
:helptags path/opt/fooextra/doc

プラグイン閒の依存關係

同じ機能に依存する 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()

これは動作します。なぜなら、パッケージをロードすると、プラグインを讀み込む前に見つかつたすべてのディレクトリが ’runtimepath’ に追加されるからです。

7. スクリプトのデバッグ

スクリプトの動作を知るためのコードを追加することができるのは當り前として、Vim はデバッグモードを提供してゐます。これはスクリプトファイルやユーザーファンクションをステップ實行することやブレークポイントを仕掛けることを可能にします。

Note:
デバッグモードは未完成です。デバッグは Vim の動作に副作用をあたえます。全てをデバッグするのには使へません。例へば畫面がデバッグメッセージで散亂するときなど。

デバッグモードの代はりに ’verbose’ オプションが使へます。大きな値を設定すると Vim の動作についてより詳細なメッセージを得られます。

デバッグモードを開始する

デバッグモードを開始するにはこれらの方法のうちどれかを使ひます:

  1. Vim を |-D| 引數付きで起動します:
    vim -D file.txt
    

    最初に vimrc を讀み込むところからデバッグを開始します。これは Vim の起動時に何が起こつてゐるのかを調査するのに便利です。副作用として Vim は初期化が完了する前に安全のためターミナルモードを切替へる點があります。

    (Windows や Macintosh の) GUI 專用バージョンでは GUI ウィンドウを開くとすぐにデバッグが開始されます。これを早めるには vimrc ファイルに ":gui" と書いてください。

  2. ":debug" を前に付けてコマンドを實行します。そのコマンドを實行する閒だけデバッグできます。特定のスクリプトファイルやユーザー函數をデバッグするのに便利です。自動コマンドから呼び出されるスクリプトや函數にも便利です。例:
    :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" は實際の行番號に合はせて變へてください。

さらに、以下のコマンドが使へます:

cont

次のブレークポイントまで實行します。

quit

異常停止します。これは CTRL-C を使ふことに似てゐますが、全てを停止するわけではありません。次のブレークポイントで停止します。

next

コマンドを實行しそれが終はるとデバッグモードに戾ります。ユーザー函數やソースファイルの呼び出し時には呼び出し元の次の行に進みます。

step

コマンドを實行しそれが終はるとデバッグモードに戾ります。ユーザー函數やソースファイルの呼び出し時には呼び出し先の行に進みます。

interrupt

CTRL-C を使ふことに似てゐますが、次のコマンドを實行するためにデバッグモードに戾る場所が ">quit" と違ひます。例外割り込みについて |:finally| や |:catch| をテストするのに便利です。

finish

實行中のスクリプトやユーザー函數を終了し呼び出し元でデバッグモードに戾ります。

backtrace or bt or where

現在のデバッグセッションの呼び出しスタックトレースを表示します。

frame N

N 番目のスタックフレームへ移動します。+ や - 記號で、相對的に移動できます。例へば、"‘:frame +3’" で 3 つ上のスタックフレームへ移動します。

up

呼び出しスタックトレースを 1 つ上へ移動します。

down

呼び出しスタックトレースを 1 つ下へ移動します。

デバッグモードのコマンドについて:

バックトレースは、函數呼び出しの階層を表示します。例へば:

>bt
  3 function One[3]
  2 Two[3]
->1 Three[3]
  0 Four
行 1: let four = 4

"->" は現在いるフレームを指します。"up", "down", "frame N" を使ふことで、別のフレームを選擇できます。

現在いるフレームの、その函數內でのローカル變數にアクセスできます。現在いるフレームの、現在行の內容を表示する方法はまだありません。

ブレークポイントの定義

:breaka[dd] func [lnum] {name}

函數にブレークポイントを設定します。例:

:breakadd func Explore

函數名が妥當かどうか檢査をしないので、函數定義の前にブレークポイントを定義できます。

:breaka[dd] file [lnum] {name}

ソースファイルにブレークポイントを設定します。例:

:breakadd file 43 .vimrc
:breaka[dd] here

カレントファイルのカレント行にブレークポイントを設定します。次を行ふのと同樣です:

:breakadd file <cursor-line> <current-file>

Note:
これはファイルを讀み込むときに實行されるコマンドに對してだけ働き、そのファイル中で定義される函數に對しては働かないことに注意してください。

:breaka[dd] expr {expression}

{expression} の評價結果が異なる値となるときに、常にブレークするブレークポイントを設定します。例:

:breakadd expr g:lnum

これはグローバル變數の lnum が變化するときに常にブレークします。

Note:
|script-variable| を監視する場合、スクリプトが切り替はつたときにブレークすることに注意してください。これは、定義されたスクリプト內でのみ、そのスクリプト變數が有效だからです。そしてそのスクリプトがいくつかのその他のスクリプトから呼び出される場合、その特定の變數が可視となつたとき、もしくは再度アクセス不能となつたときに常に停止します。

[lnum] はブレークポイントにする行番號です。Vim はその行かそれ以降で停止します。省略時すると 1 行目になります。

{name} はファイル名や函數名のパターンです。パターンは自動コマンドで使はれるものと同じです。完全に一致しなければなりません (パターンが "^" で始まつて "$" で終はるやうに)。"*" は全ての文字列に一致します。’ignorecase’ は使はれませんが、大文字と小文字を區別しないために "\c" を使ふことができます |/\c|。函數名には () を付けないやうに!

ソースファイル名のパターン檢査はファイルのフルネームに對して行はれます。例:

breakadd file explorer

パスが閒違つてゐるので一致しません。

breakadd file *explorer.vim

".../plugin/explorer.vim" と ".../plugin/iexplorer.vim" に一致します。

breakadd file */explorer.vim

".../plugin/explorer.vim" だけに一致します。

函數名のパターン檢査は ":function" で表示される名前に對して行はれます。ローカル函數には "<SNR>99_" といつたものが前に付くといふことです。

Note:
函數はまづ讀み込まれ、後で實行されることに注意してください。讀み込まれたときに "file" ブレークポイントがチェックされ、實行されるときに "func" ブレークポイントがチェックされます。

ブレークポイントの削除

:breakd[el] {nr}

ブレークポイント {nr} を削除します。|:breaklist| を使つて番號を確認できます。

:breakd[el] *

すべてのブレークポイントを削除します。

:breakd[el] func [lnum] {name}

函數內のブレークポイントを削除します。

:breakd[el] file [lnum] {name}

ソースファイル內のブレークポイントを削除します。

:breakd[el] here

カレントファイルのカレント行のブレークポイントを削除します。

[lnum] が省略されると函數、またはファイルの最初のブレークポイントが削除されます。{name} は ":breakadd" で使つた名前と完全に同じでなければなりません。"explorer" と "*explorer.vim", "*explorer*" は違ひます。

ブレークポイントを列擧する

:breakl[ist]

全てのブレークポイントを列擧します。

その他

:debugg[reedy]

デバッグモードのコマンドをユーザーから直接得るのではなく標準入力から讀み込みます。スクリプトのテストのときに便利です。例:

echo 'q^Mq' | vim -e -s -c debuggreedy -c 'breakadd file script.vim' -S script.vim
:0debugg[reedy]

":debuggreedy" を取り消します。それ以降のデバッグモードコマンドを使はず、ユーザーから直接デバッグモードコマンドを受け取ります。

8. プロファイリング

プロファイリングとは、函數やスクリプトの實行にかかる時閒を計測することです。これを行ふには |+profile| 機能が必要です。この機能は "huge" 機能つきでコンパイルしたときだけ含まれます。

また、函數 |reltime()| を使つても時閒を計測できます。この函數には |+reltime| 機能だけが必要です。これは "huge" 以外でもしばしばついてきます。

シンタックスハイライトのプロファイリングについては |:syntime| を參照してください。

例へば、one_script.vim スクリプトファイルをプロファイリングするには:

:profile start /tmp/one_script_profile
:profile file one_script.vim
:source one_script.vim
:exit
:prof[ile] start {fname}

プロファイリングを開始し、終了時に出力を {fname} に出力します。{fname} 中の "~/" や環境變數は展開されます。{fname} がすでに存在するときは、警告なしに上書きされます。變數 |v:profiling| に 1 が代入されます。

:prof[ile] pause

次項の ":profile pause" が實行されるまでプロファイリングをしません。カウントされるべきでない何かを行ふ時に使ふことができます (例へば外部コマンドなど)。ネストすることはできません。

:prof[ile] continue

":profile pause" の後にこれを實行すると、プロファイリングを再開します。

:prof[ile] func {pattern}

パターン {pattern} にマッチする函數をプロファイリングします。{pattern} がどう使はれるかは |:debug-name| を參照してください。

:prof[ile][!] file {pattern}

パターン {pattern} にマッチするスクリプトファイルをプロファイリングします。{pattern} がどう使はれるかは |:debug-name| を參照してください。このコマンドはスクリプトそのものをプロファイリングするだけで、その中で定義されてゐる函數のプロファイリングは行ひません。

[!] がつけられたときは、そのスクリプト中で定義されてゐる全ての函數のプロファイリングも行ひます。

Note:
スクリプトがこのコマンドの後で讀み込まれたときだけ、そのプロファイリングは始まることに注意してください。スクリプト自身にある :profile コマンドは働きません。

:profd[el] ...

指定された引數に對するプロファイリングを停止します。引數については |:breakdel| を參照してください。

最初は常に "‘:profile start fname’" コマンドで始めなければなりません。結果のファイルは Vim が終了するときに書き出されます。次に出力の例を擧げます。說明のために行番號が行頭についてゐます:

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 行目) は函數全體にかかつた時閒を示してゐます。"Total" はこの函數を實行してゐる閒に經過した時閒です。"Self" は "Total" のうち、次のことにかかつた時閒を引いたものです:

7 行目から 11 行目は各實行行にかかつた時閒を示してゐます。實行されない行はカウントされません。それゆゑ、コメント行は決してカウントされません。

Count の桁はその行が何囘實行されたかを示します。7 行目の "for" コマンドはそれ以下の行と同樣に何囘も實行されることに注意してください。これは、ループの終はりを檢出するためにこの行が何囘も實行されるためです。

ユーザー入力待ちにかかつた時閒は一切カウントされません。それゆゑ、input() のプロンプトに反應するのにどれだけ時閒がかからうとも無關係です。

プロファイリングはどこで時閒が費やされたかのよい指標を與へてくれますが、多くの原因によりその結果がごまかされてしまふ場合があるといふことを覺えておいてください:


Up: 目次   [Index]