我用Google搜索了这个,但无法找到任何明确的解释。
很多人称赞Vim是一种内部一致的语言,但我没有看到它的一致性。
由于hjkl
向左下方:
dh
就像“删除左边”一样,它会删除光标左侧的字符,到目前为止是有道理的。
dl
就像“删除权限”但删除了......当前字符?
dj
就像“删除”一样,我假设这只是删除下面的行,但它实际上也会删除当前行!
'dk'就像是“删除”,同样我希望它只是清除上面的行,而是清除当前行和它上面的行。
任何人都可以解释这里的逻辑是什么吗?我可以在同一行删除+左右处理字符,并删除+上下处理行,但为什么行为如此不一致?我在这里缺少什么逻辑?
或者它真的更像是“这里没有一致的逻辑,只是记住它”的事情?
答案 0 :(得分:6)
这是一致的。把它想象成一个文本光标,而不是块光标,例如:
abc
^
你在这里用光标。对于delete命令,它实际上是这样的:
a|bc
Vim始终适用于范围。如果您没有指定范围,只指定目标,则范围的第一个点始终是光标位置:因此dh
从此处删除到h
,其中h
如下位置:
|abc
所以你告诉vim从a|bc
删除到|abc
因此删除了光标位置之间的所有内容。
dl
转到从a|bc
到ab|c
的另一个方向 - > a|b|c
所以只会删除b
。
在j
和k
次移动中,它基于行,但基本相同。
因此,如果您在以下情况下按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
动作所涵盖的文本,因此它会在“光标”之后剪切字符,恰好是“当前字符”。