试图理解Vim中删除的逻辑

The*_*ker 3 keyboard vim keyboard-shortcuts shortcut key-bindings

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

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

由于hjkl左下:

dh 就像"删除左"一样,删除光标左侧的字符,到目前为止是有意义的.

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

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

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

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

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

Dok*_*ldo 6

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

abc
 ^
Run Code Online (Sandbox Code Playgroud)

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

a|bc
Run Code Online (Sandbox Code Playgroud)

Vim始终适用于范围.如果你没有指定一个范围,只有一个目标,那么范围的第一个点总是光标位置:所以dh从这里删除h,其h位置如下:

|abc
Run Code Online (Sandbox Code Playgroud)

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

dl从去另一个方向a|bcab|c> - a|b|c因此,只有b将被删除.

jk运动,它是基于行的,但基本上是相同的.

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

abc

abc
 ^
Run Code Online (Sandbox Code Playgroud)

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

abc
 ^
abc
Run Code Online (Sandbox Code Playgroud)

这与vim中的所有其他命令一致,并且是使vim如此强大的一部分.想想搜索/命令,例如:

 abc
 a|bc
 abc
 dfe
 dfe 
 dfe
Run Code Online (Sandbox Code Playgroud)

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

 abc
 a|bc
 abc
 |dfe    
 dfe 
 dfe
Run Code Online (Sandbox Code Playgroud)

介于两者之间的所有内容都将被删除,您将最终得到:

 abc
 a
 dfe    
 dfe 
 dfe
Run Code Online (Sandbox Code Playgroud)

每个其他运动都是这种情况.