我禁用了箭头键,终于适应了hjkl(在最长的时间里,我总是以错误的方式敲击j和k-出于某种原因看起来更自然)。在正常模式下,我可以使用它,但是不能在插入模式下移动光标会杀死我。

我经常想对彼此附近的几行进行简短的更改。以前这是一个轻而易举的事,只需要轻按几下箭头键,但是不得不离开插入模式,先移动然后重新进入插入模式是非常繁琐的-这意味着我最终只能拿到鼠标了,这不是我们要做的重新瞄准vim!

您有什么解决方案?

评论

这是一个严重的问题(我的意图不是粗鲁):鉴于使用它们使您更轻松,为什么决定在插入模式下禁用箭头键?

@Rich,因为如果要相信互联网,从长远来看,一旦您克服了陡峭的学习曲线,最好不要使用箭头键。反正很多人都这样说。

至于您对我的其他问题的回答,您不应该相信在互联网上阅读的所有内容;)。您还可以在互联网上找到许多(非常有经验的)Vim倡导者,说您应该为自己做任何事情。如果您当前使用箭头键的工作流已经“轻而易举”,那么改进将从何而来?在那种情况下,教条式拒绝使用箭头键似乎只是无缘无故拖慢了自己。

回复:因为如果要相信互联网,从长远来看,一旦您克服了陡峭的学习曲线,最好不要使用箭头键。无论如何,还是有很多人指出:这是由Vim纯粹主义者传播的废话,他们持误导的观点,有一种使用True的方式来使用Vim(即,他们喜欢的方式)。如果您喜欢箭头键:请使用它们。如果您不这样做,那就不要。就这么简单。

我有信心,当铁工具开始取代青铜时,有一些“青铜主义者”声称铁工具很坏,如果在雨中将其遗弃会生锈,从而导致石头开裂和裂开,而较软的青铜工具不会这样做等等。(我听说神喜欢青铜工具的使用者,因为它们是公义的和肮脏的,用铁弄脏自己的亵渎者将遭受永恒的schmutz等,但是我不这样做。不知道,但是很多人在说... :-)

#1 楼

我相信Vim的艺术与禁止使用任何可用的工具无关,而是找到了最佳(即最有效)的方式来更改文本。事实是,有时箭头键确实是最有效的。在需要进行一些小的插入模式更改并散布着几个小的导航的情况下,尤其如此。快速:使用箭头键(插入模式)



慢:使用HJKL导航(普通模式)



在这里使用箭头键显然更快。退出和重新进入插入模式不仅需要花费额外的击键,而且还要求用户重置其左手位置。添加不同的字符集(也许更注重右手)可能会改变结果,但我相信效果会是相似的。

速度慢:使用箭头键(插入模式)



快速:使用HJKL导航(普通模式)



归根结底,我们所能做的就是近似最快的路径。通常,最好不要使用箭头键,这就是Vim发光的地方-我们所有人可以共享无数的技巧和工具来进行正常模式操作。但是,有时候,没有什么比箭头键更好的了。

评论


欢迎来到Vi和Vim!感谢您抽出宝贵的时间来写一个非常体贴的答案!

–filbranden♦
20年6月12日在22:00

太好了

–丰富
20年6月12日在23:54

这是一个很好的答案,但是我不同意手的位置:使用箭头键还需要重置手,因此建议您避免使用它们。避免所有手从原位移动的解决方案是在插入模式下将不太可能的一对绑定到esc(例如kj或jj)。在您的第一个示例中,箭头键每次编辑仍会赢得一个键。

–kitsu.eb
20年6月15日在14:38

在第一个示例中,可以切换到普通模式进行以下操作:,然后使用切换到下一行的第一个字符,然后在所需位置返回插入模式以输入字母。

–艾瓦尔·帕尔伯格(Aivar Paalberg)
20 Jun 18'在6:43



关于第一个例子,如果您要记住要输入的字符,请确定。如果涉及到任何思考时间,或者您要从某个来源复制内容,那么它不会比其他方法快得多。顺便说一句,我想我会以将其变成您的第二个示例的方式来处理该示例。就是请使用} 0Ix或其他方法插入虚拟字符,然后从该位置重复插入rXj(X是当前行中的任何字符)。这听起来可能很疯狂,但是当第一部分是本能的时候,它就会起作用。 :)

