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

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

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

【问题讨论】:

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

标签: vim


【解决方案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})跨度>
            猜你喜欢
            • 2016-09-15
            • 1970-01-01
            • 1970-01-01
            • 2015-01-29
            • 2023-04-03
            • 2013-07-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多