第三回 甜蜜约会 -- buffer 篇
上文描述了在 GNU Emacs 里面通过简单的窗口管理优化 Shell 工作的方法,是不是开始对 Shell 从终端里面搬到 Emacs 里面开始有了一点点的心动了呢? 别着急,这还只是个开始,目前你看到的都还只是外表。接下来让我们和 Emacs 来一个甜蜜的约会吧。
输入
我在开头的引子部分曾说过,在 Shell mode 中工作的时候,用户实际上接触的是一个文本缓冲区,实际上并没有直接的跟 Shell 进程打任何交道。这也是和通常的终端模式的工作方法的一个非常大的区别。虽然这个区别看起来似乎不是那么显著(那是因为这个 Shell 缓冲区被设计成了看起来很像一个图形终端的样子),但是实际上这点区别将会带来一些不可替代的优势。让我们来先看一个简单的例子:
让我们在 Shell 提示符前输入这样一行命令
2 : 2037 : 13:04:40 : ~ dove@bash-4.1$ cd /usr/share/emacs 2 : 2038 : 13:05:05 : /usr/share/emacs dove@bash-4.1$ ls -1 23.1 site-lisp site-lisp.tar 2 : 2039 : 13:05:09 : /usr/share/emacs dove@bash-4.1$ |
这个时候让我们把光标移动到 23.1 的前面,输入 ls -1加空格,
2 : 2037 : 13:04:40 : ~ dove@bash-4.1$ cd /usr/share/emacs 2 : 2038 : 13:05:05 : /usr/share/emacs dove@bash-4.1$ ls -1 ls -1 23.1 site-lisp site-lisp.tar 2 : 2039 : 13:05:09 : /usr/share/emacs dove@bash-4.1$ |
然后回车。接下来就会看到这样的输出结果出现在缓冲区里面。
2 : 2040 : 13:08:55 : /usr/share/emacs dove@bash-4.1$ ls -1 23.1 etc leim lisp site-lisp 2 : 2041 : 13:09:06 : /usr/share/emacs dove@bash-4.1$ |
这是一件很有意思的事情,因为我们并没有像在终端当中常见的那样在 Shell 提示符的后面进行命令输入,而是在一个看起来非常随意的地方。神奇的是他居然被正确地执行了。事情的真相其实很简单。
因为现在我们是在一个被称作 Shell 缓冲区的文本缓冲区里面。这就是一个很普通的文本缓冲区,它具有所有其他文本缓冲区所具有的一切特性。你可以在任何时候,任何位置,对这个缓冲区里的任何文本内容进行任何编辑。因为他就是文本。直到某一刻,你在其中一个文本行上面按下了回车,这时 comint.el 就会负责把当前光标所在行的内容提取出来,发送给 Shell 去执行,然后将 Shell 执行的结果以及 一个提示符(这个提示符实际上也是由 Shell 输出给 comint.el 的)以文本的形式添加到这个缓冲区的末尾。