BlockLune's Blog

首页 标签 关于 |

打破坏习惯,养成好习惯

发表于 2024-11-29
更新于 7 日内 vimtranslation

Habit breaking, habit making 一文的中文翻译,原作者是 Drew Neil。

使用方向键移动 Vim 光标是个坏习惯,而且像许多坏习惯一样,很难改掉!

在您的 vimrc 中加入下面这些内容,或许会所有帮助:

noremap <Up> <NOP>
noremap <Down> <NOP>
noremap <Left> <NOP>
noremap <Right> <NOP>

该代码段使每个方向键都不执行任何操作,换句话说,就是禁用它们。下次将手移到方向键上时,您会发现按下方向键后什么也不会发生。这就提醒您把手移回原处:在本位行(Home Row)上,hjkl 键正在等着您。或者,您也可以使用这个代码片段的 konami 代码版本。

学会在不离开本位行的情况下操作 Vim 是第一步。如果您还习惯于使用方向键移动,那么今天就应该禁用它们。

停止使用 hjkl

没有比一次移动一行或一列更慢的了。Vim 提供了数十种快速移动的动作,因此毫不夸张地说,按下 j 违反了 Vim 的精神

学习 Vim 并不像学习外语,增加一个单词就能增加更多的词汇量。掌握 Vim 的动作需要时间和练习,但每当您添加一个动作时,您都会发现它能为您节省时间和按键次数。

为了便于学习,我们假设使用 hjkl 是个坏习惯。在这种情况下,您应该在 vimrc 中加入以下代码段,禁用它们:

noremap h <NOP>
noremap j <NOP>
noremap k <NOP>
noremap l <NOP>

如果不能一次移动一行或一列,您就不得不使用其他动作来移动。如果您觉得这听起来很可怕,那么让我来介绍几个最有用的动作。学习这些动作并不需要花费很多精力,而回报却是巨大的。

使用以词为单位的移动比 hl 快 5 倍

wbege 命令允许我们向前或向后移动到单词(word)的开始或结束位置。WBEgE 命令则适用于 WORD(单词(word)和 WORD 的区别请参阅 :help word)。如果单词的平均长度是 5 个字母,那么每次前后移动一个单词的速度大约是使用 hl 移动一个字符的速度的五倍。

wb 加入到您的词库中。它们可以向前或向后移动到单词的开头。当您发现自己想要到达一个单词的结尾时,请将 ege 加入到您的词库中。

在一行内移动时,字符搜索是近乎即时的

fFtT;, 命令组成了一整套字符搜索动作。按 f{char} 时,Vim 会从光标位置向前查找当前行中出现的下一个 {char}。如果找到匹配,光标会直接移动到该处。 如果没有找到匹配项,则什么也不会发生。(Vim 可能会向您发出提示音,但您可以通过设置 visualbell 使其静音)。

试试这个方法:在 Vim 中,将光标移到一行有大量文字的开头。寻找一个出现频率较低的字符,如标点符号或大写字母。按下 f,然后按下所选字符。这是两个按键。您跳转到那个位置了吗?

如果光标停在了您要找的匹配对象之前,按 ; 可重复搜索。继续按 ; 直到找到目标。如果过了,按下 , 可以反向搜索。

对于不常见的字符,通常只需敲击两次键盘就能远距离击中目标。对于普通字符,这种方法就不那么容易击中目标了,所以要像 Scrabble 玩家一样思考!

字符搜索命令允许在当前行内进行有效导航。我经常使用它们!如果这些动作不在您的练习范围内,那么您就应该好好练习一下。字符搜索可以让您以接近思维的速度移动。

使用 hl 来处理差一错误

有时,我会不小心使用了 f{char},而本应使用 t{char},这让我离我想到达的位置相差了一个字符。或者,我可能会使用 f{char} 来瞄准一个不常见的字符,而这个字符与我实际想要击中的常见字符相邻。我把这些情况称为 “差一错误”。我认为它们是可以接受使用 hl 动作的少数情况之一。

使用 <NOP> 映射来改掉坏习惯

我并不是建议您永久禁用 hjkl 键。毕竟,它们对于纠正那些差一错误是必要的。但如果您今天的工作进展缓慢,那么在下午禁用 hjkl 会让事情变得更有趣。如果这能迫使您走出舒适区,鼓励您使用单词动作、字符搜索和其他动作,那么这也算是一种有益的练习。

试试困难模式

如果这听起来是个值得尝试的问题,您可能需要安装困难模式插件(我是从 Vim 伦敦会议的 Rob Miller 那里听说的)。它提供了一次性启用和禁用 hjkl 和方向键的便捷命令。为此,请在 Vim 中运行:

:call HardMode()

如果您觉得有点太难了,您可以通过运行以下命令来恢复正常:

:call EasyMode()