emacs里的multi-term相當(dāng)于mac下的iterm,是emacs下非常好用的terminal。
載入multi-term.el文件
emacs使用multi-term作為terminal,首先要將multi-term.el文件放到你emacs的load-path里。
配置
;; ------------------------------------------------------------
;; set multi-term
;; ------------------------------------------------------------
(require 'multi-term)
(setq multi-term-program "/bin/zsh")
;; Use Emacs terminfo, not system terminfo, mac系統(tǒng)出現(xiàn)了4m
(setq system-uses-terminfo nil)
下面是幾點需要注意的點:
- 我用的是zsh,如果你使用的是bash, 將"/bin/zsh"換成你的"/bin/bash"
- 如果你使用的是mac系統(tǒng),發(fā)現(xiàn)multi-term每行出出了4m,在shell里運行下:
tic -o ~/.terminfo /Applications/Emacs.app/Contents/Resources/etc/e/eterm-color.ti
- zsh在mac下可能會出現(xiàn)中文顯示為????的情況,這時候創(chuàng)建一個文件:~/.zshenv,其內(nèi)容如下:
export LANG='en_US.UTF-8'
export LC_ALL="en_US.UTF-8"
快捷鍵
打開multi-term的命令是multi-term,你可能發(fā)現(xiàn)在multi-term模式下會出現(xiàn)與自己的快捷鍵沖突的地方。如果想保留自己在其他mode下的快捷鍵,將快捷鍵添加到 term-bind-key-alist這個列表中,例如我想把"C-j"保留我其他mode一樣,如下:
(add-to-list 'term-bind-key-alist '("C-j"))
解決幾個煩人的問題
1. 我開始設(shè)置的是zsh,我發(fā)現(xiàn),當(dāng)我用$cd$命令改變工作目錄的時候,emacs里的default-directory這個變量沒有改變,使得C-x C-f調(diào)用打開文件時目錄不是當(dāng)前工作目錄?
解決方法將下列代碼放到zsh的配置文件 $~.zshrc$里,使得emacs能跟蹤路徑的改變,參考1,參考2。
if [ -n "$INSIDE_EMACS" ]; then
chpwd() { print -P "\033AnSiTc %d" }
print -P "\033AnSiTu %n"
print -P "\033AnSiTc %d"
fi
2. 我希望當(dāng)光標(biāo)沒處于最后一行時,"C-a"的作用是將光標(biāo)移動到行首,當(dāng)光標(biāo)處于最后一行時,我希望"C-a"的作用是將光標(biāo)移動到這行命令的開始處。解決方法:將下列 ab/move-beginning-of-line 綁定到快捷鍵"C-a"即可。
;; 當(dāng)處于最后一行時 "C-a" 將光標(biāo)移動到 terminal開始處而不是這個行的頭
(defun ab/is-at-end-line ()
"判斷是否在最后一行"
(equal (line-number-at-pos) (count-lines (point-min) (point-max))))
(defun ab/is-term-mode ()
"判斷是否為 term 模式"
(string= major-mode "term-mode"))
(defun ab/move-beginning-of-line ()
"move begin"
(interactive)
(if (not (ab/is-term-mode))
(beginning-of-line)
(if (not (ab/is-at-end-line))
(beginning-of-line)
(term-send-raw))))
3. 有個煩人的問題,你發(fā)現(xiàn)使用了"C-b" (backword-char 函數(shù)),你想在命令的中間插入新的字符,每次都插入到了這行的最后。解決方法:將下列ab/backword-char函數(shù)綁定到"C-b"
;; 只后當(dāng)是term-mode并且是最后一行時才采用 (term-send-left)
(defun ab/backword-char ()
"Custom "
(interactive)
(if (not (ab/is-term-mode))
(backward-char)
(progn (if (not (ab/is-at-end-line))
(backward-char)
(progn (term-send-left)
(message "term-send-left"))))))
4.修改快捷鍵的map,如果你發(fā)你定義自己的快捷鍵與該major-mode的沖突,可以直接修改它的key-map
(define-key term-raw-map (kbd "M-n") 'ace-jump-mode)
更多見,我的multi-term配置
最近我自己對multi-term做了一些改進,見項目:
https://github.com/aborn/multi-term-plus