Dr Hjkl 在命令行
我第一次使用 vi 是在大学的编程课程中。它是计算机实验室的 UNIX 系统上的默认编辑器,我们用它来编译作业。我记得我们的教授第一次介绍 vi,并解释说你使用 hjkl 键来移动光标,而不是方向键。在此之前,我是一个 pico 用户(现在这有点暴露年龄了),而且 vi 使用 hjkl 而不是方向键,这在我看来是如此落后。
直到我成为 vim 的重度用户,我才开始体会到导航键出现在主行上所带来的速度提升。作为一个盲打者,我意识到与 hjkl 相比,方向键位于远离主行的无人区,即使 vim 支持方向键,我也使用 hjkl 代替。我很高兴地发现许多不同的程序也支持相同级别的按键绑定。
多年来,我在Linux Journal上写过几篇与此相关的专栏文章(标题都带有 Dr Hjkl),在这里,我决定复活 Dr Hjkl,再来一轮节省时间的命令行导航技巧,这些技巧将帮助你保持双手在主行上,远离那些方向键。
我在这篇文章中的大多数技巧都是关于减少你对方向键的依赖,并提高你在命令行上的速度。多年来,每当我发现我输入的命令有错误时,我都会做两件事之一:使用 Home、End 和方向键(都离主行太远了)的组合将光标移回错误处,以便我可以修复它,或者有时我发现按 Ctrl-C 并重新输入整个命令会更快。有一天,我看到另一位 Linux 用户在命令行上快速地来回跳动单词,我意识到有更好的方法。
在单词之间移动第一个简单的速度提升是使用 Alt-b 和 Alt-f 在命令行上向后或向前移动一个单词。这有点像 vi 中的 b 和 w 键,可以在单词之间跳过,而不是一次一个字母。Alt-b 的行为就像 vim 中的 b 一样。按下 Alt-b,光标将向后移动一个单词,并停留在前一个单词的第一个字母上。Alt-f 略有不同;光标向前移动,直到停留在单词之间的空格处,而不是在下一个单词的开头。所以给定以下命令
ls -l /var/log
如果我的光标在行尾,我按下 Alt-b,它现在将位于 log 中的 l 上。如果我再次按下它,它将移动到 var 中的 v。如果我的光标在行首,我按下 Alt-f,它将停留在 ls 和 -l 之间的空格上。这让我很恼火,以至于我经常发现自己向前移动一个额外的单词,然后再按 Alt-b,以便光标位于我想要的位置。即使它比右方向键需要更多的击键次数,它也能让我的手保持在主行上。或者(正如你稍后将看到的),我可以简单地按 Ctrl-f 向前移动一个额外的字母。
删除单词我在命令行上使用 Alt-b 和 Alt-f 的大部分时间是为了纠正行首的拼写错误。现在,你当然可以将光标移动到正确的位置,然后使用 Delete 或 Backspace 来删除错误,但对于小错误,我发现删除整个单词并重新输入会更快得多。在 vim 中,我会输入 cw 来更改光标下的单词,或者一个稍慢的方法是输入 dw 来删除单词,然后进入插入模式进行更改。在命令行上,你可以使用 Alt-d 复制 dw 的行为。Alt-d 键将完全删除光标下的单词,以便你可以重新输入它。所以,以上面的例子为例
ls -l /var/log
如果我的光标在行尾,并且我意识到我想将 -l
更改为 -ltr
,我会按三次 Alt-b 将其移动到 -l 中的 l 上,然后我会按 Alt-d 删除 l,最后输入 ltr。
事实证明,方向键并不是唯一的目标。Home 和 End 虽然有用,但也位于远离主行的无人区。在 vi 中,你只需使用 ^ 或 $ 即可转到行首或行尾。在命令行上,你可以分别用 Ctrl-a 和 Ctrl-e 替换 Home 和 End。如果你使用带有 screen 键绑定的 screen 或 tmux,你就会知道 Ctrl-a 已经被调用了,所以你需要按 Ctrl-a a 将 Ctrl-a 发送到命令行。当你意识到你需要通过一些你已经输入的内容来管道传输一些初始命令时,Ctrl-a 特别有用,而 Ctrl-e 在你编辑了中间的某个位置后,移动回行尾以完成你的命令时很有用。
一些最后的快捷方式虽然上面的快捷方式足以入门,但在我结束之前,我想重点介绍一些不太有用但同样值得了解的额外快捷方式。首先,虽然 Alt-b 和 Alt-f 分别向后和向前移动一个单词,但它们的对应项 Ctrl-b 和 Ctrl-f 将向后和向前移动一个字母。稍微不太有用,但仍然有趣的是,你可以使用 Alt-u 将光标下的整个单词大写,Alt-l 将单词小写,以及 Alt-c 将单词的第一个字母大写。
有了所有这些技巧,我建议在你的电脑上的某个地方发布一个提醒给自己。将这样的新习惯融入你的命令行使用可能需要几周时间,但一旦你习惯了它,你就不会再回头了。我发现这些快捷方式也适用于像 Irssi 这样的命令行客户端,所以如果我注意到我在 IRC 中要说的内容中有一个错别字,我可以只按 Alt-b 直到它在光标下,然后按 Alt-d 删除它,然后纠正错误并按 Enter。