在 vim 中,我经常发现自己删除(或复制)大块文本。可以计算文本的行数并说(例如)50dd
删除 50 行。
但是如何在不知道要删除多少行的情况下删除这么大的文本块呢?
51dd
。或者,使用运动命令 -- 50d<down arrow>
:set rnu
,Vim 会立即执行此操作!您所在的行仍将被绝对编号,但光标上方和下方的行将对称编号为 1、2、...(并随着光标移动、文件级事件等更新)
sed
……请参阅 stackoverflow.com/a/6287940/6614155
转到起始行并键入 ma(标记“a”)。然后转到最后一行并输入 d'a(删除以标记“a”)。
这将删除从当前行到标记行(包括)的所有行。它还与 vi
和 vim
兼容,前提是您的环境不具备后者。
我不是 vim 大师,但我在这种情况下使用的是“视觉模式”。在命令模式下,键入 V
(大写)。然后向上/向下移动以突出显示要删除的块(所有通常的移动命令都有效)。然后用 x
或 d
将其删除。
.vimrc
中的某些设置使其起作用?
Shift
-v
进入视线模式...我也尝试使用 CTRL
键。所以这很有效,可能是最方便的方法。
CTRL
-v
) 和视觉块 (Shift
-v
)。
您也可以使用可视模式(某些命令也可以与删除选项一起使用)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
dap
很容易记住为“删除段落”
这里有很多更好的答案,但为了完整起见,我会在阅读上面提到的一些很好的答案之前提到我以前使用的方法。
假设您想从第 24-39 行删除。你可以使用 ex 命令
:24,39d
您也可以使用拉线
:24,39y
并使用 24-39 行查找并替换
:24,39s/find/replace/g
这有点取决于那个大块是什么。也许您只是想删除一个段落,在这种情况下可以使用。
如果您通过 set number
打开行号,您只需 dNNG
即可从当前位置删除到第 NN 行。因此,您可以导航到要删除的行的开头,只需 d50G
假设这是您要删除的最后一行。
有几种可能性,最好的取决于您处理的文本。
想到了两种可能:
切换到可视模式(V、SV、...),通过光标移动选择文本并按 d
删除整个段落:dap
如果整个块在屏幕上可见,您可以使用 relativenumber 设置。请参阅 :help relativenumber。在 7.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 帮助文件有更多的光标技巧。
您可以将光标放在块的开头或结尾并进入可视模式(shift-v)。然后只需向上或向下移动,直到突出显示所需的块。最后,按 y 复制文本或按 d 剪切文本。
除了这里已经提到的其他动作之外,还有 /{pattern}<CR>
动作,因此如果您知道要删除包含 foo 的行,则可以执行 dV/foo<CR>
。 V
在这里强制运动是逐行的,因为默认情况下 /
是逐字符的。
您也可以输入一个很大的数字,然后按 dd
如果您想删除光标下的所有行。
dG
可能更容易,它删除到文档的末尾,因为 G
默认转到最后一行。
删除文本块
假设您的光标位于块的开头:
V/^$<CR>d (where <CR> is the enter/return key)
解释
进入“linewise-visual”模式:V
突出显示直到下一个空行:/^$
删除:d
键绑定
更强大的解决方案:
:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d
解释
禁用搜索换行: :set nowrapscan
重新映射 D 键(到以下命令): :nnoremap D
进入“linewise-visual”模式:V
突出显示直到下一个空/空白行或 EOF:/^\s*$\\|\%$
删除:d
不定期副业成功案例分享
/var/mail/username
中批量删除服务器中的邮件,并保留最后一封邮件。我做一个标记,然后输入例如50000
,然后输入gg
以转到第 50.000 行,然后删除其间的所有行。奇迹般有效!vim
作为编辑千兆字节文件的工具 - 我倾向于选择文本处理工具,例如awk
及其兄弟 :-)