2

次の行からパーセンテージマークを削除したい:

oh_test_() ->
    [
        %{"fold", ?_test(fold(ns()))},
        %{"fold nested", ?_test(fold_nested(ns()))},
        %{"push arg empty table", ?_test(push_arg_empty_table(ns()))},
        %{"push arg table 1", ?_test(push_arg_table1(ns()))},
        %{"push arg nested table", ?_test(push_arg_nested_table(ns()))},
        %{"multicall 0", ?_test(multicall_0(ns()))},
        %{"multicall 1", ?_test(multicall_1(ns()))},
        %{"multicall 2", ?_test(multicall_2(ns()))}
    ].

カーソルは最初のの行にあり%ます。

:,/%/s/%//

または:

:,/%/normal ^x

予想:すべてのパーセントマークが削除されました。結果:最初の2パーセントのマークのみを削除します。

  1. なんで?
  2. どうすればいいですか
    • ビジュアルモードを使用せずに、
    • 行番号を数えませんか?
4

3 に答える 3

2

最初の例は基本的に...私の現在の位置から次の%がコマンドs /%//...を発行するまでです。

あなたがしたいと思うかもしれないことは次のようなものです

:,$ s/%//

つまり、現在の位置からファイルの終わり($)までの各行に対して、コマンドs /%//を発行します。

ファイルの最後までやりたくない場合は、

:set number

行番号が表示されたら、次のようにします

:2,8 s/%//

これは、2〜8行のすべての行に対してコマンドを発行するだけです。

于 2012-07-24T20:55:09.800 に答える
2

質問1:

あなたの範囲:,/%/現在の行から大まかに翻訳されます。/%/範囲の終わりは、現在のカーソル行の後に一致する次の行になります。これにより、2行が生成されます。詳細については、を参照:h :,してください。

質問2:

これを達成する方法はたくさんあります。あなたはすでにnormals///メソッドを提示しました。コマンドを修正する1つの方法は、範囲を調整することです。次のいずれかが機能します。

  • ,/\]\./-1エンディング].を一致させてから、行を減算します
  • ,/^\s*%\(.*\n\s*%\)\@!/ネガティブルックアヘッドを使用して、で始まらない行を検索し%ます。

すべて一緒に使用できます:

:,/\]\./-1s/%//
:,/^\s*%\(.*\n\s*%\)\@!/s/%//
:,/\]\./-1norm ^x
:,/^\s*%\(.*\n\s*%\)\@!/norm ^x

マクロを使用する代わりの方法。この場合にマクロを使用することの良い点は、エラーが発生すると停止することです。基本的には、マクロを記録して検索し、%それを削除してから次の行に移動します。このマクロを何度も実行してください。%が見つからない場合、マクロは停止します。

qq0f%xjq999@q

この場合、クレイジーなパターンを実行したり、ブロックの終わりを探したりする必要がないため、マクロが私の推奨される方法です。

ビジュアルモードの使用を許可した場合は、vi]k:norm ^x

詳細については、以下を参照してください。

:h range
:h :,
:h /\@!
:h q
:h @q
:h i]
于 2012-07-24T23:42:23.903 に答える
0

:,/%/を使用する必要がある方法で使用しているよう:g/%/です。次のようにコマンドを使用できます::g/%/s/%//または:g/%/norm f%x

:help :g「グローバル」コマンドの詳細については、を参照してください。これは基本的に、パターンに一致する行に対してコマンドモードコマンドを実行します。お使いのバージョンは:,/%/、現在の行から「%」に一致するまで動作します。現在の行に1つあり、1つある行(次の行)を検索しているため、これにより最初の2つが削除されます。これについて詳しくは、をご覧ください:help :range。このオプションを使用するより良い方法は、最後の行にのみある検索項目を使用することです。たとえば、:,/]/s/%//または:,/]/norm f%x

于 2012-07-25T05:00:12.627 に答える