【问题标题】:Trying to understand the logic of deletions in Vim试图理解 Vim 中删除的逻辑
【发布时间】:2017-10-05 05:35:38
【问题描述】:

我用谷歌搜索了这个,但找不到任何明确的解释。

很多人称赞 Vim 是它自己内部一致的语言,但我看不到这种一致性。

由于hjkl 是从左到右:

dh 就像“删除左侧”,它删除光标左侧的字符,到目前为止是有意义的。

dl 类似于“删除权”,但它删除了……当前字符?

dj 就像“删除”,我假设这只是删除下面的行,但它实际上也删除了当前行!

'dk' 就像“删除”一样,我希望它只是清除上面的行,但它会清除当前行及其上面的行。

谁能解释这里的逻辑是什么?我对删除+左右处理同一行字符,删除+上下处理行的想法没问题,但为什么行为如此不一致?我在这里缺少什么逻辑?

还是真的更像是“这里真的没有一致的逻辑,只是记住它”?

【问题讨论】:

    标签: vim keyboard keyboard-shortcuts shortcut key-bindings


    【解决方案1】:

    这是一致的。将其视为文本光标,而不是块光标,例如:

    abc
     ^
    

    你带着光标在这里。删除命令其实是这样的:

    a|bc
    

    Vim 总是使用范围。如果不指定范围,只指定目标,范围的第一个点始终是光标位置:所以dh从这里删除到hh是以下位置:

    |abc
    

    所以你告诉 vim 从 a|bc|abc 删除,因此光标位置之间的所有内容都会被删除。

    dla|bc 转到另一个方向ab|c -> a|b|c 所以只有b 将被删除。

    jk动作中,都是以线为单位,但基本相同。

    因此,如果您在以下情况下按dk

    abc
    
    abc
     ^
    

    你告诉 vim 删除每一行,直到你到达以下位置:

    abc
     ^
    abc
    

    这与 vim 中的所有其他命令一致,也是 vim 如此强大的部分原因。 以搜索/ 命令为例:

     abc
     a|bc
     abc
     dfe
     dfe 
     dfe
    

    如果你按下d/dfe<CR>,它不仅会删除dfe,还会删除直到dfe。所以你将有以下两个光标位置:

     abc
     a|bc
     abc
     |dfe    
     dfe 
     dfe
    

    中间的所有内容都将被删除,你最终会得到:

     abc
     a
     dfe    
     dfe 
     dfe
    

    其他所有动作都是如此。

    【讨论】:

    • 那么如果事情在范围上起作用,为什么早期的删除命令看起来是“包含”的,例如行删除 dj 和 dk,但删除直到搜索项 dfe 似乎是“独占”?我原以为它会删除其中一个 dfe。删除直到与删除到(包括)。
    • 首先用于/ 搜索。搜索命令将光标放在找到的单词的第一个位置。您可以使用eflag dfe/e 对其进行修改,但不幸的是,该删除命令不适用于该命令。 jk是线性运动(你可以看到:h j:h k),而hl/是排他运动。再次查看:h /:h l
    • 因此,实际受运算符影响的字符范围取决于光标的开始位置和结束位置,然后整个范围都会被运算符修改
    • 是的,这使得使用它变得更加灵活。想象一下你想要删除 6 行,它只是 d6j,你的逻辑只有从这里开始的第 6 行会被删除。在 vim 中使用:+6d 仍然可以做到这一点,但通常情况下,您想从光标所在的位置删除,这就是为什么您的光标在那里而不是下面的 6 行
    • 所以dj 的行为可以通过:+1d 实现
    【解决方案2】:

    你不应该“假设”或“期待”任何事情。所有这些命令的行为在 Vim 的在线文档中都有详细的解释。

    hjkl 是动作,d 是对动作所覆盖的文本进行操作的运算符。

    • dj 作用于j 动议所涵盖的文本。由于j 是一种将光标移动到下一行的逐行运动,所以dj 是“剪掉这一行和下一行”。

    • dk 处理 k 运动所涵盖的文本。由于k 是一种将光标移动到上一行的逐行运动,所以dk 是“剪掉这一行和上一行”。

    对于水平运动,你必须明白终端的光标其实是在两个字符之间:

    sample text:                lorem
    
    the "current character":    lorem
                                  ^
    
    the "cursor":               lo|rem
    
    the text covered by "h":    l|orem
                                  ←
    
    the text covered by "l":    lor|em
                                  →
    
    • dh 作用于h 运动所覆盖的文本,因此它会剪切“光标”之前的字符,而光标恰好也是“当前字符”之前的字符。

      李>
    • dl 作用于l 动作所覆盖的文本,因此它会剪切“光标”之后的字符,而该字符恰好是“当前字符”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 2022-12-07
      • 2022-07-06
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多