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

缩写是个好东西。生活中的很多地方人们都喜欢用缩写,又省时来又省力。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 定义的快速高效来说,又实在是复杂的多了。

posted on   David Young 杨博华  阅读(1304)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
< 2010年8月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 1 2 3 4
5 6 7 8 9 10 11

导航

统计

点击右上角即可分享
微信分享提示