3

Vim では、次を使用して、挿入モードで "FF" を書き込むたびに一部のコードが変更されるようにすることができます。

:iab FF for ( int i = 0 ; i < n ; i++ )

しかし、これを引数で使用する方法はありますか? C の #define のようなものなので、私が書くと

FF(e, 10)

あれは。。。になる:

for ( int e = 0 ; e < 10 ; e++ )
4

4 に答える 4

7

SnipMate (vim プラグイン)を見てみましょう。引数は取得できませんが、省略形を展開すると、変更可能な領域をタブで移動できます。このfor例では、i最初に移動し、それを に編集して、宣言のすべての領域で にe変更します。次に、変更する次の領域にタブで移動します。efor

ドキュメントから:

snipMate.vim は、Vim で TextMate のスニペット機能の一部を実装する控えめで簡潔な vim スクリプトを目指しています。スニペットは、トリガー ワードの後に​​ .

たとえば、snipMate.vim のデフォルト インストールを使用する C ファイルでは、挿入モードで「for」と入力すると、C の典型的な for ループが展開されます。

for (i = 0; i < count; i++) {

}

ループ内の次のアイテムに移動するには、単純にそのアイテムに移動します。この例の「i」変数のようにコードが繰り返される場合は、強調表示されたら入力を開始するだけで、スニペットで指定されたすべての一致が更新されます。

以下は、 (in )の機能を失いたくない場合に備えて、tabs-tabc-dとにリマップするための便利な変更です。c-atab~/.vim/after/plugin/snipMate.vim

"""ino <silent> <tab> <c-r>=TriggerSnippet()<cr>
"""snor <silent> <tab> <esc>i<right><c-r>=TriggerSnippet()<cr>
"""ino <silent> <s-tab> <c-r>=BackwardsSnippet()<cr>
"""snor <silent> <s-tab> <esc>i<right><c-r>=BackwardsSnippet()<cr>
"""ino <silent> <c-r><tab> <c-r>=ShowAvailableSnips()<cr>
ino <silent> <c-d> <c-r>=TriggerSnippet()<cr>
snor <silent> <c-d> <esc>i<right><c-r>=TriggerSnippet()<cr>
ino <silent> <c-a> <c-r>=BackwardsSnippet()<cr>
snor <silent> <c-a> <esc>i<right><c-r>=BackwardsSnippet()<cr>
ino <silent> <c-r><tab> <c-r>=ShowAvailableSnips()<cr>
于 2010-06-24T18:16:56.460 に答える
4

省略形に関数定義を含めることはできますが、引数を取ることはできません。これは、vimdocs の例です。

func Eatchar(pat)
   let c = nr2char(getchar(0))
   return (c =~ a:pat) ? '' : c
endfunc
iabbr <silent> if if ()<Left><C-R>=Eatchar('\s')<CR>

関数内の略語表現を解析できると思いますが、略語に括弧などの文字を含めることができるかどうかはわかりません。たぶん、ここで何かがあなたにアイデアを与えるでしょう。

編集:いつでも次のようなことができます:

:iab for() for(int i = 0; i < ; i++)<C-o>T<

もちろん、これには引数のオートコンプリートがありませんが、すぐに入力を開始できます。

于 2010-06-24T17:50:39.873 に答える
0

mu-templateはインタラクティブなテンプレートをサポートします。それを使用すると、ユーザーに何かを尋ねるか、任意の変数を再利用し、必要に応じて計算を適用し (i現在のスコープで既に使用されていることを検出することが可能です)、展開するテキストで結果を使用できます。

于 2010-06-24T22:14:42.953 に答える