視覚的な選択内でのみ置換する方法は?


27

行のほかの場所ではなく、視覚的な選択範囲内の文字だけをvimに置き換えるにはどうすればよいですか?例:

  • ライン: int arr[] = { 00 01 02 03 04 05 05 /* ... lots more like this*/};
  • 視覚的選択: { 00 01 02 03 04 05 05 /*... lots more like this*/}
  • コマンド: :'<,'>s/\ /\,0x/g
  • 期待される: int arr[] = {0x00,0x01,0x02,0x03 /* and so on*/};

ただし、これらのアクションを実行すると、実際の結果は次のようになります。

int,0xarr[],0x=,0x{0x00,0x01,0x02,0x03 /* and so on*/};

上記のコマンドを変更して、期待される結果を生成する方法はありますか?検索(および置換)コマンドが機能する範囲'<'>定義しませんか?


2
答えはわかりませんが、:substitute行ごとにオペレーターがいることは知っています。これは、例で見ているものを説明しています。
カールYngveLervåg15年

回答:


32
:'<,'>s/\%V\ /\,0x/g

%V視覚領域内で一致します。をご覧ください:help %V


1
このソリューションは検証のみを行い、一致開始は視覚的な選択の範囲内であることを述べておく必要があります。
クリスチャンブラバンド

7

その\%Vための方法があります:h %V

\%V

視覚領域内で一致します。ビジュアルモードが既に停止している場合、gvが再選択する領域で一致します。これは/ zero-widthの一致です。 パターン全体が視覚領域内にあることを確認するには、パターンの最初と最後に配置します。例:> /\%Vfoo.*bar\%V

選択範囲内のみで置換fooするbarには、次を使用します。

:'<,'>s/\%Vfoo\%V/bar/
:'<,'>s/\%Vfoo\%V/bar/g
:'<,'>s/\%Vfoo\%V/bar/cg

この特定の場合:

:'<,'>s/\%V\ \%V/\,0x/g

4

ビジュアルブロック内で置換する場合は、vis.vimプラグインを使用できます

http://vim.wikia.com/wiki/Applying_substitutes_to_a_visual_block

インストールする:

vis.vba.gzをhttp://www.drchip.org/astronaut/vim/index.html#VISからダウンロードします

# Open vis.vba.gz in Vim 7.1 or later.
vim vis.vba.gz

# Source the open file.
:so %

# Quit Vim
:q

インストールしたら:

ctrl-v to enter visual-block mode
Move to select the block you want
:B s/pattern/newtext/

を入力すると:B、これが表示されます

:'<,'>B 

それは問題ありません、それはコマンドが現在選択されている視覚ブロックに適用されることを言っているだけです。

さらに良いことに、置換だけでなく、視覚ブロックで任意のExコマンドを実行できます。たとえば:B !sort

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.