Emacs 與 shell 的結合,可以大幅提升工作效率。當然,對於一些常見的命令列程式(如 git)有更方便的套件可以用,這是之後要介紹的。Emacs 內的 ansi-term 甚至強大到可以在裏面執行一個 vim XDD
前言:為了充份利用Emacs,我們要多了解其所提供的各式工具。最強大的一個點在於,他能夠提供非常好的終端模擬(而且是跨平台的、可以elisp互動的)。不需要在寫程式的時候在兩個畫面之間接換來切換去,也不必辛苦的去調整視窗大小,還要動用滑鼠才能剪貼。Emacs提供了最主要有三種同的模式。本文只是這三種模式一個快速的介紹。
所有與外部程式對接的部份, 都是透過一個基礎模式:comint-mode來達成。這個模式提供了許多低階的功能,如使用者輸入,歷史紀錄(history ring)。我們常見的M-x shell或M-x python-shell都是繼承自這個mode。
SHELL MODE (M-x shell)
這只是一個emacs對於你原本的shell的包裝(wrapper),不過要注意的是,所有的輸入輸出都會被重新導向到emacs(的buffer)中,有些交互式作用的程式(例:midnight commander)就不會順暢的運作。
TERMINAL EMULATOR(M-x term Or M-x ansi-term)
這個模擬器的特點在於,他能模擬VT100-style ANSI escape codes,就像rxvt或xterm一樣。大多數的交互式程式依然沒辦法執行的很好,不過top或ssh就執行的還不錯。以M-x term或M-x ansi-term(完整的ANSI支持)來呼叫他。他有兩種模式可以呼叫:line mode和char mode。
THE EMACS SHELL(M-x eshell)
這是一個平行於zsh/bash等shell的一個emacs自帶shell。完全由elisp寫成,包含裏面主要的指令。它最大的好處在於可以於windows環境中,執行bash-like的指令而完全不需要考慮平台問題(emacs幫我們處理好了)。
命令列除了接受指令外,也能夠執行elisp,這表示可以透過elisp當作一種script語言來執行。多行輸出(例如:man、grep、locate等)會被導到新的buffer供慢慢檢閱,而原來的eshell則可繼續執行其他指令。(這也是我最喜歡的功能)
DIRECT EXECUTE (M-! command)
有時候我只是想到要執行某個小指令,如:移動、刪除或創建檔案或資料夾,那就沒必要開啟一個shell打指令,可以使用如下功能:M-!然後minibuffer處會跳出一個提示,問你要打什麼指令。而如果這個指令沒有顯示結果(如mkdir foo),他就只告訴你一切成功完成。如果是有輸出結果的指令,則會把結果輸出到*Shell Command Output*這個buffer中。你如果又輸入了新的結果,則此buffer會被清空,顯示新的輸出。
haroldwu提到:
Emacs 內的 ansi-term 甚至強大到可以在裏面執行一個 vim XDD
這個利害,
vim可以在裏面執行emacs嗎?
閣下的emacs操作,真讓人耳目一新!
讚
應該是不行吧 = =a
其實只是要表達 ansi-term 幾乎是一個完整的 terminal 的意思 XD