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

Posted

技术标签:

【中文标题】vim - 如何在不计算行数的情况下删除一大块文本?【英文标题】:vim - How to delete a large block of text without counting the lines? 【发布时间】:2011-07-18 18:07:39 【问题描述】:

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

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

【问题讨论】:

如果窗口足够大,相对行号在这里很有帮助。将光标放在窗口顶部,找到要删除的最后一行的相对行号(例如,n),添加一个,然后键入该数字,然后键入 dd。例如。如果 n=50,则 51dd。或者,使用运动命令 -- 50d<down arrow> "查找相对的行号" - 或者,使用:set rnu,Vim 会立即执行此操作!您所在的行仍将被绝对编号,但光标上方和下方的行将对称编号为 1、2、...(并随着光标移动、文件级事件等更新) 【参考方案1】:

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

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

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

如果您的光标从注释块上方开始,“d”将删除注释块,“d2”将同时删除注释块和代码块。如果光标从代码块下方开始,'d' 删除代码,'d2' 删除两者。当然,您可以先移动光标跳过一个块:'d' 或 'd'。 如果您与空格一致,或者您可以一目了然地计算段落,这应该可以。如果您有兴趣,Vim 帮助文件有更多的光标技巧。

【讨论】:

【参考方案2】:

删除文本块

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

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

说明

进入“linewise-visual”模式:V 突出显示直到下一个空行:/^$&lt;CR&gt; 删除:d

键绑定

更强大的解决方案:

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

说明

禁用搜索换行::set nowrapscan 重新映射D 键(到以下命令)::nnoremap D 进入“linewise-visual”模式:V 突出显示直到下一个空/空白行或 EOF:/^\s*$\\|\%$&lt;CR&gt; 删除:d

【讨论】:

【参考方案3】:

您也可以输入一个很大的数字,然后按dd,如果您想删除光标下的所有行。

【讨论】:

使用dG 可能会更容易,它会删除到文档的末尾,因为G 默认会转到最后一行。【参考方案4】:

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

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

:24,39d

你也可以使用

:24,39y

使用

查找并替换刚刚超过第 24-39 行的内容
:24,39s/find/replace/g

【讨论】:

【参考方案5】:

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

这将删除从当前行到标记行(包括)的所有行。它还与vivim 兼容,除非您的环境没有使用后者。

【讨论】:

这该死的摇滚!我讨厌在寻找更好的解决方案之前我只做了多长时间(比如数行)。谢谢! 真的太棒了,我一直使用可视模式删除块,但这种方式更好+1 我发现这比删除 500k+ 行的可视模式更有帮助 真正实用的答案。我用它从文件/var/mail/username 中批量删除我服务器中的邮件,并保留最后一封邮件。我做一个标记,然后输入例如50000,然后输入gg 以转到第 50.000 行,然后删除其间的所有行。像魅力一样工作! @horta,我可能不会使用 vim 作为编辑千兆字节文件的工具 - 我倾向于选择文本处理工具,例如 awk 及其兄弟 :-) 【参考方案6】:

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

【讨论】:

直到我开始使用它之前,我才意识到 :sernu 有多么有用 - 非常适合了解 50dd 以及导航,50j【参考方案7】:

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

【讨论】:

【参考方案8】:

除了这里已经提到的其他动作之外,还有/pattern&lt;CR&gt; 动作,所以如果您知道要删除包含 foo 的行,您可以执行 dV/foo&lt;CR&gt;V 在这里强制运动是逐行的,因为默认情况下/ 是逐字符的。

【讨论】:

【参考方案9】:

您也可以使用可视模式(某些命令也可以与删除选项一起使用) 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                  

【讨论】:

da[, da, da" 对程序员都有用 谢谢! dap 很容易记为“删除一段”【参考方案10】:

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

【讨论】:

感谢您的提示。不幸的是,我在这里使用代码,通常需要比这更细粒度的控制。 我也在处理代码,我用空行分隔逻辑块。这个技巧让我很开心。我现在可以通过三个按键删除大块逻辑。 之所以有效,是因为“d”表示删除,“p”在此上下文中表示段落【参考方案11】:

有多种可能性,最好的取决于您处理的文本。

想到两种可能性:

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

【讨论】:

我现在经常使用 dap,因为我知道它并且更喜欢它而不是 dis 和 dip,但是,它总是删除一个块和块之后的空白行,但这是一种方法删除块和它之前的空行? 在带有段落的文本中间,结果没有语法差异,是吗?如果有的话,我建议在一个新问题中写下你想要的,并附上例子。【参考方案12】:

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

【讨论】:

可能很奇怪,但从中我想出了如何从一行中的某个所需中点选择文本,并在同一点选择多行到每行的末尾。正是我想要的。【参考方案13】:

我不是 vim 大师,但我在这种情况下使用的是“视觉模式”。在命令模式下,键入V(大写)。然后向上/向下移动以突出显示要删除的块(所有通常的移动命令都有效)。然后使用xd 将其删除。

【讨论】:

奇怪。我知道它适用于我 (tm) 在 Linux (vim 7.3.50) 和 gVim 在 Windows 上。从其他答案来看,对其他人有用。也许您的.vimrc 中的某些设置正在起作用? 好的,由于某种原因,我没有意识到您可以使用Shift-v 进入视线模式...我也尝试使用CTRL 键。所以这是可行的,并且可能是最方便的方式。 您可能想澄清一下,有两种视觉模式 - Visual Line (CTRL-v) 和 Visual Block (Shift-v)。 我经常这样做。但我一直认为它是作弊和不太理想的 vim。 实际上有三种视觉模式:视觉模式(基于字符的v)、视觉线模式(基于线的Sv)和视觉块模式(允许选择块Cv)跨度>

以上是关于vim - 如何在不计算行数的情况下删除一大块文本?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:如何在不考虑宽度的情况下获取textView中输入的行数

轻快的VIM:删除

VIM:如何在不使用非文本颜色元素的情况下更改 Showbreak Highlight 颜色

在不计算的情况下获取 Spark 数据框中的行数

如何在不介入第三个变量的情况下实现两个数的交换

使用python计算文件中删除行数的最佳方法