終端下使用Emacs的一些Tips


這里說的終端,其實主要是指終端模擬器,也即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色的。這樣你的語法高亮配色就有了更多選擇。

如果你的UNIX比較新,terminfo里面有xterm-256color 這個類型的終端描述的話,只要先執行如下語句:
export TERM=xterm-256color

然后再啟動emacs,那么emacs就有了256色了, 用M-x list-colors-display看看列出了多少顏色就知道生效與否了。

** 終端模擬器支持

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,它會顯示類似如下的圖:

xterm 256 color test

 

* 待續

  • 快捷鍵(key bindings)
  • Emacs菜單問題 (lacarte)
  • Emacs overlay和fringe (auto-complete, hideshow-fringe, qtmstr-outline etc)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM