为什么 Vim 中不推荐使用箭头键

Mik*_*Lee 143 vim

“永远不要在 Vim 中使用箭头键!”

我从一个随机的演讲者那里听到了这个,但没有机会问他为什么。另外,如果不使用方向键,如何在插入模式下移动光标?

Dea*_*ean 186

使用箭头键被认为是一个坏习惯,因为如果您使用箭头键,您可能会错过 vim 的许多可爱功能。

当人们第一次开始使用 vim 时,他们倾向于保持插入模式,因为这更像是传统的文本编辑。然而,为了在 vim 中有效,您应该只在实际输入文本时处于插入模式。如果要移动光标,则应处于正常模式。默认情况下,您应该几乎处于正常模式。

在正常模式下,有一百万个快捷方式可以四处走动。您可以使用 一次hjkl移动一个空格,也可以按单词、段落等移动。如果您处于正常模式,则使用箭头键没有意义,hjkl因为它们离得很远。

有一种态度是,如果您使用箭头键,那么您就“错误地”使用了 vim。事实上,vim 有一个非常陡峭的学习曲线,所以在你学习的时候做任何让你保持清醒的事情。当我第一次开始使用 vim 时,我以“错误”的方式做所有事情,一旦我了解了更多 vim 的命令,我就没有任何打破习惯的问题。

例如,当我第一次开始时,假设我想更改引号中的文本:

String mystring = "I want to change this";
Run Code Online (Sandbox Code Playgroud)

我会进入插入模式,使用箭头键移动到字符串的末尾,按退格键直到字符串消失,然后输入新文本。

更好的方法是将光标放在字符串中的任何位置(正常模式),然后按ci"。这将change in "。它将删除引号之间的所有内容并将您置于插入模式,以便我可以输入新文本。

  • @MatthewScouten 没有人声称 vim 比鼠标简单。但是,通过一些练习,它会快得多。使用鼠标就像指指点点和咕噜咕噜地表达你的观点。Vim 让你用完整的句子说话。 (19认同)
  • 嘿,这很整洁!移动光标是一种多么快速和强大的方式。改进它的唯一方法是通过某种方式神奇地指向您想要光标的位置,然后让它跳到那里。也许我们可以发明一些东西。我认为我们应该称它为“鼠标”。 (8认同)
  • “将光标放在字符串中的任何位置” - 再一次,在插入模式下,您可以使用箭头到达那里,而在正常模式下,您可以执行 `/want` 并按 Enter 键以落在单词 'want' 上,然后做`ci"`。 (6认同)
  • 打破习惯是一个很好的答案 - 但强行阻止某人进行正常活动是法西斯主义。更糟糕的是,(`hjkl`) 的*可用性*:将 `up` 和 `down` 映射到两个垂直无法区分的键,更不用说左右键了......这是一个 *悲剧* 表现出意识形态上盲目的傲慢。 (6认同)
  • @ott-- `ci<` 和 `ci)` 也能工作,而且您不必将手从键盘移到鼠标。如果要导航到括号的开头,然后更改内容 `f(ci(` 有效。 (4认同)

Chr*_*art 102

关键位置

简而言之,Vim使用hjkl按键作为导航界面是因为它是旧“ADM-3A”终端的残余,这些按键标有箭头。

键盘

由于vim派生自vi,它使用相同的 hjkl 密钥。

新习惯

箭头键的基于字母的替换使您可以在不离开标准打字配置的情况下浏览文本。这可以说比移动你的手来击中箭头键更有效、更快。正如参考文献 #2(请参阅参考资料)中所述,这并不是优点的结束:VIM 有许多其他快捷方式,您无需移动双手即可访问它们。

资源和插入模式

您的问题的 2 部分有一些非常详细和准确的答案:在箭头键替换方面,我以快速和总结的方式回答,但是对于您的插入问题,请参阅下面列出的资源。

  • 这并没有回答问题,只是解释了为什么选择 *hjkl*。 (3认同)
  • 这是真实而有趣的历史,但 OP 会询问您如何在插入模式下*移动光标。`hjkl` 在插入模式下不起作用,那么这如何回答这个问题呢? (3认同)
  • @Kruug,问题的第一部分是为什么有人说永远不要在 vim 中使用箭头键。你可以在 vim 中使用 `hjkl` 的事实并不能说明为什么有人不应该使用箭头键,就像我可以骑自行车上班的事实并不能解释为什么有人会告诉我永远不要慢跑。 (3认同)
  • 更不用说 hjkl 键比将手移动到箭头键更有效。 (2认同)

