6

次のコード行があるとします。

something:somethingElse:anotherThing:woahYetAnotherThing

そして、行が次のようになるように、それぞれ:; 最初のもの以外に置き換えたいと思います。

something:somethingElse;anotherThing;woahYetAnotherThing

各置換操作を確認するオプションを:[range]s/[search]/[replace]/[options]使用せずに、コマンドでこれを行う方法はありますか?c

私が知る限り、s作用する最小範囲は 1 行です。これが本当なら、上記のタスクを実行する最速の方法は何ですか?

4

4 に答える 4

6

私は自分自身がvimにかなり慣れていません。範囲が行のみであることについては正しいと思いますが (100% 確実ではありません)、この特定の例では、すべてのインスタンスをグローバル フラグに置き換えてから、グローバルを省略して最初のインスタンスを元に戻すことができます。のようなもの:s/:/;/g|s/;/:/

注: 行に;最初の行の前に a が含まれている場合、:これは機能しません。

于 2012-11-08T23:50:12.553 に答える
2

単一のキーストロークを使用して、(大文字のQをマッピングすることにより)必要なことを実行する方法は次のとおりです。

map Q :s/:/;/g\|:s/;/:<Enter>j

押すたびQに現在の行が変更され、カーソルが次の行に移動します。

つまり、複数回押し続けるだけで、Q連続する各行を編集できます。

説明:

これは、現在の回線でグローバルに動作します。

:s/:/;/g

これにより、最初のセミコロンがコロンに戻ります。

:s/;/:

@AlliedEnvyによる回答は、これらを1つのステートメントにまとめたものです。

私のmapコマンドは、@AlliedEnvyの回答を大文字のQ文字に割り当てます。


別のアプローチ(これを1回だけ実行する必要がある場合におそらく実行すること):

f:;r;;.

;.次に、行の終わりに達するまで繰り返し押すことができます。

(セミコロンを置き換えることを選択すると、これはやや混乱します)

説明:

  • f:-最初のコロンに移動します
  • ;-次のコロンに移動します(インライン検索を繰り返します)
  • r;-現在の文字をセミコロンに置き換えます
  • ;-最後のインライン検索を繰り返します(再度)
  • .-最後のコマンドを繰り返します(現在の文字をセミコロンに置き換えます)

短編小説:

  • fxx-現在の行の次のオカレンスに移動します
  • ;最後のインライン検索を繰り返します
于 2012-11-08T23:55:27.577 に答える
2

どうぞ...

:%s/\(:.*\):/\1;/|&|&|&|&

これは、1 つのnot-the-first :を処理する単純な正規表現の代替です。

コマンドは最後の&置換を繰り返します。

この|構文では、複数のコマンドを 1 行で区切ります。なので、それぞれの代用は物の数だけ繰り返され|&ます。

于 2012-11-09T00:05:43.977 に答える
2

この特定のケースでは他の回答がうまく機能しますが、より一般的な解決策は次のとおりです。

2 番目の要素から行末までの視覚的な選択範囲を作成します。次に、以下を含めて、置換を視覚領域に制限します\%V

:'<,'>s/\%V:/;/g

または、vis.vim プラグインを使用できます。

:'<,'>B s/:/;/g
于 2012-11-09T07:29:40.303 に答える