2010-05-07 108 views
14

我越來越習慣於從emacs內部做所有事情,但看起來eshell,shell和term只會運行一個實例。有沒有辦法在emacs內部運行多個終端(最好是術語)?多個emacs終端

+6

人們還時常發生投票關閉emacs的問題,因爲「與編程無關」。我不同意。如果問題是關於如何格式化Eclipse透視圖,或者如何設置Visual Studio來讀取rss提要,那麼沒有人會考慮以這種方式推薦它。以這種方式處理與emacs相關的問題是沒有意義的。 (ps:有一個upvote) – Cheeso 2010-05-09 11:27:32

回答

8

你只需重命名緩衝,這裏有一個函數來啓動的zsh和提示輸入緩衝區名稱:

(defun zsh (buffer-name) 
    "Start a terminal and rename buffer." 
    (interactive "sbuffer name: ") 
    (term "/bin/zsh") 
    (rename-buffer buffer-name t)) 
17

使用命令M-x rename-buffer給當前shell緩衝區的新名字,然後就可以開始一個新的shell。

+11

你也可以使用'M-x rename-unique'讓emacs找到新名字 – 2010-05-07 10:52:54

5

您可以隨時創建C-U m的-X外殼

+0

取決於底層操作系統,無論你獲得另一個shell還是跳轉到現有的shell – 2010-05-07 08:23:59

2

一個新的外殼可以重命名項,並開始一個新的。我正在使用類似的東西,從其他人.emacs中拿走它。

(require 'term) 
(defun visit-ansi-term() 
    "If the current buffer is: 
    1) a running ansi-term named *ansi-term*, rename it. 
    2) a stopped ansi-term, kill it and create a new one. 
    3) a non ansi-term, go to an already running ansi-term 
     or start a new one while killing a defunt one" 
    (interactive) 
    (let ((is-term (string= "term-mode" major-mode)) 
     (is-running (term-check-proc (buffer-name))) 
     (term-cmd "/bin/bash") 
     (anon-term (get-buffer "*ansi-term*"))) 
    (if is-term 
     (if is-running 
      (if (string= "*ansi-term*" (buffer-name)) 
       (call-interactively 'rename-buffer) 
       (if anon-term 
        (switch-to-buffer "*ansi-term*") 
       (ansi-term term-cmd))) 
      (kill-buffer (buffer-name)) 
      (ansi-term term-cmd)) 
     (if anon-term 
      (if (term-check-proc "*ansi-term*") 
       (switch-to-buffer "*ansi-term*") 
      (kill-buffer "*ansi-term*") 
      (ansi-term term-cmd)) 
     (ansi-term term-cmd))))) 

或者你可以只有一個和它開始screen session

1

我個人使用我編寫的類似screen的軟件包,並且wiki上還有另一個版本:elscreen。它提供了方便的鍵綁定來跳轉到不同的shell之間。

0

我修改通過哈波接受的答案,從而開始新的外殼,而不提示,貝殼在表單*命名殼1 *,*殼2 *,*殼3 *等:

(setq bash-counter 1) 
(defun bash() 
    "Start a bash shell" 
    (interactive) 
    (setq bash-counter (+ bash-counter 1)) 
    (let 
    ((explicit-shell-file-name "/bin/bash")) 
    (shell (concat "*shell-" (number-to-string bash-counter) "*")) 
    )) 
0

這裏有一個超輕量級的小功能,你可以打電話到自動重命名術語你」繼續,然後開始一個新詞:

(defun new-ansi-term() 
    (interactive) 
    (if (string= "*ansi-term*" (buffer-name)) 
     (rename-uniquely)) 
    (ansi-term "/bin/bash")) 

然後綁定是ANSI-期限內,我發現這工作:

(defvar ansi-term-after-hook nil) 
(add-hook 'ansi-term-after-hook 
      '(lambda() 
      (define-key term-raw-map (kbd "C-t") 'new-ansi-term))) 
(defadvice ansi-term (after ansi-term-after-advice (org)) 
    (run-hooks 'ansi-term-after-hook)) 
(ad-activate 'ansi-term) 

如果你還再以正常的方式新的ANSI長期結合CT,你會發現,當你Ct將關注ansi-term緩衝區,然後如果您正在查看ansi-term,Ct會將其重命名爲某個唯一的名稱,然後爲您打開一個新的ansi-term 。這與tabbar結合使用效果非常好,它將向您顯示所有在緩衝區第一行之上打開的ansi-terms。易於在它們之間進行切換;-)