试图理解 Vim 中的删除逻辑
Trying to understand the logic of deletions in Vim
我用谷歌搜索了这个,但找不到任何明确的解释。
很多人称赞 Vim 是一种内部一致的语言,但我没有看到一致性。
因为 hjkl
从左到右:
dh
与 "delete left" 类似,它删除光标左侧的字符,到目前为止是有意义的。
dl
类似于 "delete right" 但它会删除...当前字符?
dj
就像 "delete down",我假设这只是删除下面的行,但它实际上也删除了当前行!
'dk' 就像 "delete up" 一样,我希望它只是清除上面的行,而是清除当前行和上面的行。
谁能解释一下这里的逻辑是什么?我对 delete + 左右处理同一行字符和 delete + 上下处理行的想法没意见,但为什么行为如此不一致?我在这里缺少什么逻辑?
或者它真的更像是 "there is no consistent logic here really, just memorize it" 的东西?
你不应该 "assume" 或 "expect" 任何东西。 Vim 的在线文档中对所有这些命令的行为进行了精确解释。
hjkl
是动作,d
是对动作覆盖的文本起作用的运算符。
dj
处理 j
议案所涵盖的文本。由于 j
是将光标移动到下一行的线性运动,因此 dj
是 "cut this line and the one below".
dk
处理 k
议案所涵盖的文本。由于 k
是将光标移动到上面一行的线性运动,因此 dk
是 "cut this line and the one above".
对于水平移动,你必须明白终端的光标实际上是在两个字符之间:
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
动作覆盖的文本,因此它会剪切 "cursor" 之前的字符,而 "cursor" 恰好也是 [ 之前的字符=58=].
dl
作用于 l
动作覆盖的文本,因此它会剪切 "cursor" 之后的字符,恰好是 "current character" .
这是一致的。将其视为文本光标,而不是块光标,例如:
abc
^
您在此处使用光标。删除命令其实是这样的:
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
其他所有动作都是如此。
我用谷歌搜索了这个,但找不到任何明确的解释。
很多人称赞 Vim 是一种内部一致的语言,但我没有看到一致性。
因为 hjkl
从左到右:
dh
与 "delete left" 类似,它删除光标左侧的字符,到目前为止是有意义的。
dl
类似于 "delete right" 但它会删除...当前字符?
dj
就像 "delete down",我假设这只是删除下面的行,但它实际上也删除了当前行!
'dk' 就像 "delete up" 一样,我希望它只是清除上面的行,而是清除当前行和上面的行。
谁能解释一下这里的逻辑是什么?我对 delete + 左右处理同一行字符和 delete + 上下处理行的想法没意见,但为什么行为如此不一致?我在这里缺少什么逻辑?
或者它真的更像是 "there is no consistent logic here really, just memorize it" 的东西?
你不应该 "assume" 或 "expect" 任何东西。 Vim 的在线文档中对所有这些命令的行为进行了精确解释。
hjkl
是动作,d
是对动作覆盖的文本起作用的运算符。
dj
处理j
议案所涵盖的文本。由于j
是将光标移动到下一行的线性运动,因此dj
是 "cut this line and the one below".dk
处理k
议案所涵盖的文本。由于k
是将光标移动到上面一行的线性运动,因此dk
是 "cut this line and the one above".
对于水平移动,你必须明白终端的光标实际上是在两个字符之间:
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
动作覆盖的文本,因此它会剪切 "cursor" 之前的字符,而 "cursor" 恰好也是 [ 之前的字符=58=].dl
作用于l
动作覆盖的文本,因此它会剪切 "cursor" 之后的字符,恰好是 "current character" .
这是一致的。将其视为文本光标,而不是块光标,例如:
abc
^
您在此处使用光标。删除命令其实是这样的:
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
其他所有动作都是如此。