本文介绍的技巧可能已经为大家所知,但若能充分使用则可大大提高工作效率。如果你已经可以熟练操作vi,可直接跳至本文后半部分,因为本文不是关于vi的介绍,但这个技巧与vi相关,所以挑关联度大的部分简单介绍一下。
在vi中操作时,通过方向键可以上下左右移动光标来到指定位置进行编辑。 但若要快速到达指定位置,则需要在命令模式下使用更丰富的命令。 例如,可以使用简单的/搜索命令。此外,还有一些与之相关的命令(多个命令用\分隔):
-
h\j\k\l命令可使光标向左\下\上\右移动;加数字则可指定移动单位的数量,如9j表示向下移动9行;
-
w\b命令可使光标向右\左跳过一个单词,同样命令前可加数字;
-
^$命令可使光标跳到行首\行尾,与正则表达式中匹配行首和行尾的符号相同;
-
i\r\R命令可进入插入模式或替换模式,以及一些其它命令也可进入编辑模式;
-
x\X命令可删除光标位置的字符或光标前面的字符,命令前面也可以加数字;
-
dd\D命令可整行删除\删除光标位置及之后的内容。
现在进入正题,vi和Shell命令行技巧有什么关系呢?我们都知道Shell有一个history,即我们执行过的Shell命令历史记录。在日常工作中,很多命令需要反复执行,或者稍加修改后再次执行。将这个历史记录当成当前在vi里面编辑的内容,命令行显示的内容就是当前光标所在的行。利用本文前半部分提到的vi命令,就可以快速地在Shell命令行中查找、编辑,然后再次执行之前执行过的命令。在命令行执行set -o vi(通常是将这个命令设置到.bashrc中让其自动生效),即可打开命令行的vi选项。接下来,可以在命令行按照以下说明使用该技巧:
-
按Esc键进入命令模式;
-
输入/xxx并按回车键,以查找包含xxx的命令;
-
使用n\N命令查找下一个\上一个命令;
-
按回车键执行命令,或者移动光标到指定位置修改后再执行。
如果未找到合适的历史记录,或者需要重新输入命令,不用花时间去删除当前内容,可按 Ctrl + c 快速放弃该行,以新启一行重新输入。
使用vi模式时,初学者可能会感到有些不习惯,因为命令模式和编辑模式容易混淆。在命令模式下,不能随意输入,而在编辑模式下,不能执行所想的命令。不过,多加练习后,你会逐渐熟悉这种操作方式并喜欢上它。