vim-如何在不计算行数的情况下删除一大块文本?
在vim中,我经常发现自己删除(或复制)了大量文本。你可以数一数文本的行数,然后说(例如)vim-如何在不计算行数的情况下删除一大块文本?,vim,Vim,在vim中,我经常发现自己删除(或复制)了大量文本。你可以数一数文本的行数,然后说(例如)50dd删除50行 但是,如果不知道要删除多少行,如何删除这一大块文本呢?我不是vim大师,但我在这种情况下使用的是“视觉模式”。在命令模式下,键入V(大写)。然后向上/向下移动以高亮显示要删除的块(所有常用的移动命令都有效)。然后用x或d将其移除。您可以将光标放在块的开头或结尾,然后进入视觉模式(shift-v)。然后简单地向上或向下移动,直到所需的块高亮显示。最后,按y键复制文本或按d键剪切文本。有几种
50dd
删除50行
但是,如果不知道要删除多少行,如何删除这一大块文本呢?我不是vim大师,但我在这种情况下使用的是“视觉模式”。在命令模式下,键入
V
(大写)。然后向上/向下移动以高亮显示要删除的块(所有常用的移动命令都有效)。然后用x
或d
将其移除。您可以将光标放在块的开头或结尾,然后进入视觉模式(shift-v)。然后简单地向上或向下移动,直到所需的块高亮显示。最后,按y键复制文本或按d键剪切文本。有几种可能性,最佳选择取决于您处理的文本
我想到了两种可能性:
- 切换到可视模式(
,V
, …),用光标选择文本 移动并按S-V
d
- 删除带有以下内容的整段:
dap
这将删除从当前行到标记行(包括)的所有行。它还与
vi
以及vim
兼容,如果您的环境不适合后者的话。您也可以使用可视模式(一些命令也可以与delete选项一起使用)
vip vap选择段落,v2ap选择两个段落
dap起作用,d2ap也起作用。您可以在[
]
块内删除,如da[
供参考:对象的类型。
来自vim文档:第4节
4.在可视区域上操作*可视操作符*
...
可以使用的对象包括:
aw一个单词(带空格)
内部词
aW一个单词(带空格)
内部词
作为句子(带空格)
是内部句子吗
ap a段落(带空格)
ip内段
ab a()块(带括号)
ib内()块
aB a{}块(带大括号)
iB内部{}块
a
除了这里已经提到的其他运动之外,还有/{pattern}
motion,所以如果您知道要删除包含foo的行,您可以执行dV/foo
V
在这里强制按行移动,因为默认情况下/
是按字符移动的。如果通过设置编号打开行号,您只需dNNG
即可从中删除NN行当前位置。因此,您可以导航到要删除的行的开头,并简单地假设这是您要删除的最后一行。如果整个块在屏幕上可见,您可以使用RelativeEnumber设置。请参阅:help RelativeEnumber。7.3中提供了许多更好的答案,但对于co在阅读上面提到的一些伟大的答案之前,我会提到我使用的方法
假设要从第24-39行中删除。可以使用ex命令
:24,39d
您还可以使用
:24,39y
并使用以下工具查找并更换第24-39行上的内容
:24,39s/find/replace/g
您也可以输入一个非常大的数字,然后按dd
删除光标下方的所有行。删除文本块
假设光标位于块的开头:
V/^$<CR>d (where <CR> is the enter/return key)
解释
- 禁用搜索换行:立即设置换行扫描
- 重新映射
D
键(到以下命令)::nnoremap D
- 进入“行视觉”模式:
V
- 高亮显示,直到下一个空/空白行或EOF:
/^\s*$\\\\\\%$
- 删除:
d
计算行数对我来说太繁琐了,但计算“段落”并没有那么糟糕。{“和”}分别将光标移动到光标前后的第一个空行。光标移动操作可以与删除操作结合使用,其他几个答案使用了类似的方法(dd表示行,dG表示文档结尾等)
例如:
/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */
Lorem *ipsum(void) {
return dolor(sit, amet);
}
如果光标从注释块上方开始,“d}”将删除注释块,“d2}”将同时删除注释块和代码块。如果光标从代码块下方开始,“d{”将删除代码,“d2{”将同时删除两者。当然,可以先移动光标跳过一个块:“{d{”或“}d}”。
如果您与空白保持一致,或者您可以一眼数出段落,这应该可以。如果您感兴趣,Vim帮助文件有更多的光标技巧。谢谢您的提示。不幸的是,我在这里使用代码,通常需要更细粒度的控制。我也在使用代码,并且我按顺序分隔逻辑块一条空行。这条技巧让我很开心。我现在可以通过三次按键删除大块逻辑。之所以有效,是因为“d”表示删除,“p”在这个上下文中表示段落奇怪。我知道它在Linux(vim 7.3.50)上对我(tm)有效在Windows上使用gVim。从其他答案来看,它适用于其他人。可能是您的.vimrc
中的某些设置使它起作用了?好吧,出于某种原因,我没有意识到您可以使用Shift
-v
进入可视线路模式。。。
:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d
/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */
Lorem *ipsum(void) {
return dolor(sit, amet);
}