|
发表于 2008-1-21 15:08:33
|
显示全部楼层
Post by gengfei;1808451
可为什么图形界面只能在terminal中启动呢,而直接在emacs的shell buffer中操作就不成?
这是因为这两个终端程序对输出的解释不同。
comint 是 Emacs 的一个包,Emacs 中的许多命令行接口都是基于 comint 实现的。例如,shell 为 Shell 解释器提供的接口,gdb 为 gdb 提供的接口,run-scheme 为 Scheme 解释器提供的接口,run-python 为 Python 解释器提供的接口,等等等等。comint 的含义是 COMmand INTerperter。另一方面,term 则并未以“库”的形式使用 comint,而是在 comint 的代码上直接作出修改来实现的。
无论是 comint 还是修改之后的 term,提供一个与真实环境中类似的操作界面的方式其原理都是一样的:Emacs 会启动一个子进程,并将这个子进程约束到一个 buffer 上。此后,子进程的输出会插入到这个 buffer 中。不过,Emacs 同时提供了 process filter 的概念,使得子进程的输出可以先被 filter 捕获并操作,再由 filter 决定是否将输出展示给用户,或者执行其他相关的动作。当一个子进程提供了一个 filter 时,它的输出就不会被 Emacs 插入到 buffer 中了。如前面所说,它的输出是由 filter 操作的。
term 同 shell 对 ncurses 程序(make menuconfig 即是一例)的区别主要在此:term 实现了模拟 VT100 的 filter,而 shell 则没有实现。所以 term 可以(通过它的 filter)解释这类程序的输出,并修改运行 shell 的 buffer 来展示给用户,而 shell 则不行。 |
|