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

非程序员的GNU Emacs使用心得...... Shell Mode 第5集 历史命令杂谈

2010-08-09 22:59 381 查看
这是一些比较杂乱的小东西们,任何一个都没有办法独立成节,就把他们凑在一起罗嗦一下吧。按说这些乱七八糟的小东西们应该放到最后弄一个类似杂物箱之类的章节,但是鉴于这些乱七八糟的内容多数还是和历史命令相关的东西,想想还是放到一起来说一下吧。

在上一节历史命令编辑里面提到了两种命令的重复,一种是在复杂应用程序的不同实例之间的重复,另一种则是复杂的命令在不同的系统,不同的机器之间的重复。这后一种命令的重复使用 Bash 的历史命令功能可就彻底的鞭长莫及了。毕竟 Shell 就是再强大,也只能做用在一台机器的一个session范围之内。事实上即便是在一台机器上面,只要是在不同的 Shell session 之间,Bash 的历史命令功能就已经变得无能为力了。

那该怎么办呢?其实并没有什么困难的。对很多人来说这都不是个问题,命令只要在 X Window 的不同 terminal 之间拷来拷去其实就OK了嘛。看起来很简单。但是,对我来说,这种无数次的拷贝粘贴本身就是一个大问题。你没有必要非得同意我的观点,但是请想一想那日复一日庞大的数量,你就会多少体会到一些我的感受。那些一次两次的拷贝粘贴和一万两万的拷贝粘贴是完全不同的两种感受。数量,数量可以变很多东西。。。。。。

所以我们尊重数量,我需要用 Emacs 来搞定这个问题。具体的办法说白了也没有什么神奇的。毕竟还是需要进行拷贝粘贴的,这是一个逃脱不了的魔咒。我们唯一能做的就是想办法让 Emacs 去搞定这些烦人的勾当。

所以有了一个叫做 Jump 的扩展。Jump 是个非常可爱的家伙。 很多时候当我在 tivhpi03 上面运行完了一条复杂的命令,为了避免在 tivvm273 上面把它再敲一遍,我会输入 M-x jump,然后这条命令就会自己跳到 tivvm273 的 shell-buffer 里面,并且成功的出现在当前 Shell 提示符的后面。

下面让我们来看看 jump 的具体代码。代码其实很简单,无非就是搞到这条历史命令,然后自己跳到另一个窗口,再把命令贴上去就是了。原来我写的是跳到另一个窗口之后,定位到 shell-buffer 的最下面,直接把命令贴到 Shell 提示符的后面去,后来为了更加通用( 事实上在非 shell-mode 的时候我也会经常用到 jump 命令),所以就把移动到最后面的代码去掉了。通常在 shell-mode 的环境下,光标位置多数都是在当前 shell 提示符的后面的。所以影响也不大。



因为这条命令非常常用,我把这条命令绑定到了 Ctrl-c j 组合键上。

再说另外一个事情,其实也是很有意思的一个问题,什么问题呢?屏幕输出。没想到吧?不仅仅是历史命令,我们还要关注历史的输出。为什么呢?因为在软件质量测试工作中,terminal 中输出的内容,不仅仅是命令的执行结果,更是软件质量问题报告里的证据,是非常重要的内容。

说到这里有人可能会想,重要就重要了,输出就在那里,看就是了嘛。但是清细想一下,真的就是看就行了这么简单吗?那好,试着回答我的一个问题,当你刚刚 cat 了一个非常大的 log,然后又有人来找你需要看看你之前运行了某条命令的结果,你怎么办?向上滚屏的范围里面已经没有要看的内容了,全部的容量都被那个 log 沾满了,这个时候怎么办?其实这样的状况在软件质量测试的工作中是相当平常的一个场景。当你发现应用程序出现了问题,肯定是要去查 log,甚至要翻看好几份 log 才有可能找到问题出现的地方。

在这个时候,还是需要 Emacs shell-mode 出来帮忙。前文提到过,Emacs 首先是一个文字编辑器,文字编辑器里工作空间就是各种形形色色的 buffer,shell-buffer 也是一个 buffer。这个 buffer 包含了在这个 shell session 里面输入的所有命令和输出的所有信息。所有是这里的关键词,cat 了一个 log 再也不会把之前的命令和输出的信息从原来 terminal 里面冲掉了。当你一天的工作结束的时候,如果这些内容对你很重要,还可以像保存一篇文章或者一篇代码一样,将 Emacs 的 shell-buffer 作为一个文件保存下来,以备后用。

说到这里,让我们再次回顾以下刚才提到的 log 问题。虽然现在不会在因为 log 的内容使得历史命令和历史输出被从 terminal 里面冲掉了,但是这些无穷无尽的 log 内容在这里占着空间也的确是一个比较碍事儿的东西,我们可不可以把它从屏幕上清理掉呢?其实 Emacs 早已想到了这个问题,Emacs 的 Shell-mode 提供了这样一个命令,comint-delete-output,这个命令的作用就是把上一条命令的输出全部都删除掉。在 Emacs shell-mode 里面这条命令通常被绑定在 Ctrl-c Ctrl-o 组合键上。这样当你看完了一个 log 以后,只需要输入 Ctrl-c Ctrl-o 组合键,就可以将那些碍事儿的输出内容变成这样一行内容



没错,就想上面显示的那样,由于这个命令的存在,即便是在 ls 了一个比较大的目录之后,也可以使用 Ctrl-c Ctrl-o 组合键将这些已经看过的内容删除掉。从此你的屏幕将会变的非常干净,只有那些真正有价值的内容才会占据屏幕的空间,也才会在保存下来的 buffer 文件当中占有一席之地。

但是这个 Emacs 内置的命令和 Bash 的 ^ 命令一样,存在一个作用范围的问题。comint-delete-output 能够删除的仅仅限于刚刚执行过的那一条命令。换句话说,如果你在 cat 完 log 之后,又习惯性的执行了一条 ls -ltr, 然后你就会发现“一 切都晚了。。。”, comint-delete-output 再也无法删除你想对付的 log 内容了。当然,当然,办法总归是有的,不就是一个 buffer 吗?选中开头,选中结束,然后把中间 delete 掉不就行了么,跟其他所有的 buffer 没有什么区别嘛。说是这么说,要真的天天这么去作,那不是太麻烦了嘛。所以我就自己又扩展了一个新的命令。这个命令的作用就是删除 comint-delete-output 无法搞定的“上上一条” 命令的输出信息。命令的名字叫做 some 只是因为当初扩展这个功能的时候还没想好应该叫做什么,然后忙了一段时间以后发现 some 这个命令已经用熟了,所以也就没有再换名称。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: