试图理解Vim

时间:2017-10-05 05:35:38

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

我用Google搜索了这个,但无法找到任何明确的解释。

很多人称赞Vim是一种内部一致的语言,但我没有看到它的一致性。

由于hjkl向左下方:

dh就像“删除左边”一样,它会删除光标左侧的字符,到目前为止是有道理的。

dl就像“删除权限”但删除了......当前字符?

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

'dk'就像是“删除”,同样我希望它只是清除上面的行,而是清除当前行和它上面的行。

任何人都可以解释这里的逻辑是什么吗?我可以在同一行删除+左右处理字符,并删除+上下处理行,但为什么行为如此不一致?我在这里缺少什么逻辑?

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

2 个答案:

答案 0 :(得分:6)

这是一致的。把它想象成一个文本光标,而不是块光标,例如:

abc
 ^

你在这里用光标。对于delete命令,它实际上是这样的:

a|bc

Vim始终适用于范围。如果您没有指定范围,只指定目标,则范围的第一个点始终是光标位置:因此dh从此处删除到h,其中h如下位置:

|abc

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

dl转到从a|bcab|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

每次其他运动都是如此。

答案 1 :(得分:0)

你不应该“假设”或“期待”任何事情。所有这些命令的行为都在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动作所涵盖的文本,因此它会在“光标”之后剪切字符,恰好是“当前字符”。