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
突出显示直到下一个空行:/^$<CR>
删除:d
键绑定
更强大的解决方案:
:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d
说明
禁用搜索换行::set nowrapscan
重新映射D
键(到以下命令)::nnoremap D
进入“linewise-visual”模式:V
突出显示直到下一个空/空白行或 EOF:/^\s*$\\|\%$<CR>
删除: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”)。
这将删除从当前行到标记行(包括)的所有行。它还与vi
和vim
兼容,除非您的环境没有使用后者。
【讨论】:
这该死的摇滚!我讨厌在寻找更好的解决方案之前我只做了多长时间(比如数行)。谢谢! 真的太棒了,我一直使用可视模式删除块,但这种方式更好+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<CR>
动作,所以如果您知道要删除包含 foo 的行,您可以执行 dV/foo<CR>
。 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
(大写)。然后向上/向下移动以突出显示要删除的块(所有通常的移动命令都有效)。然后使用x
或d
将其删除。
【讨论】:
奇怪。我知道它适用于我 (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中输入的行数