Skip to content

Cli Editing

前两天看到这条带图片的tweet,可视化非常好,从moving和erasing两方面展示了快捷操作。1

当然作为一个vim用户,我就自己写了下对应的操作,当然也是花了点时间又了解了下相近命令的不同效果。 看完GNU 的文档后我甚至秉着打破砂锅问到底的原则还又去stackoverflow问了个比较傻的问题

然而没过多久,那条tweet的评论下就出现了vim用户的回复,这个图就做得更好了。2

emacs mode

vi mode

看到如此优美的图,你估计不想看下面的文字了。3

Commandline Editing

vi模式设置方式
echo 'set editing-mode vi' >> ~/.inputrc
echo 'export EDITOR="vim"' >> ~/.bashrc
echo 'set -o vi' >> ~/.bashrc
echo 'bind -v' >> ~/.editrc

默认的emacs模式我已经打算不用了,表中虽然也列出了部分,但可能存在错误,欢迎评论指正和补充。

vi emacs
moving forward l Ctrl-F
backward h Ctrl-B
begin of line ^ Ctrl-A
end of line $ Ctrl-E
begin of current word b Alt-B
end of current word e,E Alt-F
start of next word w,W Alt-F
end of previous word ge
next of char x tx,fx
erasing to end of line d$,D 8 Ctrl-K
from begin of line d0,d^ 4 Ctrl-U
to end of current world de,dE
from begin of current word db 5 Ctrl-W
current word diw,diW 6 Alt-D
to begin of next word dw,dW Alt-D
clear current line S
current char s,r,x
next of char x dtx,dfx

还有部分操作,比如 i, I(行首添加), a, A(行末添加), xp(x + p,交换当前和下一个字符),也可以多试试。

在编辑长的复杂命令时,可以使用edit-and-execute-command的快捷键Ctrl+X, Ctrl+E启动EDITOR进入编辑模式,输入fc(fix command)也达到同样效果。7

强烈建议阅读系列文章 Unix as IDE,中文版:Unix 即集成开发环境

History Expansion

如果你看到过别人执行 !-3:gs/foo/bar/ 或者 cd !$:h ,觉得很难理解。但是如果你看了History Expansion这个章节,就一点也不纳闷了。

主要是冒号分隔的三部分: event designator, word designator 和 modifier。冒号有时可以省略。10

Event Designator

是指定哪条历史命令,形式为![!|[?]string[?]|[-]number],例如!-3制定历史倒数第三条命令。

Example

!! 上一条命令 !-1
!299 第299条历史命令
!foo 上一条以foo开头的命令
!?foo 上一条包含foo的命令 类似!?foo?

Word Designator

用来选择命令中单词,形式为::[n|x-y|^|$|*|n*|n-|%],比如 !!:$ 就是指定上条命令的最后一个参数。

Example

!$ 上一条命令最后一个参数 !:$!!:$
!^ 上一条命令第一个参数 !!:^
!* 上一条命令所有参数 !!:*!!:1-$
!:2* 上一条命令第二个到结尾的所有参数 !!:2-$
!:2- 上一条命令第二个到结尾的所有参数(不包含最后一个)

Modifier

对单词进行修改,形式为::[h|t|r|e|p|s|g|x],比如 cd !!:$:h 进入上一条命令最后一个参数的目录。9

Example

!$:h 获取上一条命令最后一个参数的目录名
!$:t 获取上一条命令最后一个参数的文件名
!ps:p 打印上一条以ps开头的命令
!:gs/foo/bar 将上一条命令中的foo全部替换为bar !!:gs/foo/bar
^foo^bar^ 为上一命令的缩写形式
^string 将上一命令中的第一个foo删除 !!:s/strinng//

Tip

在看linuxtoy的演示10时,我很好奇,每次并不是马上执行,而是会先打印出来,然后再执行。搜索下,发现是设置了bash shopt -s histverify

本文图片均来源为相应文章,在此对作者表示感谢,本文引用只是为了存档,版权归原作者,如有侵权请联系我。


  1. 当然你如果同我一样好奇monfichier是什么,那我直接告诉你好了,法语的myfile。 

  2. 竟然还有SVG格式的,作者太专业了。 

  3. 文章地址分别为 Moving efficiently in the CLIMoving efficiently on the command line。 

  4. 编辑时d可以用c替代。 

  5. 默认为空格,但是可以通过bind指令设置为其他字符Is it possible to configure ctrl-w (delete word)?。 

  6. chanage in word的缩写,关于text object的详细帮助,可以输入 :help objects。 

  7. 更详细说明可以参考Command line editing。 

  8. D会将删除的顺便拷贝下来,下次可以通过p粘贴。 

  9. 实际上你可以简写成 !$:h。 

  10. 参考自 高效使用Linux命令行。 

Comments