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


125

“千万不要在Vim中使用箭头键!”

我是从一个随机的发言者那里听到的,但没有机会问他为什么。另外,如果不使用箭头键,如何在“ 插入”模式下移动光标?


6
对这个问题的历史回答很有趣。宗教异教徒则更少。
艾萨克·拉比诺维奇

5
好问题。作为Dvorak键盘用户,这确实让我感到困惑,因为vi [m]真的很烂!
2013年

32
我记得很多年前,当我第一次使用vi时,一位资深同事建议我:“请确保您学会使用h,j,k和l键,因为有一天您将最终在客户端上的机器上使用箭头,按键不起作用,如果您什至无法使用vi,也会看起来像个完整的d ***。”
Ergwun 2013年

1
在插入模式下,您仍然可以使用Ctrl-O然后使用普通模式命令来移动光标,然后它将返回到插入模式。还要检查CTRL-G CTRL-J和CTRL-G CTRL-K,这会将光标移动到您开始插入的列的下一行和上一行。
贝努瓦

1
这些年来,我养成了许多不良的养成习惯。我认为我需要在非常慢的连接上使用它,以迫使我养成更好的习惯。
艾丹,

Answers:


172

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

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

在正常模式下,有一百万个快捷方式可以四处移动。您可以使用hjkl一次在一个空间中移动,也可以按单词,段落等移动。如果您处于普通模式,则没有必要使用箭头键代替,hjkl因为它们距离较远。

有一种态度是,如果您使用箭头键,那么您将使用vim“ wrong”。事实是,vim的学习曲线非常陡峭,因此在学习时,请尽一切努力保持理智。刚开始使用vim时,我以“错误”的方式进行了所有操作,一旦了解了更多vim的命令,我就不会在打破习惯上遇到任何问题。

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

String mystring = "I want to change this";

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

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


