我用谷歌搜索了这个,但找不到任何明确的解释。
很多人称赞 Vim 是它自己内部一致的语言,但我没有看到一致性。
自 hjkl
左下右上:dh
就像“删除左侧”一样,它删除光标左侧的字符,到目前为止是有道理的。dl
就像“删除正确”一样,但它删除了......当前角色?dj
就像“删除”一样,我认为这只是删除了下面的行,但它实际上也删除了当前行!
'dk' 就像“删除”一样,同样我希望它只是清除上面的行,但它会清除当前行及其上面的行。
谁能解释一下这里的逻辑是什么?我同意删除 + 左右处理同一行上的字符,删除 + 上下处理行的想法,但为什么行为如此不一致?我在这里缺少的逻辑是什么?
或者它真的更像是“这里真的没有一致的逻辑,只需记住它”?
最佳答案
这是一致的。将其视为文本光标,而不是块光标,例如:
abc
^
你在这里用光标。对于删除命令,它实际上是这样的:
a|bc
Vim 总是处理范围。如果不指定范围,只指定目标,范围的第一个点始终是光标位置:所以
dh
是从这里删除到 h
, 与 h
处于以下位置:|abc
所以你告诉 vim 从
a|bc
中删除至 |abc
因此,光标位置之间的所有内容都将被删除。dl
从 a|bc
转到另一个方向至 ab|c
-> a|b|c
所以只有 b
将被删除。在
j
和 k
Action ,是以线为主,但基本相同。所以如果你按
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
其他所有运动都是如此。
关于vim - 试图理解 Vim 中删除的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46578519/