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


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

评论

对这个问题的历史回答很有趣。宗教异教徒则更少。

好问题。作为Dvorak键盘用户,这总是让我感到困惑[vi]!

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

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

这些年来,我养成了很多坏习惯。我认为我需要在非常缓慢的连接上使用它,以迫使我养成更好的习惯。

#1 楼

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

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

在正常模式下,有数百万种用于移动的快捷方式。您可以使用hjkl一次在一个空间内移动,也可以按单词,段落等移动。如果您处于普通模式,那么使用箭头键代替hjkl是没有意义的,因为它们距离较远。

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

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

String mystring = "I want to change this";


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

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

评论


@ ott-- ci <和ci)也可以工作,并且您不必将手从键盘移到鼠标。如果要导航到方括号的开头,然后更改内容f(ci(可以。

–马修·芬利(Matthew Finlay)
13年5月24日在1:28



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

–内森·朗(Nathan Long)
13年5月24日在10:30

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

–马修·斯科腾(Matthew Scouten)
13年5月24日在17:50



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

–院长
13年5月24日在18:01

坏习惯是一个很好的答案-但是强行阻止某人进行正常活动是法西斯主义者。更糟糕的是,(hjkl)的可用性:向上和向下映射到两个在垂直方向上无法区分的键,更不用说从左右键了.....这是意识形态盲目的傲慢的悲剧性展示。

–新亚历山大
2014年9月8日,下午1:52

#2 楼

按键位置

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




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


新习惯

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

资源和插入模式

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


您可以在此处阅读有关键位置的更多信息。
您可以阅读有关在以下过程中移动光标的信息在此处插入模式。


评论


更不用说hjkl键比将您的手移到箭头键更有效。

–sixtyfootersdude
13年5月23日在19:02

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

–马特斯曼
13年5月23日在20:50

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

– LarsH
13年5月23日在20:50

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

– LarsH
13年5月23日在21:16

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

–Étienne
13年5月23日在21:31

#3 楼

那些愚蠢的口头禅经常被那些触手可及的人重复,他们的主行就像第二根脊椎,或者被那些非触摸手法的人想要看起来很酷。对于非接触式打字员来说,居家排就不是那么特别,右手稍微移动以达到箭头根本就不是问题。

重要的是要考虑重复的人

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

如果我们不使用这些键是因为vi的作者使用的键盘没有物理的箭头键,因此反对该箭头键的任何论证只是合理化,那么hjkl只是反正比箭头好一点。是的,在箭头上使用hjkl的唯一好处是,您跳过了右手与箭头之间的微小移动。好处是否值得您麻烦。

但是右手的移动并不是为什么仅使用箭头效率不高的原因。它之所以效率低下,是因为它们会限制您逐字符和逐行移动,而编辑文本所需的大多数移动都具有很大的范围。

向右箭头打13次是低效而无聊。锤击l键13次更好吗?不会。这同样很愚蠢。

一直按住右箭头直到到达目标,这虽然没那么麻烦,但由于有必要且不确定地降低速度,因此容易出错,效率几乎与13次命中一样低结束。按住l键更好吗?不,当然不是。

值得庆幸的是,大多数GUI工具包都提供了诸如Ctrl+Right之类的组合,使我们可以逐单词移动或跳转到EOL,下一段或其他内容。这些快捷方式比单箭头帮助我们更快,更智能地导航。我们与hjkl是否相同?不,我们不。如果需要,我们可以使用计数,但是谁愿意为每个动作计数字符?在14k的帮助下进行relativenumber很棒,但是水平运动呢?对于较大的运动,hjkl实际上比修饰符+箭头更糟糕。你猜怎么着?大运动是我们最需要的。

但是我们是幸运的混蛋,我们最喜欢的编辑器有数十种运动,它们围绕箭头和hjklbBeEwW/?*#{}()等圆圈。这些命令比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替换箭头?
/>
I.有。不能。

总而言之,hjkl在我们的工具栏中占有一席之地,因为我们总是必须移动2个字符或2行,但它们通常不是隐藏森林的树。要警惕那些鼓吹箭头的人:他们为您准备的东西可能根本无法改善。

评论


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

– Xavier T.
13年5月24日在8:52



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

– romainl
13年5月24日在9:43



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

– UncleZeiv
13年5月24日在17:43

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

–Aviator45003
2014年8月4日19:27

@ T.C。有没有使整个辩论更加有趣的例子?

– romainl
2014年8月4日19:56

#4 楼

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

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

ESC [ A


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

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

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

#5 楼

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

评论


哇。认真吗我不想相信这一点,因为这暗示着设计Vim的人们会认为他们的用户花更多的时间在打字上而不是在思考。

–Dogbert
13年5月23日在17:27

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

– EBGreen
13年5月23日在17:41

好吧,当我不得不在学校这样做时,您必须先按esc键,然后才能使用hjkl导航,因此您已经从主行上移开了左手,以使小指达到Esc。我记得要返回一个空格并插入一个字符,您必须输入'Esc:h i',然后键入要插入的字符。那不是那么有用。

–弗兰克·托马斯(Frank Thomas)
13年5月23日在18:58

@Renan-您假设“键入”的意思是“插入文本”。在阅读和思考时,我的手指也放在主页上,因为键盘是我在Vim中导航的方式:搜索以移动,打开其他文件以比较代码,四处跳动以纠正拼写错误等。

–内森·朗(Nathan Long)
13年5月24日在10:33

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

–内森·朗(Nathan Long)
13年5月24日在12:53



#6 楼

箭头键在速度较慢的连接(例如1200波特调制解调器)上会出现问题-在vi中已经知道。箭头翻译为ESC序列,例如ESC a。现在,当ESC和a之间的时间过长时,您最终会听到BEL(或看到闪光),然后听到追加模式。使用hjkl键将不会显示此键。

评论


我认为ESC [您是指什么?

– LarsH
13年5月23日在21:03



ESC [A是DEC VT-100端子(ANSI端子是DEC VT-100的强导数)箭头。 IIRC,ESC A是ADM-3A箭头,或者是DEC VT-52箭头。该点保持不变,但是,作为箭头键一部分发送的ESC字符很容易与手动键入的ESC混淆。

– RBerteig
13年5月23日在22:12

@RBerteig:很高兴知道。

– LarsH
13年5月25日下午5:46

#7 楼

关于第二个问题:


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


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

主人添加了新文本不使用插入模式,而是使用完整的插入或替换命令,这些命令以诸如iocw之类的操作码开头,后跟有效载荷文本,并以ESC终止。命令具有语法,因此机器在接受命令语法时会遍历状态,但是在编辑器的主人模型中,这些命令不会产生模式。学徒天真地称其为“模式”,是指主人未完成的命令状态,这是主人避免的最讨厌的情况。

每当主人意识到时,在插入或替换命令中间,则必须在光标所指示的下一个字符位置以外的位置插入或删除文本,主机终止插入命令,并释放数十种有效的移动命令之一(如果需要的话,重新排列为低调的hjkl)强大的方法显然并不适用。)

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

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

评论


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

–卡兹
13年5月24日在3:45

#8 楼


箭头键在某些环境下可能无法正常工作。 hjkl是普通字符,各种终端都易于理解。
不要在插入模式下移动光标(退格键和纠正短错字除外),vi的想法是进入插入模式仅要输入的东西。可以在普通模式下进行移动

如果可以的话,应避免使用hjkl进行适当的移动,而只能将它们用作方向。在vi中可以移动的选项很多,请参见:http://vim.wikia.com/wiki/Moving_around



评论


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

– LarsH
13年5月23日在20:57

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

–紧缩
13年5月23日在21:49



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

– LarsH
13年5月24日在2:46

#9 楼

是的,由于上述许多原因,vi最初被编写为使用hjkl,但“从不”是一个很大的声明。

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

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

#10 楼


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


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

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

“ Vim是一个非常有价值的文本编辑器,如果它不能正确撤消操作的话。”

在学习如何使用之前很难使用工具。

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

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

#11 楼

这是我的2美分。

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

另一方面,vi(和vim)不需要任何特殊的键是非常好的,除非也许。您可能会破解旧的IBM selectric来充当终端。

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

#12 楼

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

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

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

#13 楼

只需在vim中编写以下命令即可:-


esc
:set nocp

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

评论


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

– 0decimal0
13年5月25日在14:31

#14 楼

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

这就是问题第二部分的关键,用左键按下ESC退出,然后用hjkl右键退出,退出插入模式。最终,您无需跳动就能做到这一点。

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