vim - 试图理解 Vim 中删除的逻辑

标签 vim keyboard keyboard-shortcuts shortcut key-bindings

我用谷歌搜索了这个,但找不到任何明确的解释。

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

hjkl左下右上:
dh就像“删除左侧”一样,它删除光标左侧的字符,到目前为止是有道理的。
dl就像“删除正确”一样,但它删除了......当前角色?
dj就像“删除”一样,我认为这只是删除了下面的行,但它实际上也删除了当前行!

'dk' 就像“删除”一样,同样我希望它只是清除上面的行,但它会清除当前行及其上面的行。

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

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

最佳答案

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

abc
 ^

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

Vim 总是处理范围。如果不指定范围,只指定目标,范围的第一个点始终是光标位置:所以dh是从这里删除到 h , 与 h处于以下位置:
|abc

所以你告诉 vim 从 a|bc 中删除至 |abc因此,光标位置之间的所有内容都将被删除。
dla|bc 转到另一个方向至 ab|c -> a|b|c所以只有 b将被删除。

jk 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/

相关文章:

javascript - 当输入元素获得焦点时,如何禁用 YAHOO.util.KeyListener?

java - 键入键后关闭 shift

flutter - 获取文本字段中的光标位置

java - 在 java 中禁用 Mac OS X 键绑定(bind)

search - 在 vim 中突出显示 find next

vim - 将工作目录更改为当前打开的文件

android-studio - 将所有硬编码的字符串提取到字符串资源

c# - C# 属性声明的键盘快捷方式?

vim - 将文本粘贴到 vim 时关闭自动缩进

python - 如何在 Git Bash 的 Vim 中添加 Python 支持?