– B层
20年6月23日在20:42

#2 楼

我的解决方案是使用vim提供的所有功能:HJKL,/,FftT,{n} w / b / e,^,$,%,[],] [,[{以及箭头键,控制箭头键,home ,结束,Pg向上和向下,鼠标...

箭头键和hjkl在移动时都效率低下。如果只需要移动几个字符或一行,那么它们是完美的。对于更多,Vim具有更好的解决方案。他们随着时间而来。

尝试考虑要做什么:移至下一个Word,即当前函数的开头...而不是移至用眼睛看到的位置。

评论


我在正常模式下导航没有问题-我不是上帝,但我肯定会使用比hjkl更多的东西。这是事实,如果没有箭头键,则必须先退出插入模式才能导航。那就是我所苦的。我已经将jk(和kj)重新映射为esc,现在已经习惯了,但是要向下移动一行并向右移动三个字符,我必须按jkjlllli,而不仅仅是 <对>。感觉效率低下。 8次按键与4。

– Codemonkey
20 Jun 12'在11:18



老实说,我从来没有理解过“不要使用箭头”的诫命。相反,我使用vi然后使用vim已经超过25年了,但是我很少使用hjkl。我觉得自己的效率没有我能做到的低。在您在此描述的用例中,我会(正常模式下)使用down + F {key see I see}

–卢克·赫米特(Luc Hermitte)
20 Jun 12'11:34



@Codemonkey。击键次数并不是快速编辑的唯一方面。恕我直言,更重要的是时间。坦白讲,在您的示例中,您有4个按键和2个手势(从底部到箭头再向后移动),对我来说要慢得多,然后再按8个最近的按键。我使用inoremap 向前移动1键,而没有离开插入模式和更多技巧,这有时会有所帮助。是的,在某些情况下,我仍然使用箭头,例如Cmdline模式下的向上箭头搜索以我键入的字符串开头的命令,并使用鼠标调整窗口大小。每个工具最擅长某些任务,不要局限自己=)

–德米特里
20 Jun 12 '21:25



在插入模式下移动ctrl-etc键重新映射是一个好主意,我觉得我应该想到这一点!在这里给出其他所有人的评论和答案...我可能只是回到箭头键。

– Codemonkey
20年6月14日在13:16

#3 楼

通常,我会尽量避免插入模式。 (事实上​​,我在评论中提到了这一点。)大多数时候,对于我对附近的行进行的许多小修改,我都会努力只进入一次插入模式。

对于您给出的示例在连续两个行上将getVal更改为get_val,光标从第一个编辑点开始很远,实际上,我最有可能做的是:



位置。

/getVal<CR>进行编辑。 ciwget_val的击键次数较少,但对我而言实际上不会更快地键入,并且这也将阻止我仅使用...进行下一行的编辑。



如果光标在编辑点之后而不是之前开始,则在步骤1中用fVsv_代替n.

如果光标开始于编辑点附近,我将使用其他最快的动作(希望它不包括?)到达那里,然后按/设置搜索寄存器(不移动光标,因为将hjkl映射到*),然后继续执行步骤2和3。

评论


在这种情况下,cgn甚至更好,因为您只需按。

– D. Ben Knoble♦
20年6月12日在16:32

@ D.BenKnoble是的。由于某些原因,cnn从来没有点击过我。 ¯\ _(ツ)_ /¯

–丰富
20 Jun 14'10:01



#4 楼

这个答案可能无法涵盖所有​​您看到自己在同一行的不同位置上进行许多小的编辑的所有情况,但是我发现这里的一个好方法是尝试将它们从许多单独的小插入变为正常模式操作。

这通常意味着采用插件来实现更复杂的操作,或者采用高级文本对象来帮助选择要执行的正确文本。

在注释中,您提到了将getVal替换为get_val的重构。插件vim-abolish在cr下具有“强制”操作以进行大小写强制,使用crs将对当前单词执行大小写强制以使大小写变为蛇形,这就是您要执行的转换。 (cr_也有效。)

另一种重构类型通常是在文本中加上花括号或括号,该重构通常涉及散布在运动中的小修改。插件vim-surround可以帮助您解决此问题。您可以使用ys包围文本,例如ys"iw可以在当前单词周围加上双引号。或替换括号类型,cs])用括号替换方括号。您还可以使用可视模式选择要包围的文本。对于高级文本对象,我建议使用targets.vim,它为函数的参数引入了一些有用的文本对象,这些对象在重构时也非常有用码。它还引入了“下一个”(n)和“最后一个”(l,更像是“上一个”)文本对象的修饰符,因此您可以在行中做进一步的操作。如果您位于函数调用或函数调用的顶部,请删除“ next”参数。插件target.vim包含许多其他有用的文本对象,并且还扩展了Vim中的一些内置文本对象,使它们更智能。

确保您还具有vim-repeat,这将允许您使用dana重复执行来自vim-abolish和vim-surround之类的插件的操作(在许多其他应用程序中),如果您在许多单独的行或匹配项。 。

评论


和宏,/ search cgn和所有好东西:)如果我有时间,这就是id所写的内容

– D. Ben Knoble♦
20年6月12日在16:29

#5 楼

人们总是认为禁用箭头键的建议是让您改为使用hjkl,但实际上,这样一来,您通常会习惯于使用普通模式。普通模式是您获得所有效率增益的地方。

正如其他人指出的那样,是的,在某些情况下,箭头键的速度比使用普通模式移动一个正方形要快,但是大多数情况,您不会只移动一个正方形。强迫您进入正常模式有望鼓励您学习和使用那些适用于线条,文字,标记和图案的快捷方式。 。您似乎总是会呆在里面,偶尔您会发现,仅按下箭头键会更快。那就是我建议重新启用箭头键的时候。

话说回来,最终您可以学习和使用该工具。请注意,最快的Vimmer通常在正常模式下。

#6 楼


不得不离开插入模式,然后移动然后重新进入插入模式非常繁琐。


我想大部分繁琐的部分都将离开插入模式,这意味着要达到Esc键。就我个人而言,我将CapsLock映射到Esc(使用setxkbmap -option caps:escape),但是有多种选择,例如将jj映射为退出插入模式等。

我实际上进行了必要的切换,并且看不到这是一个麻烦。这是因为我正在考虑一系列操作,而我的手指只是平移。让我举一个例子。假设我要


调用foo

将其传递给对象
使其成为多行对象
将其传递给bar字段值"baz"


我不foo({ EnterTab bar: "baz" EnterBackspace })

我这样做: /> foo() Caps(调用foo

i{} Caps(将其传递给对象)

i EnterCaps(使其成为多行对象*)

ko选项卡bar: ""上限(添加字段bar)**

ibaz上限(值"baz"

我认为我不觉得这很麻烦,因为: >

通过使用盖帽,我使退出插入模式更加容易。在QWERTY键盘上彼此连接。这也使我在键入字符串时连续两次敲击"。它限制了我需要从输入单词切换到“怪异”键的次数。 。就像它使键入变得更容易组合。我认为这可以让我在编辑文本时更好地利用肌肉记忆。

*从一开始就知道我需要多行对象时,我将直接输入{。由于这是一件很普通的事情,而且按键之间非常接近,因此它已经存在于我的肌肉记忆中。如果我一开始不确定,或者键是否不同,我会像上面列出的那样进行操作。 ,所以发生了奇怪的事情。

#7 楼

我有一个非标准的解决方案,不需要经常按esc键:
将Map设为插入模式,然后输入并离开。
如果我需要插入`,我为此映射了(稀有)ctrl-]
对于`在正常模式下,我映射了!(因为通常不需要shift-1就可以了)
而ctrl-`则表示ctrl-o进行了快速移动。

我还有另一种解决方案,可以在超时时保留插入模式,但发现它没有用。

#8 楼

我经常使用箭头键,但是将它们反弹以自动退出插入模式,如下所示。以我的经验,当您知道自己所处的模式时,使用hjkl快速导航;当您不确定插入模式时,请使用箭头键导航。

inoremap <left>  <esc>
inoremap <up>    <esc><up>
inoremap <down>  <esc><down>
inoremap <right> <esc>l


总体而言,它非常方便,并且可以凭直觉很好地工作。但是,这确实使使用可视块模式更加烦人,因为在为I nsert或A ppend创建少量文本时,您的导航选项受到更大的限制。