行のすべてではなく一部のみで:substituteを実行するにはどうすればよいですか?


15

このような行があります:

function my_function(argument, another argument, but there are spaces)

(引数の名前の中の)スペース文字をアンダースコアに置き換えたい。したがって、私は使用したい:

:s/\ /_/g

しかし、行全体に適用せずに、たとえばカーソル位置から開始することを選択するにはどうすればよいですか?(または3番目の単語)?


4
正規表現では、現在のカーソル位置を記述するためにatomを使用できます\%#。したがって、次を使用できます:s/\v(%#.*)@<= /_/g。これは@<=、カーソル位置の後に()文字が続くスペースとして説明できます。
user9433424

1
あなたとStatoxは両方とも\%#トリックを提案しました。もしあなたが書いていないなら彼の答えを受け入れます...
フェフ

回答:


15

次のソリューションを使用できます。

最初に使用v$して、カーソルから行末までのテキストを選択します。次に、次のコマンドを使用します。

:s/\%V\ /_/g

\%V参照、以前に視覚的に選択した領域内のテキストを変更することを示しています:h /\%V

あなたの例を挙げると:

function my_function(argument, another argument, but there are spaces)

カーソルが40列目にあり、作成したコマンドを使用すると、次のようになります。

function my_function(argument, another argument,_but_there_are_spaces)

あなたのコメントに答えて、あなたも使用することができます

  • \%# カーソル位置から一致します
  • \%>23c 23列目以降に一致します。
  • \%>'m マークの位置の後に一致します

参照してください:h /\%#:h /\%>c:h /\%>'m

@ User9433424は\%#彼のコメントで使用する方法を示しました。マークのあるパターンの場合は、wit maを設定してから使用できます。

:s/\%>'a /_/g

@ User9433424で提供されるパターンの説明は次のとおりです。

:s/\v(%#.*)@<= /_/
:s/                    substitution command
   \v                  Enable the very magic mode
      %#.*             Any characters from the cursor position
           @<=         Check for matches just before what follows
              space    Followed by a space
               /_/     Substitute the matches by underscores

あなたが見たいと思ってます:h \vし、:h /\@<=


それはうまくいきます!しかし、私は視覚的な選択にあまり慣れておらず、プロセス全体が少し「重い」ように見えます...もっと速い何かがあると思いますか?
フェフ

はい、答えを更新させてください:)
statox

User9433424はあなたの直前にこのヒントを与えましたが、あなたは答えたので、それが大丈夫ならあなたの答えを受け入れます-彼がもう少し使用する正規表現パターンを説明してもらえますか?私はまだこれに苦労しています
...-フェッフ

私はできる限り明確な答えをしようとしましたが、@ User9433424が彼自身の答えを書いたとしても、それを受け入れることをためらわないでください。
statox

1
正規表現の非常に素晴らしい説明、ありがとう!そして、その答えは受け入れるためにあなたのコメントに感謝:)
Feffe

5

ルックビハインド(:h \@<=)を使用して、先行する '(' :h \>があることを確認し、単語の終わり()を使用して、必要な場所で置換が行われることを確認できます。

だから、テキストで:

function my_function(argument, another argument, but there are spaces)

コマンドの実行:

:s/\((.*\)\@<=\> /_/g

生成されます:

function my_function(argument, another_argument, but_there_are_spaces)

これは、置換が常に既知の開始点を持っている場合、毎回カーソルを配置するよりも簡単かもしれません。


2
置換には、常に既知の開始点があるわけではありません。それは...私が作成した奇妙な一連のタイプミスを修正するためだけでした。しかし、あなたの答えはそれでも面白いです、ありがとう!
フェフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.