rom*_*inl 65

这个愚蠢的咒语经常被那些想要看起来很酷的非触控打字员重复,他们认为本行就像第二根脊椎。对于非接触式打字员来说,主排根本没有那么特别,稍微移动右手以到达箭头根本不是问题。

重要的是要考虑重复该咒语的人建议改用什么。

大多数时候,他们坚持使用hjkl.

如果我们忽略这些键的使用只是因为 vi 的作者使用的键盘没有物理箭头键,因此任何反对箭头键的论点都只是合理化,hjkl那么无论如何都只比箭头好一点。是的,在hjkl箭头上使用的唯一好处是您可以跳过右手来回箭头的小动作。这种好处是否值得麻烦是你的电话。

但是右手的移动并不是为什么使用箭头效率低下的原因。这是低效的,因为它们限制您逐个字符和逐行移动,而编辑文本所需的大多数移动范围要大得多。

锤击右箭头 13 次既低效又乏味。难道更好地捶了l关键的13倍?不,这同样愚蠢。

一直按住右箭头直到到达目标并不那么无聊,但它很容易出错,而且几乎与 13 次点击一样低效,因为最后会出现必要且非确定性的减速。难道更好的保持l按键?不,当然不是。

值得庆幸的是,大多数 GUI 工具包都提供了这样的组合Ctrl+Right,允许我们逐字移动或跳转到 EOL、下一段或其他任何内容。与单箭头相比,这些快捷方式可以帮助我们更快、更智能地导航。我们有相同的hjkl吗?不,我们没有。如果需要,我们可以使用计数,但谁想为每个动作计算字符数?在14k的帮助下relativenumber做很棒,但是水平运动呢?对于大动作,hjkl其实比修饰符+箭头还差。你猜怎么着?大动作是我们最需要的。

但我们是幸运的混蛋,我们最喜欢的编辑器有几十个围绕箭头 hjkl:bBeEwW/?*#{}()等等的动作。这些命令没法比更赋予比hjkl和大部分有很多更合乎逻辑的和直观的,如果你是用来Ctrl+Right和朋友。

切换<Right><Right><Right><Right><Right><Right><Right><Right><Right>lllllllll甚至9l是荒谬的毫无意义。

从 切换<Right><Right><Right><Right><Right><Right><Right><Right><Right><C-Right>好得多。从那里,切换到w既简单又快捷。不需要<nop>你的箭!

如果这些命令比 更有用、更强大、更直观hjkl,为什么还有那么多博主和评论者坚持用 代替箭头hjkl

我有。不知道。

总之,hjkl在我们的工具带中占有一席之地,因为我们总是必须移动 2 个字符或行,但它们往往不是隐藏森林的树。警惕那些反对箭矢的人:他们为你准备的东西可能根本不会更好。

  • 在这里也一样:最后我喜欢你的回答,但我认为语气是不必要的咆哮/拖钓/燃烧。 (5认同)
  • 不要说它们没用,关于速度的论点是一个很好的论点,而且 HJKL 与其他 VIM 命令一起工作的方式与箭头键不同的方式也很重要。 (2认同)

Lar*_*rsH 19

其他人已经描述了为什么首选其他移动光标的方式,但很少有人回答这个问题,为什么使用箭头键被认为是一个坏主意?

我认为主要原因(@Squeezy 有点暗示)是在像 VT100 这样的终端时代,箭头键产生了一个由正在运行的程序解释的转义序列。(由于箭头键不以 ASCII 表示,因此必须以某种“特殊”方式传达箭头键的输入。)转义序列通常类似于

