9

行内の最後の開き括弧または括弧を見つける関数をvimscriptで書きたいと思います。次のすべてを処理できる必要があるため、これは必ずしも簡単な問題ではありません。

function(abc
function(abc, [def
function(abc, [def], "string("
function(abc, [def], "string(", ghi(

ご覧のとおり、ネストされた括弧、異なる記号、および文字列トークンはすべて、インテリジェントに処理する必要があります。これは可能ですか?閉じていない括弧と文字列の括弧の違いを知っているコンテキスト認識検索を行うためのvimscript正規表現を備えたツールはありますか?

対になっていない括弧をシンタックスハイライトできるとすれば、行の最後の閉じていない括弧/括弧を見つけることができるはずです。これはどのように行うことができますか?

4

3 に答える 3

4

とを使用[(])ます。

[(          go to [count] previous unmatched '('.
])          go to [count] next unmatched ')'.

中括弧の場合:[{および[}.

于 2010-10-09T16:49:05.810 に答える
4

したがって、基本的に、コメントでも文字列でもない最後の括弧を見つける必要があります。

この構文が何であるかわからないので、それらの行をバッファに入れて実行しました

:set ft=javascript

文字列の強調表示を取得する

function(abc
function(abc, [def
function(abc, [def], "string("
function(abc, [def], "string(", ghi(

カーソルを 3 行目の左括弧に置き、次のコマンドを発行します。

:echo synIDattr(synID(line('.'), col('.'), 0), 'name') =~? '\(Comment\|String\)'

「1」が表示され、カーソルの下の文字がコメント内または文字列内にあることを意味します。

最後の行の最後の列にカーソルを置いて同じコマンドを実行すると、「0」が得られます。

これで、括弧を逆方向に反復し、'comment' と 'string' に対してテストして、最後の開き括弧を取得できます。

「LISP: 一致しない括弧を Vim で調整する」のこのアーカイブをチェックして、vimscript を使用して一致しない括弧を閉じる方法を確認できます。

于 2010-10-09T20:05:20.803 に答える
1

直接的な回答はありませんが、Vim のインストール (プラグイン ディレクトリ) に含まれる標準プラグインである matchparen.vim プラグインのコードを確認することをお勧めします。そのプラグインは、その機能が有効になっている場合、一致する括弧の強調表示に使用されるプラグインです。コードは行全体で一致するため、必要以上に一般的ですが、コードを操作して同じ行で一致するかどうかをテストしたり、少なくともそのコードからいくつかのアイデアを得ることができる場合があります。

于 2010-10-09T16:38:21.097 に答える