1

関数ブロックのような C で左中括弧が配置されている場所をフォーマットするのに役立つ Vim スクリプト関数を作成しようとしています。

function! FixLeftBraces()
    "Set the cursor to the top of the file
    call cursor(1,0)
    while search(".\+{",'We') > 0
        exe "normal i\n\e"
    endwhile
endfunction

この例では、私の目標は、関数と同じ行にある左中かっこを見つけて、次の行に再配置することです。これらのWeオプションは、ファイルをラップしないようにし、カーソルを検索選択の最後に再配置します。

/入力モードを使用してVimで検索を実行すると、検索が/.\+{実行され、ソースコードで期待される行が強調表示されます。

たとえば、次のような C 行:

//is highlighted
int main(){

//is not highlighted
void otherFuncion()
{

ソースを作成FixLeftBraces()してから使用すると、機能しないようです。実行するだけで何もしません。

検索を変更するとsearch("{",'We')実行されFixLeftBraces()ますが、左中括弧ごとに新しい行が追加されます。だから私はなぜFixLeftBraces()で動作しないのか混乱していsearch(".\+{",'We')ます。

4

1 に答える 1

3

上記のテスト ケースでは、search()関数呼び出しがゼロを返し続けるため、関数全体が期待どおりに動作しません。その理由は、間違って指定されたパターンです。\-syntax を使用して二重引用符で囲まれた文字列定数に追加できる特殊文字は少なくありません(「参考文献」を参照:help expr-")。その結果、\+正規表現リテラルの部分文字列は単一の+文字として解釈され、パターンの本来の意図が台無しになります。

この望ましくない動作を回避するには、バックスラッシュ記号をエスケープして、パターン文字列を次のように変更します。

".\\+{"

または、バックスラッシュが特別な意味を持たない単一引用符付きの文字列リテラルに切り替えます (を参照:help expr-')。

'.\+{'
于 2011-12-11T06:48:26.123 に答える