vim-如何在不计算行数的情况下删除一大块文本?

vim-如何在不计算行数的情况下删除一大块文本?,vim,Vim,在vim中,我经常发现自己删除(或复制)了大量文本。你可以数一数文本的行数,然后说(例如)50dd删除50行 但是,如果不知道要删除多少行,如何删除这一大块文本呢?我不是vim大师,但我在这种情况下使用的是“视觉模式”。在命令模式下,键入V(大写)。然后向上/向下移动以高亮显示要删除的块(所有常用的移动命令都有效)。然后用x或d将其移除。您可以将光标放在块的开头或结尾,然后进入视觉模式(shift-v)。然后简单地向上或向下移动,直到所需的块高亮显示。最后,按y键复制文本或按d键剪切文本。有几种

在vim中,我经常发现自己删除(或复制)了大量文本。你可以数一数文本的行数,然后说(例如)
50dd
删除50行


但是,如果不知道要删除多少行,如何删除这一大块文本呢?

我不是vim大师,但我在这种情况下使用的是“视觉模式”。在命令模式下,键入
V
(大写)。然后向上/向下移动以高亮显示要删除的块(所有常用的移动命令都有效)。然后用
x
d
将其移除。您可以将光标放在块的开头或结尾,然后进入视觉模式(shift-v)。然后简单地向上或向下移动,直到所需的块高亮显示。最后,按y键复制文本或按d键剪切文本。

有几种可能性,最佳选择取决于您处理的文本

我想到了两种可能性:

  • 切换到可视模式(
    V
    S-V
    , …),用光标选择文本 移动并按
    d
  • 删除带有以下内容的整段:
    dap

这在某种程度上取决于那个大块头是什么。也许你只是想删除一个段落,在这种情况下,一个dip就可以了。

转到起始行并键入ma(标记“a”)。然后转到最后一行并输入d'a(删除以标记“a”)


这将删除从当前行到标记行(包括)的所有行。它还与
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);
}