如何使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*/};

是否可以修改上面的命令以产生预期的结果? '<'>不能定义搜索(和替换)命令的作用范围吗?

评论

我不知道答案,但是我知道::逐行替换运算符,这解释了您在示例中看到的内容。

#1 楼

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


%V在可视区域内匹配。请参阅:help %V

评论


应该提到的是,该解决方案仅验证比赛的开始在视觉选择之内。

–克里斯蒂安·布拉班特(Christian Brabandt)
19年2月22日在12:28

#2 楼

有相应的\%V,请参见:h %V


\%V

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


仅在选择项中用foo替换bar,请使用:

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


在这种特殊情况下:

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


#3 楼

如果要在可视块内替换,可以使用vis.vim插件。

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

要安装:

从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


下载vis.vba.gz安装后:

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


当您键入:B时,您会看到此

:'<,'>B 


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

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

#4 楼

在@dessert之后,我发现描述和示例有些混乱,直到我认识到%V包装模式。

:'<,'>s/pattern/newtext/


成为,

:'<,'> s/ \%V foo \%V / bar /


删除空格,

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


(因为我总是后悔不使用g-lobal,c-onfirmation)