ChatGPT解决这个技术问题 Extra ChatGPT

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

vim

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

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

如果窗口足够大,则相对行号在这里很有帮助。将光标放在窗口顶部,找到要删除的最后一行的相对行号(例如 n),添加一个,然后键入该数字,然后键入 dd。例如,如果 n=50,则 51dd。或者,使用运动命令 -- 50d<down arrow>
“查找相对行号” - 或者,使用 :set rnu,Vim 会立即执行此操作!您所在的行仍将被绝对编号,但光标上方和下方的行将对称编号为 1、2、...(并随着光标移动、文件级事件等更新)
对于 2 种模式之间的可变多行,我最终在 linux CLI 中使用了 sed……请参阅 stackoverflow.com/a/6287940/6614155

p
paxdiablo

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

这将删除从当前行到标记行(包括)的所有行。它还与 vivim 兼容,前提是您的环境不具备后者。


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

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


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

您也可以使用可视模式(某些命令也可以与删除选项一起使用)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 很容易记住为“删除段落”
d
daviewales

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

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

:24,39d

您也可以使用拉线

:24,39y

并使用 24-39 行查找并替换

:24,39s/find/replace/g

R
René Nyffenegger

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


谢谢你的提示。不幸的是,我在这里使用代码,通常需要比这更细粒度的控制。
我也在使用代码,我用空行分隔逻辑块。这个技巧让我很开心。我现在可以用三个按键删除大块逻辑。
它有效,因为'd'表示删除,'p'在这种情况下表示段落
J
Jim Mitchener

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


T
Tom Regner

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

想到了两种可能:

切换到可视模式(V、SV、...),通过光标移动选择文本并按 d

删除整个段落:dap


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

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


在我开始使用 :se rnu 之前,我没有意识到它有多么有用 - 非常适合了解 50dd 以及导航,50j
J
John P

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

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

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

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


J
Judge Maygarden

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


可能很奇怪,但从这里我想出了如何从一行中的某个所需中点选择文本,并在同一点选择多行到每行的末尾。正是我想要的。
Z
ZyX

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


R
Rohit Pruthi

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


使用 dG 可能更容易,它删除到文档的末尾,因为 G 默认转到最后一行。
J
Jon Nadal

删除文本块

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

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