您的位置:首页 > 运维架构 > Shell

非程序员的GNU Emacs使用心得......Shell Mode 第6集 命令行缩写

2010-08-10 11:28 211 查看
缩写是个好东西。生活中的很多地方人们都喜欢用缩写,又省时来又省力。Bash 也有自己形式的缩写,就是 alias,但是用
alias总有很多不能如愿的地方。怎么不如愿呢?前文我们常说的那些个大量机器,复杂系统,大量 profile
这样的问题我们以后就不再重复了,经过前面那些文章的解释,相信大家应该已经都很熟悉了。现在我在这里讲一些对多数人来说都很现实的问题,即便是在自己的
机器上面工作。

在还没有大量使用 Emacs 的时候,一直有一个让我很郁闷的问题,是什么呢?就是你定义了一个 alias
了之后呢,每次运行这条命令的时候,就只需要输入这个 alias 的名字,然后回车,这个命令就被 bash
解释并运行了。看到这里的时候,有没有人想到了我说的问题究竟是什么?没想到吧?就是你没有机会替换,或者增减参数!定义了以后就是死的了!在前文里面我
多次说过了,实际工作中面对的很多命令都是大同小异的,如果要给每一个稍有不同的命令都定义一个
alias,先不说定义的时候有多麻烦,就是你能不能把他们都记在心里都是个问题。这样的状况也太糟糕了吧。。。

算了还是回到 Emacs 的 shell-mode 里面过两天清净日子吧。呵呵。


个玩笑了。在 Emacs 的 shell-mode 里面,我们不再使用 Bash 的 alias 来进行命令的缩写,而是使用 Emacs 本身的
abbrev 功能,将常用的命令定义成 abbreviation。这些 abbreviation 在我们在 shell-buffer
当中输入命令的时候,会像在其他 buffer 里面的文字编辑一样,扩展成我们所需要的命令内容。因为这个过程是完全发生在 Emacs 的
shell-buffer 里面的,所以在敲下回车将这条命令发送给 shell
的时候,我们可以进行任意的修改。让我们看一个实际的例子吧,下面是我的工作当中非常常用的一个缩写,叫做 strma ,这个缩写扩展之后是一条这样的命令

bin/itmcmd agent start


得注意的是这个不是一条完整的命令,它只是一个命令片段,在这个时候直接回车是不能够成功执行的。这个正是 Emacs abbrev 和 Bash
alias
最明显的区别。通常在我使用这个缩写的时候,我的目的都是为了在这个片段的基础上,再加上各种不同的参数,最终变成一条适合特定需要的特定的命令。下面再
让我们来看一看这个缩写最终会扩展成为什么样的一些命令

bin/itmcmd agent start mc

bin/itmcmd agent -o QMA,QMB,QMC start mq

bin/itmcmd agent start lz sy hd cq qi

与此相对应的,还有一条非常常用的命令缩写,stpma,这个缩写扩展至后是这样一条命令

bin/itmcmd agent stop

这同样只是一个命令的片段。在实际使用的过程中这个片段会被填充成这样的一些命令

bin/itmcmd agent stop mc

bin/itmcmd agent -o QMA,QMB,QMC stop mq

bin/itmcmd agent stop lz sy hd cq qi


么样?不错吧?只需要记忆很少的命令缩写,就可以轻松搞定各种不同的命令,这是 Bash 的 alias 所完全无法做到的。 并且在 Emacs
里面还可以把这些命令缩写定义成只在 shell-mode 里可用,这样同样的缩写名称就可以在别的 mode
里面扩展成其他的内容。毕竟,字母虽多,形象好记的组合并不很多。是不是呢?

那么这个 abbev 有没有自己的问题呢?其实也有。abbrev 扩展以后,在她的后面添砖加瓦是很顺手的,但是如果中间的部分需要替换,那就很麻烦了。每天无数次的扩展一条命令,再把光标向前移动、移动、移动、移动,也是一件很郁闷的事情。

解决这个问题,Emacs 还提供了一个 skeleton 的功能。skeleton 本身是一个非常强大的功能,在这里我们只用一个最最简单的部分,就是定义一个 abbrev 的同时,可以自定义扩展之后光标的位置。

比如说有这样一条命令

bin/itmcmd support -t
tivvm273 -s NEW sy hd lz ux nt m6 mq mc
qi

日常使用的时候,每次不同的部分就是中间的 tivvm273
这样的主机名,其他的地方都一模一样。这样的命令要是简单的作为 abbrev 扩展以后,再把光标从 qi 后面一路迁移到 -t
后面,那还不得麻烦死。在这个时候就可以定义一个 skeleton,规定扩展完毕之后,光标位置就定位在 -t 的后面,这样就直接输入主机名就 OK
了。这样就舒服了吧?



大家注意了吗?上面代码里面的下划线那个位置,就是扩展之后光标的位置,非常形象吧?这样每次只要输入 addappsupport 就可以扩展成这样一条命令,并把光标自动定位到 -t 参数的后面。

bin/itmcmd support -t -s NEW sy hd lz ux nt m6 mq mc qi

最后再罗嗦一句,记得前段时间在网上查 alias 的时候,貌似看到 Bash 的文档里面提到现在推荐大家多用 function 来代替
alias功能。想想也是,alias 定义的局限性实在是太大了。但是换用 function 呢?虽然灵活的多了,但是相对 alias
定义的快速高效来说,又实在是复杂的多了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: