【问题标题】:Efficient way to remove multiple spaces between two words in Vim在 Vim 中删除两个单词之间的多个空格的有效方法
【发布时间】:2011-07-06 06:30:45
【问题描述】:

假设我有以下文字

 word1 word2              word3 word4

光标位于word2word3 之间。

问题

  • 在 Vim 中用单个空格替换 word2word3 之间的多个空格的最快方法是什么?

初步想法

  • :s/ */ /g

但是,我认为可能会有像 diw 这样更快的东西,但对于空格。

如果当光标位于wword32word2 上时该策略也有效,那也很好。

【问题讨论】:

    标签: vim


    【解决方案1】:

    这对我有用:

    :s/\s\+/ /g

    【讨论】:

    • 谢谢。但是,这是 11 次按键,其中两次包括换档。
    • 我猜这是我的业余 vimgolfer 出来了。加号和冒号都需要换档(至少在我的键盘上)
    • 哇,我误解了你的问题。哈哈,抱歉,感谢您抽出宝贵时间回复;)
    • 这最适合用于搜索和替换缓冲区中的多个“太空蜗牛”。谢谢。
    【解决方案2】:

    ciw 然后逃回正常模式,尽管它只在你在空间上时才有效。

    【讨论】:

    • ciw-space-esc 5 次按键;那太棒了;如果需要,也许还可以按一些额外的按键将光标移动到空间中。
    • ldw仅在光标位于特定位置时有效;我猜gelldw 在许多相关的光标位置上都可以很好地工作。
    • 只是本着不执行你不知道的命令的精神,按照this answerciw代表“更改内部单词”,并且会删除光标当前所在的单词打开并让您进入 INSERT 模式。
    • ciw 删除单词之间的所有空格。答案应该是ciw<space>
    • 这就是我需要的。它必须比重复执行更简单x
    【解决方案3】:

    尝试用一个空格替换所有双空格(重复零次或多次)。

    :s/  \+/ /g
    

    【讨论】:

    • 不错!我只需要使用 \s 而不是 ` ` 就可以使其在模式搜索中工作,而不是在模式替换上::s/\s\s\+/ /g
    【解决方案4】:

    我使用(绑定到热键)

    i<enter><esc>kJ
    

    i - 插入模式

    k - 上一行

    J - 将线条连接在一起

    无论光标在空格内的哪个位置或word3w 上,这都有效,并将光标放在刚刚加入的单词的开头。如果您希望它与word2 上的2 一起使用,只需将第一个i 替换为a

    【讨论】:

    • 实际上,我认为这仅适用于我的 Join 在加入之前修剪线条。那么请随意忽略这个答案!
    • 这没有回答问题。
    【解决方案5】:
    %s/\(\w\)\s\+\(\w\)/\1 \2/g
    %  - global
    s - search
    \( - escape (
    \w - (any letter, digit)
    \) - escape )
    \(\w\) - remember letter/digit before space as \1
    \s - whitespace
    \+ - escape +
    \s\+ - 1 or more whitespace space
    \(\w\) - remember letter/digit after space(s) as \2
    / - replcae with
    \1 - remembered last letter/digit before space
    ' ' - space character here - single space
    \2 - remembered first letter/digit after white space(s).
    / - end of replace
    g - globally
    

    【讨论】:

    • 这不能回答问题。文档可能很有用,但更好的方法是为问题提供特定的解决方案并包括文档。
    • 好答案。 %s/(\S)\s\+(\S)/\1 \2/gc 可以在单词和符号(或非空格)之间找到多个空格
    【解决方案6】:

    我会分两步完成

    1. $ // 光标移动到行尾的空格
    2. dw // 删除空格 (必要时使用 . 重复)

    【讨论】:

      【解决方案7】:

      在 3 次击键中,将其添加到您的 init.vim (neovim) 或 .vimrc (vim):

      nnoremap <silent> di<Space> /<Space><Space>diwi<Space><Esc>:noh<CR>
      nnoremap <silent> da<Space> /<Space><CR>diw:noh<CR>
      

      现在,在正常模式下,您可以“d删除 i相关 空格 strong>" 替换为单个空格,以及 "delete all 空格" 删除所有空格。

      这适用于当前或下一个空格块。不幸的是,它不能用点. 运算符重复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-10
        • 2016-04-16
        • 2014-10-01
        相关资源
        最近更新 更多