如何仅在视觉选择内替换?


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运算符是逐行的,这解释了您在示例中看到的内容。
Karl YngveLervåg2015年

Answers:



7

\%V关于它,请:h %V

\%V

在可视区域内匹配。当视觉模式已经停止时,在gv将重新选择的区域中进行匹配。这是零宽度匹配。 为了确保整个模式都位于可视区域内,请将其放在模式的开头和结尾,例如:> /\%Vfoo.*bar\%V

要仅在选择中替换foobar,请使用:

:'<,'>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

安装:

http://www.drchip.org/astronaut/vim/index.html#VIS下载vis.vba.gz

# 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 

很好,只是vim说该命令将应用于当前选定的可视块。

更好的是,您可以在可视块上执行任何Ex命令,而不仅仅是替换。例如:B !sort

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.