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


192

在vim中,我经常发现自己正在删除(或复制)大块文本。一个人可以计算文本的行数,然后说(例如)50dd删除50行。

但是,如何在不知道要删除多少行的情况下删除这一大块文本呢?


1
如果窗口足够大,则此处相对行编号会有所帮助。将光标放在窗口的顶部,找到要删除的最后一行的相对行号(例如n),添加一个,然后键入该数字,然后键入dd。例如,如果n = 50,则51dd。或者,使用运动命令50d<down arrow>
BallpointBen

“查找相对行号”-或者,使用:set rnu和Vim会立即执行此操作!您所在的行仍将绝对编号,但是光标上方和下方的行将对称地编号为1、2,...(并随光标移动,文件级事件等而更新)
John P

Answers:


286

我不是vim专家,但在这种情况下使用的是“可视模式”。在命令方式下,键入V(大写)。然后向上/向下移动以突出显示要删除的块(所有常规移动命令均有效)。然后使用x或将其删除d


2
奇怪。我知道它在Linux(vim 7.3.50)上适用于我(tm),在Windows上适用于gVim。从其他答案来看,对其他人也有用。也许您的某些设置.vimrc正在起作用?

好的,由于某种原因,我没有意识到您可以使用Shift- 进入视线模式v... ...我也尝试使用该CTRL键。因此,这可行并且可能是最方便的方法。
贾斯汀·埃斯蒂尔

7
您可能需要澄清一下,有两种视觉模式-视觉线(CTRL- v)和视觉块(Shift- v)。
贾斯汀·埃斯蒂尔

2
我经常这样做。但是我一直认为这是作弊和不理想的vim。
Jim Mitchener 2011年

9
实际上,共有三种视觉模式:视觉模式(基于字符的{v}),视觉线模式(基于行{Sv})和视觉块模式(允许选择块{Cv})
Tom Regner

293

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

这将删除从当前行到已标记行(包括首行)的所有行。它也与vi和兼容,vim以免您的环境没有幸免于后者。


3
吓死我了!我讨厌在寻找更好的解决方案之前做某事(例如计算行数)多长时间。谢谢!
ryanjdillon

1
太棒了,我总是使用可视模式删除块,但是这种方式+1更好
hish 2013年

4
我发现这比删除50万行以上的视觉模式更为有用
Michael-Where's Clay Shirky 2013年

真正实用的答案。我使用它从文件/var/mail/username中批量删除服务器中的邮件,并保留最后的邮件。我做了标记,然后我进入例如50000,然后gg去线50.000,然后我删除所有线之间。奇迹般有效!
otmezger 2015年

1
@horta,我可能不会将其vim用作编辑千兆字节文件的工具-我倾向于选择文本处理工具,例如awk及其兄弟:-)
paxdiablo 2016年

46

您可以使用可视化模式也(一些命令与删除选项也可用) vip vap选择段落,v2ap选择两款 dap作品,d2ap也。您可以块内删除[ ]da[

供参考:对象的类型。从vim文档中:第4节。http : //vimdoc.sourceforge.net/htmldoc/visual.html

4. Operating on the Visual area             *visual-operators*

...    
The objects that can be used are:
aw  a word (with white space)           
iw  inner word                  
aW  a WORD (with white space)           
iW  inner WORD                  
as  a sentence (with white space)           
is  inner sentence                  
ap  a paragraph (with white space)          
ip  inner paragraph                 
ab  a () block (with parenthesis)           
ib  inner () block                  
aB  a {} block (with braces)            
iB  inner {} block                  
a<  a <> block (with <>)                
i<  inner <> block                  
a[  a [] block (with [])                
i[  inner [] block                  

1
da [,da {,da“对程序员都有用
Rene Wooller 2015年

1
谢谢!dap作为“删除段落”非常容易记住
Tropilio

38

这里有很多更好的答案,但是为了完整起见,在阅读上面提到的一些很棒的答案之前,我会先提到我以前使用的方法。

假设您要从第24-39行删除。您可以使用ex命令

:24,39d

您也可以使用

:24,39y

并找到并替换刚刚使用的第24-39行

:24,39s/find/replace/g

11

如果您通过打开行号,则set number可以简单地dNNG将其从当前位置删除到NN行。因此,您可以导航到要删除的行的开头,并简单地d50G假定那是您要删除的最后一行。


10

这取决于那个大块是什么。也许您只是想删除一个段落,在这种情况下a dip可以。


谢谢你的提示。不幸的是,我在这里使用代码,并且通常需要更多的细粒度控制。
贾斯汀·埃斯蒂尔

1
我也在使用代码,并且用空行分隔逻辑块。这个小贴士让我很开心。现在,我可以通过三个按键删除大块的逻辑。
2016年

它之所以有效,是因为'd'表示删除,'p'在本文中表示段落
user98761 '17

7

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

我想到了两种可能性:

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

我现在很了解dap,因此我经常使用dap并希望它进行dis和dip操作,但是,它总是删除一个块和该块之后的空白行,但这是一种删除该块和该行的空白行的方法来之前吗?
2013年

在带有段落的文本中间,结果没有语法上的区别,对吗?如果有,我建议在新问题中用示例写下您想要的内容。
汤姆·雷格纳

6

如果整个块在屏幕上可见,则可以使用相对编号设置。参见:help relativenumber。7.3可用


直到我开始使用它时,我才意识到它的实用性:se rnu –非常适合50dd以及导航50j
rshdev

3

您可以将光标放在块的开头或结尾,然后进入可视模式(shift-v)。然后只需向上或向下移动,直到突出显示所需的块。最后,按y复制文本或按d剪切文本。


也许很奇怪,但是由此我想出了如何从一行中所需的中点选择文本,并在同一点到每一行末尾的下方选择多行。正是我想要的。
nanker 2014年

3

除了这里已经提到的其他动议之外,还有/{pattern}<CR>动议,因此,如果您知道要删除到包含foo的行,则可以这样做dV/foo<CR>V此处强制沿线方向运动,因为默认情况下按/字符方向运动。


3

计数行对我来说太麻烦了,但是计数“段落”并不算糟糕。'{'和'}'分别将光标移动到光标之前和之后的第一个空行。光标移动操作可以与删除结合使用,其他几个答案也使用类似的方法(dd用于一行,dG用于文档末尾,等等)
,例如:

/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */

Lorem *ipsum(void) {
  return dolor(sit, amet);
}

如果光标从注释块上方开始,则“ d}”将删除注释块,而“ d2}”将删除注释块和代码块。如果光标从代码块下方开始,则'd {'删除代码,而'd2 {'删除两个代码。当然,您可以通过先移动光标来跳过一个块:'{d {'或'} d}'。

如果您与空白一致,或者您可以一目了然地计算段落数,则应该可以。如果您有兴趣,Vim帮助文件提供了更多的游标技巧。



1

删除一段文字

假设您的光标位于代码块的开头:

V/^$<CR>d (where <CR> is the enter/return key)

说明

  • 进入“逐行可视”模式: V
  • 突出显示,直到下一个空行: /^$<CR>
  • 删除: d

键绑定

一个更强大的解决方案:

:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d

说明

  • 禁用搜索换行: :set nowrapscan
  • 重新映射D密钥(到以下命令)::nnoremap D
  • 进入“逐行可视”模式: V
  • 突出显示,直到下一个空白行或EOF: /^\s*$\\|\%$<CR>
  • 删除: d
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.