4
@ ott-- ci<也可以ci)正常工作,而不必将手从键盘移到鼠标。如果要导航到方括号的开头,然后更改内容即可f(ci(
马修·芬利

6
“将光标放在字符串中的任意位置”-再一次,而在插入模式下,您将使用箭头到达该位置,在正常模式下,您可以执行/want并按Enter键以落在单词'want'上,然后执行do ci"
内森·朗

8
嘿,这很整洁!快速移动光标的强大方法。改善它的唯一方法是某种神奇地指向您想要光标的位置,然后将其跳转到那里的方法。也许我们可以发明一些东西。我认为我们应该将其称为“鼠标”。
Matthew Scouten

18
@MatthewScouten没有人声称vim比鼠标更简单。经过一些实践,它的速度要快得多。使用鼠标就像指点和咕unt声来传达您的观点。Vim可让您用完整的句子讲话。
院长

4
打破习惯是一个很好的答案-但是强行阻止某人进行正常活动是法西斯主义者。更糟糕的是,()的可用性hjkl:映射updown2个在垂直方向上无法区分的键,更不用说从左右键了.....这是意识形态盲目傲慢的悲剧性例证。
新亚历山大

92

关键位置

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

键盘

由于vim是从派生的vi,因此使用相同的hjkl键。

新习惯

基于字母的箭头键替换使您可以浏览文本,而无需离开标准的键入配置。可以说,这比动手敲击箭头键更有效和更快。正如参考文献2中概述的那样(请参阅参考资料),这并不意味着该优点的尽头:VIM还有许多其他快捷方式,您可以在不动手的情况下进行访问。

资源和插入模式

对于您的问题的两个部分,有一些非常详细而准确的答案:关于箭头键的替换,我已经以快速和简要的方式回答了,但是对于您的插入问题,请参见下面列出的资源。


2
更不用说hjkl键比将手移到箭头键更有效。
2013年

2
这没有回答问题,仅说明了为什么选择hjkl
Matsemann

3
这是真实有趣的历史,但是OP询问您如何在插入模式下移动光标。hjkl不能在插入模式下工作,那么这如何解决问题?
LarsH 2013年

3
@Kruug,问题的第一部分是为什么有人说永远不要在vim中使用箭头键。您可以hjkl在vim中使用的事实并不能说明为什么不应该使用箭头键,就像我可以骑自行车上班的事实并不能解释为什么有人会告诉我不要慢跑。
LarsH 2013年

1
现在我明白了为什么Vim使用转义退出插入模式^^很酷的画面!
艾蒂安

56

这种愚蠢的口头禅经常会被那些触手可及的人(通常是第二根脊柱)或那些想看起来很酷的非触笔技术员重复。对于非接触式打字员来说,主行根本不是那么特别,并且稍微移动右手以到达箭头根本不是问题。

重要的是要考虑重复此口头禅的人建议使用的内容。

大多数时候,他们坚持使用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个字符或2行,但它们通常不是隐藏森林的树。警惕那些鼓吹箭头的人们:他们为您准备的东西可能根本无法改善。


起初,我以为您会说'hjkl'是没有用的,但是好的捕捉,单词/段落/句子的动作比有关单个字符动作的口头禅更有用。
Xavier T.

1
谢谢。前几天,我在HN上进行了类似的讨论,但由于措辞不佳而脱轨。集中精力hjkl 没有用的,但却hjkl是有用的。
romainl

5
同样在这里:最后,我喜欢您的回答,但我认为这种语气是不必要的咆哮/拖曳/燃烧。
UncleZeiv

不要称它们为无用的,关于速度的论点是一个很好的论点,而HJKL与其他VIM命令一起工作(以箭头键不起作用的方式)也很重要。
Aviator45003 2014年

@TC有什么例子可以使整个辩论更加有趣?
romainl 2014年

18

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

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

ESC [ A

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

当我上大学时,通过VT100终端登录Ultrix,如果在插入模式下在vi中按下箭头时,该命令ESC将解释为“退出插入模式”,然后将以下内容[ A解释为普通模式命令。显然不是用户想要或期望的!

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


14

使用箭头键是令人讨厌的,因为使用QWERTY布局时,它会迫使您将手指从Homerow中移开,而使用Dvorak或任何其他布局时,则会使您从字符板(?)中移开。


4
哇。认真吗 我不想相信这一点,因为这意味着设计Vim的人们会认为他们的用户花在打字上的时间多于思考。
雷南

13
为什么动您的手意味着思考?
EBGreen

8
好吧,当我不得不在学校这样做时,您必须先按esc键,然后才能使用hjkl导航,因此您已经从主行上移开了左手,以使小指达到Esc。我记得要返回一个空格并插入一个字符,您必须输入'Esc:hi',然后键入要插入的字符。多数民众赞成在那么没有帮助。
弗兰克·托马斯

1
@Renan-您假设“键入”的意思是“插入文本”。我有我的手指上家行,当我阅读和思考,也因为键盘是怎么定位在Vim的:搜索移动,打开其他文件进行比较的代码,到处乱窜乱跳纠正拼写错误,等等
弥敦道龙

2
@Renan-1)您低估了节省的费用,2)小事加起来。我已经看到,打字型Vim高级用户的编辑速度是其他开发人员的10倍。以足够的速度,编辑变得自动,并且不会打扰别人的想法或流程。这样工作很愉快,所以它确实使我的船浮起来,但是我敢打赌这将大大提高您的生产率。尝试观看像Gary Bernhardt这样的编码器作为示例。
内森·朗

10

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


我想ESC [ A你指的是什么?
LarsH

2
ESC [ A是DEC VT-100端子(ANSI端子是DEC VT-100的强衍生形式)箭头。IIRC ESC A是ADM-3A箭头,也可能是DEC VT-52箭头。要点保持不变,但是,ESC作为箭头键一部分发送的字符很容易与ESC手动键入混淆。
RBerteig

@RBerteig:很高兴知道。
LarsH 2013年

5

关于第二个问题:

[I]如果您不使用箭头键,如何在“插入”模式下移动光标?

对于一个熟练的人,因此不喜欢箭头键,“模式”的概念同样不存在。

主增加了使用不插入模式新的文本,而是完整的插入或更换命令与操作码如开始iocw后跟净荷文本,以及通过封端ESC。命令具有语法,因此机器在接受命令语法时会遍历状态,但是在编辑器的主人模型中,这些命令不会产生模式。学徒天真地称其为“模式”,对主人来说是未完成的命令状态,这是主人避免的最可恶的情况。

只要母版机意识到,在插入或替换命令的中间,必须在光标所指示的下一个字符位置之外插入或删除文本,母版机就会终止插入命令,并释放数十种有效命令之一运动命令(hjkl如果显然无法使用更强大的方法,则排序至最低级别)。

另外,由于母版很少分散注意力,以致无法完成命令,因此母版很少(如果有的话)会因输入多余的ESC“以防万一” 而使编辑器发出蜂鸣声。

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


2
请记住,如果vi的insert命令输入是模式,那么为了公平起见,我们必须在其他编辑器中识别所有此类模式,并将其称为模式。例如,当我们在Emacs中按Ctrl-X时,我们处于“模式”,例如,可以按Ctrl-S保存文档,但在该“模式”之外无法使用。
卡兹(Kaz)

5
  • 箭头键在某些环境下可能无法正常工作。hjkl是正常字符,各种终端都很好理解。
  • 您不要在“ 插入”模式下移动光标(“ 退格”和纠正短错字除外),vi的想法是进入“ 插入”模式只是为了输入内容。在正常模式下完成移动
  • 如果可以的话,应避免使用hjkl进行适当的移动,而应仅将它们用于指示。在vi中可以移动很多选项,请参见:http : //vim.wikia.com/wiki/Moving_around

实际上,您可以使用插入键在插入模式下(至少向左)移动光标。但我同意您不能随意移动它。
LarsH 2013年

我试图表示您根本不希望在“ 插入”模式下移动光标。
Squeezy

抱歉,我误解了您写的内容,说您不能在插入模式下移动光标。实际上,我确实希望在插入模式下移动光标:如果我输入了一些新文本,但是我按了错误的键,那么我想使用退格键来更正它。但是,除了这种有限的用途外,我同意。
LarsH

3

是的,出于上述许多原因,vi最初是为了使用hjkl而编写的,但是“ never ”是一个很大的声明。

我倾向于修改vim(以及使用的其他工具)使其表现出自己想要的效果。这在我的机器上效果很好,但是作为嵌入式开发人员,我并不总是能选择支持的机器上的功能。我碰到过一些旧机器,偶尔只有hjkl导航vi功能。我最终将控制代码插入到文件中了一两秒钟,直到我重新习惯了并切换到hjkl

我想出的唯一正当理由是“切勿在Vim中使用箭头键!” 这样您就可以使用无法处理箭头键的机器。说“ 永不 ” 是一个很小的理由。


3

如果不使用箭头键,如何在插入模式下移动光标?

我不鼓励人们使用箭头键的主要原因是明确的,因为它允许您在插入模式下四处移动。

对于初学者来说,学习vim的最奇怪的问题之一是vim的undo命令通过撤消上一个动作而不是最后一个击键来操作。我的许多朋友最终一直都处于插入模式,因为从来没有理由离开它。当他们问我“我如何撤消?” 我回答“从命令模式下敲击字母u”,当vim清除整个文件时,它们会感到沮丧。

“如果无法正确撤消操作,Vim是一个非常不值钱的文本编辑器。”

在了解如何之前,很难使用工具。

只有在您了解了如何使用Vim之后,Vim才变得有用。vim的力量在于您如何通过潜意识的肌肉记忆告诉它“再次执行该操作”或“撤消该操作”或“仅当我按下此宏热键时才执行该操作”。我同意,如果“那件事”变成“从头到尾键入整个文件”,vim根本没有用。

因此,您仅在进入时才应输入文本insert mode。避免使用箭头键只是我们发现的一种帮助您更快地成为更好的vim用户的方法。


0

在将vim封装到在kbox中运行ssh守护程序的Android设备中运行时,使我脱离了自己的舒适区。由于设备上的Anroid终端仿真器使用音量按钮来代替特殊的组合键(Ctrl +其他),因此在这种情况下,我通常会在键盘上使用的某些键不起作用。

例如,Insert键在这种环境下不起作用,因此我正在使用I切换到插入模式。我通常用来转义插入模式的Esc键也不起作用,所以我改用ctrl + [转义。Home和End键无法按我惯用的方式工作。相反,我依靠之前从未使用过的0$快捷方式来到达行的开头或结尾。

无论如何,箭头键在我的情况下仍然可以正常使用,但是很高兴知道那里有简约的键盘快捷键。


0

只需在写vim之前写以下命令:

  1. 退出
  2. :set nocp

一个问题是您可能必须每次都写它。


当您要在插入模式下使用箭头键时,这将非常有用
0decimal0

0

这是我的2美分。

做任何自己喜欢的事情。如果使用其他编辑器,使用箭头键可能会更容易保持一致性。

另一方面,vi(和vim)不需要任何特殊键,这也许是一件很了不起的事,除非也许。您可能会破解旧的IBM电器以充当终端。

需要注意的另一件事是箭头键可能无法按预期工作。我曾经在无法使用的终端上使用过。我不确定确切如何在Vim中实现它们,但是我很确定它不是统一的。我参差不齐的内存甚至似乎还记得一种实现,其中将它们实现为vim宏。


0

具有增强的文本编辑器的游戏的名称似乎是“匆忙移动”并减少浪费/重复的动作。还有一些时间,当你从字母键箭头键(取决于键盘的尺寸)移动丢失,比至原位行。但是,如果您可以用左手小指或无名指的切换方式进入ESC键,则该切换方式将成为一种流畅的动作,并且在编辑过程中,速度会有所提高。

这是问题第二部分的关键,通过用左键敲击ESC并用hjkl右移来退出插入模式。最终,您无需跳动就能做到这一点。

话虽如此,直到尝试了这里提到的一些事情之后,我才对Vim毫无所知,最重要的是“ 获取有效:快捷方式映射 ”部分

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.