Vim 如何从两列之间的所有行中删除文本?
我想删除两列之间所有行的内容。我该怎么做 例如,我想要这个:Vim 如何从两列之间的所有行中删除文本?,vim,Vim,我想删除两列之间所有行的内容。我该怎么做 例如,我想要这个: abcdefg hijklmn opqrstu 如果删除第3列到第5列之间的文本,则变为: abfg himn optu 将光标定位在d中,然后按Ctrl-V、l、G和d 进入视觉块模式 l将视觉选择向右扩展一个字符 将所选内容展开到最后一行 d删除所选内容 对于自发编辑,我会通过CTRL-V(通常在Windows上映射到CTRL-Q)使用分块视觉模式,然后d删除它 如果您经常这样做,对于大范围/整个缓冲区,或者重复这样做,我会
abcdefg
hijklmn
opqrstu
如果删除第3列到第5列之间的文本,则变为:
abfg
himn
optu
将光标定位在d中,然后按Ctrl-V、l、G和d
- 进入视觉块模式李>
将视觉选择向右扩展一个字符李>l
- 将所选内容展开到最后一行李>
删除所选内容d
- 对于自发编辑,我会通过CTRL-V(通常在Windows上映射到CTRL-Q)使用分块视觉模式,然后
d
删除它
如果您经常这样做,对于大范围/整个缓冲区,或者重复这样做,我会使用一个替换,它在虚拟列中开始匹配,并扩展(向上)到结束列,例如:
%s/\%3v.*\%<7v//
%s/\%3v.\%您可以使用搜索和替换:
:%s/..\zs...\ze
或者以更一般的形式:
:%s/.\{2}\zs.\{3}\ze
其中,第一个数字(2)是该列的索引(从零开始),第二个数字(3)是该列的字符数
说明:
:%s/
在整个缓冲区中搜索并替换
\{2}\zs
在此处查找两个字符并设置匹配的开头
\{3}\ze
在此处查找三个字符并设置匹配结束
由于要删除匹配项,请忽略替换字符串
你的问题和我的很相似
要删除文件中所有行的第3列到第5列,请执行以下操作:
:%normal 3|d6|
要删除特定的行间隔(80到90),请使用以下命令:
:80,90normal 3|d6|
如果您不熟悉普通命令或|“运动”,可以快速解释:
normal
命令在normal模式下执行以下命令李>
|“运动”将光标移动到指定列,因此3 |
将光标移动到第三列李>
然后我删除所有内容(d
),直到第五列(6 |
)
我会用以下方法:
:%s/^..\zs.*\ze..$//g
这将删除除开头的前两列和结尾的两列之外的所有内容。对于所有行,或仅针对当前行?对于所有行,我还想知道关于第80行到第90行,我用一个示例更新了您的问题。你能确定它是准确的吗?你关心的数字是不相关的。最好先做G
,然后再做l
,因为如果G
让你空行,你可能需要重做l
。G
将选择扩展到文件的底部和左侧。因此,在最初的示例中,所有字符都将移到左侧。相反,您需要使用l
键来确保突出显示的区域是要删除的区域。您的解决方案是基于字符的,而不是基于列的。对于双幅(例如中文)字符和不可打印的字符(如^P(CTRL-P))来说,这有所不同。@IngoKarkat你说得对。我没有看完你的全部答案(看完CTRL-V后我停了下来)+谢谢你的回答。