這里說的終端,其實主要是指終端模擬器,也即putty/mintty, xshell, gnome-terminal, xfce4-terminal等。雖然說理論上來說,大多數內容也適用於控制台,但我並沒有在上面驗證過。
* 多frame
如果你像我一樣用Frame Bufs這個擴展將不同“工程”的buffer組織在不同的frame上,那么肯定也想問終端下是否支持frame,答案是肯定的。仍然使用C-x 5 2來創建新的frame, 用C-x 5 o切換frame。與GUI下的差別是你不能調整frame的大小了,因為一致都是全屏——如果你想要用半個終端來跑別的東西,建議用tmux或者 Emacs里面的ansi-term-mode.
參考: Emacs Journey: CLI Emacs and multiple-frames
* 鼠標
除了終端模擬器自己的拷貝、粘貼和右鍵菜單,終端模擬器里面跑的應用程序其實也是可以使用鼠標的,這些終端模擬器大都支持一種叫做Xterm mouse tracking的功能: 終端模擬器收到鼠標時,先看看是不是應該用來應對自己的功能(比如文字拷貝、粘貼和右鍵菜單),如果不是,則將按鍵信息通過Xterm control sequences將按鍵信息發送給應用程序。
GNU Emacs可以通過M-x xterm-mouse-mode打開終端下的鼠標功能。
不過有幾點值得注意:
- 所用的Emacs必須編譯進了鼠標支持才能使用xterm-mouse-mode。一般來說,如果你安裝的Emacs是帶X11版本的,那么就沒有問題;如果你安裝的是emacs-nox,那么就不支持鼠標了。
(其實這個說法並不嚴謹,但根據Emacs的缺省編譯設置,的確是在有window-system的時候才打開HAVE_MOUSE這個定義,configure腳本沒有單獨對鼠標支持提供開關。而 最近的一個HAVE_MOUSE補丁則完全放開了鼠標支持,你可以在老版本Emacs代碼上打上這個補丁重新編譯)
- 如果你想為鼠標事件增加Ctrl,Alt和Shift修飾鍵(modifier)的支持,比如綁定<S-mouse-1>或者<M-mouse-3>到某個事件,雖然理論上是支持的,但實際上都比較悲摧,自己用C-h k試試就知道了(唯一比較幸運一點的是Ctrl)
- 鼠標滾輪可以用。不過跟GUI下不同的是,幾乎沒有帶修飾鍵的版本可用(也就是說不能綁定<C-mouse-4>, <M-mouse-4>這些事件 (P.S. 在Linux系統上,鼠標滾輪事件名叫<mouse-4>和<mouse-5>,跟Windows下的<wheel-up>和<wheel-down>並不一樣(不清楚Mac OS X等系統))
- 終端模擬器都有一些自己鼠標功能(比如選擇文本拷貝到本地剪貼板,顯示右鍵菜單),可能會保留Ctrl/Alt/Shift中的某一個用來做這方面的用途
這個設置在Putty里面是 Configuration->Window->Selection->Shift overrides application's use of mouse; 在Mintty里則是 Configuration->Mouse->Modifier key for overriding default ; 而Gnome Terminal里則不提供配置,右鍵(<mouse-3>)始終被自己接管,按住Shift始終是本地的選擇文字功能,里面跑的應用程序永遠無法得到這兩個事件
* 顏色
如果你用終端模擬器(gnome-terminal,guake, putty或者mintty)來運行emacs, 其實它們也是支持256色的。這樣你的語法高亮配色就有了更多選擇。
** 終端模擬器支持
putty缺省是支持256色的,只要你沒有在選項Window->Colours里面關閉Allow terminal to use xterm 256-color mode這一項。那么用上面的TERM環境變量就夠了。
mintty 里面,你可以直接在Options->Terminal->Type里面選擇xterm-256color,這樣進去之后shell就會繼承 這個設置,不用手工設置TERM環境變量了——當然你在交互式方式或者~/.bashrc里面設置也行,不過這本來就應該是終端模擬器端的設置。
另 外,如果你又在終端模擬器(gnome-terminal, putty)里面跑了screen/tmux的話,那么得啟動screen/tmux之前把TERM設置成256色模式(xterm-256color或者rxvt-256color之類),然后在screen/tmux的window中把TERM設置為screen-256color,詳細內容請參看ArchWiki: Tmux: Set the correct TERM
一些文章上說,只要在tmux里面啟動一個window后,在里面執行export TERM=screen-256color(或者在~/.tmux.conf里面添加set -g default-terminal "screen-256color" 來自動設置)。但根據我的試驗,啟動tmux之前不設置TERM是實際上得不到256種不同顏色的
** terminfo問題
如果用的Linux比較老,terminfo數據庫里沒有xterm-256color或者screen-256color這個類型的定義(用ls /lib/terminfo/s/可以列舉所有以s開頭的terminal type),那么你就沒法用這個功能了(FIXME: 怎么加上這個類型定義?)
實測是否真支持256色(而不是名義上有256色卻有很多重復的顏色)的一個方法是用這篇The 256 color of xterm里面提供的perl腳本256colors2.pl,它會顯示類似如下的圖:
* 待續
- 快捷鍵(key bindings)
- Emacs菜單問題 (lacarte)
- Emacs overlay和fringe (auto-complete, hideshow-fringe, qtmstr-outline etc)