ESC [ A
Run Code Online (Sandbox Code Playgroud)

取决于终端的属性、连接和光标模式。如果您的 shell 或您的程序没有为终端正确配置,他们就不会将转义序列理解为箭头键。

我上大学的时候,通过VT100终端登录Ultrix,如果我在vi中在插入模式下按一个箭头,ESC会被解释为“退出插入模式”,然后以下[ A被解释为正常模式命令. 显然不是用户想要或期望的!

如今,终端和箭头键的处理似乎更加健壮,尤其是在 GUI 环境中。但是在通过 SSH 或 Telnet 使用 vim 时仍然会出现同样的问题。


pdo*_*926 14

使用箭头键是不受欢迎的,因为它迫使您在使用 QWERTY 布局时从 homerow 移动手指,在使用 Dvorak 或任何其他布局时从字符键盘 (?) 移动手指。

  • 为什么移动你的手意味着思考? (13认同)
  • 好吧,当我在学校必须这样做时,您必须先按 esc 才能使用 hjkl 导航,因此您已经将左手从主排移开,让小指按 Esc。我记得要返回一个空格并插入一个字符,您必须输入“Esc : hi”,然后键入要插入的字符。那不是很有帮助。 (8认同)
  • 哇。严重地?我不想相信这一点,因为这意味着设计 Vim 的人会认为他们的用户花在打字上的时间多于思考。 (4认同)
  • @Renan - 1)你低估了储蓄和 2)小事情加起来。我见过触摸式 Vim 高级用户的编辑速度是其他开发人员的 10 倍。在足够的速度下,编辑变得自动并且不会打断一个人的想法或流程。以这种方式工作很愉快,所以它确实让我的船漂浮起来,但我敢打赌,这比您想象的要大得多的生产力提升。以 Gary Bernhardt 等编码员为例。 (2认同)

ott*_*t-- 10

箭头键在慢速连接(如 1200 波特调制解调器)上出现问题 - 在 vi​​ 中已经知道了。箭头转换为 ESC 序列,如ESC a. 现在,当 ESC 和 a 之间的时间过长时,您最终会听到 BEL(或看到闪光),然后是追加模式。这不会与hjkl键一起出现。

  • `ESC [ A` 是一个 DEC VT-100 终端(ANSI 终端是 DEC VT-100 的强烈衍生)箭头。IIRC,“ESC A”是 ADM-3A 箭头,也可能是 DEC VT-52 箭头。要点保持不变,但是,作为箭头键的一部分发送的“ESC”字符很容易与手动输入的“ESC”混淆。 (2认同)

Kaz*_*Kaz 6

关于第二个问题:

[I]如果不使用方向键,如何在插入模式下移动光标?

对于一个高手,因此不屑于方向键的人,“模式”的概念同样不存在。

master 不是使用插入模式,而是使用完整的插入或替换命令添加新文本,这些命令以操作码开头,例如i,o或者cw其后是有效负载文本,并以ESC. 命令有语法,因此机器在接受命令的语法时会遍历状态,但在编辑器的主模型中,这些不会产生模式。徒弟们天真地称之为“模式”,对于师傅来说,是一种未完成的命令状态,是师傅避免的最可恶的情况。

每当 master 意识到,在插入或替换命令的中间,除了光标指示的下一个字符位置之外,必须插入或删除该文本,master 终止插入命令,并释放数十个有效的移动命令(hjkl如果更强大的方法显然不适用,则求助于低级)。

此外,由于主控很少会因为留下未完成的命令而分心,主控很少(如果有的话)由于输入了多余的ESC“以防万一”而使编辑器发出哔哔声。

(但是,当网络滞后或机器陷入困境时,主人会ESC像其他人一样疯狂地反复敲击密钥。)

  • 请记住,如果 `vi` 的插入命令条目是一种模式,那么公平地说,我们必须在其他编辑器中识别所有此类模式并将它们称为模式。例如,当我们在 Emacs 中按 Ctrl-X 时,我们处于一种“模式”,例如,可以按 Ctrl-S 来保存文档,这在该“模式”之外将无法工作。 (2认同)

Squ*_*ezy 5

  • 在某些环境中,箭头键可能无法正常工作。hjkl是普通字符,各种终端都能理解。
  • 插入模式下你不会移动光标(除了退格和纠正一个短的错字),vi的想法是进入插入模式只是为了输入一些东西。移动在正常模式下完成
  • 如果可以,您应该避免在任何适用的地方使用hjkl进行移动,而仅将它们用于指示。在vi 中有许多移动选项,请参阅:http : //vim.wikia.com/wiki/Moving_around