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

Jus*_*ier 191 vim

在vim中,我经常发现自己删除(或复制)大块文本.可以计算文本行并说(例如)50dd删除50行.

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

pax*_*blo 289

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

这将删除当前到标记的所有行(包括).它也兼容,vi以及vim你的环境不被后者祝福的可能性.

  • 我发现这比删除500k +行的可视模式更有帮助 (4认同)
  • 这怪异的岩石!在讨论更好的解决方案之前,我讨厌我做一些事情(比如数字线).谢谢! (3认同)
  • 真的太棒了,我总是使用视觉模式来删除块,但这种方式更好+1 (2认同)
  • 非常实用的答案。我用它从文件“/var/mail/username”中批量删除服务器中的邮件,并完整保留最后的邮件。我做了一个标记,然后输入例如“50000”,然后输入“gg”以转到第 50.000 行,然后删除中间的所有行。奇迹般有效! (2认同)

Mat*_*Mat 283

我不是vim guru,但我在这种情况下使用的是"视觉模式".在命令模式下,键入V(capital).然后向上/向下移动以突出显示要删除的块(所有常用的移动命令都有效).然后用x或删除它d.

  • 实际上有三种视觉模式:可视模式(基于字符{v}),可视线模式(基于行的{Sv})和可视块模式(允许选择块{Cv}) (8认同)
  • 您可能想澄清有两种视觉模式 - Visual Line(`CTRL` -`v`)和Visual Block(`Shift` -`v`). (7认同)
  • 奇怪.我知道它适用于我(tm)Linux(vim 7.3.50)和Windows上的gVim.从其他答案判断,适用于其他人.你的`.vimrc`中的某些设置可能会让它起作用吗? (2认同)
  • 我做了很多.但我一直认为它是作弊和不太理想的vim. (2认同)

M'v*_*'vy 45

您可以使用可视化模式也(一些命令与删除选项也可用) 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                  
Run Code Online (Sandbox Code Playgroud)

  • da[, da{, da" 对程序员来说都很有用 (2认同)

dav*_*les 38

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

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

:24,39d
Run Code Online (Sandbox Code Playgroud)

你也可以使用

:24,39y
Run Code Online (Sandbox Code Playgroud)

然后使用,找到并替换24-39行

:24,39s/find/replace/g
Run Code Online (Sandbox Code Playgroud)


Jim*_*ner 11

如果你打开行号,set number你可以简单地dNNG从当前位置删除行NN.因此,您可以导航到要删除的行的开头,并d50G假设这是您要删除的最后一行.


Ren*_*ger 10

它取决于那个大块是什么.也许你只是想删除一个段落,在这种情况下dip会做.


Tom*_*ner 7

有几种可能性,最好的取决于您所使用的文本.

我想到了两种可能性:

  • 切换到可视模式(V,, S-V...),选择带光标移动的文本并按d
  • 删除整个段落: dap


Rum*_*kin 6

如果整个块在屏幕上可见,则可以使用relativenumber设置.请参阅:help relativenumber.7.3可用


Joh*_*n P 6

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

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

Lorem *ipsum(void) {
  return dolor(sit, amet);
}
Run Code Online (Sandbox Code Playgroud)

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

如果您与空白保持一致,或者您可以一眼数出段落数,那么这应该可行。如果您有兴趣,Vim 帮助文件有更多光标技巧。