不止一个emacs终端

时间:2010-05-07 03:08:11

标签: emacs terminal

我越来越习惯从emacs内部做所有事情,但似乎eshell,shell和term只会运行一个实例。有没有办法在emacs中运行多个终端(最好是术语)?

8 个答案:

答案 0 :(得分:17)

使用命令M-x rename-buffer为当前shell缓冲区指定一个新名称,然后就可以启动一个新shell。

答案 1 :(得分:10)

你只需重命名缓冲区,这是一个启动zsh并提示缓冲区名称的函数:

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

答案 2 :(得分:6)

您始终可以使用 C-u M-x shell

创建新的shell

答案 3 :(得分:2)

答案 4 :(得分: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

答案 5 :(得分:1)

我个人使用我写的screen类似的软件包,并且维基上还有另一个版本:elscreen。它提供了方便的键绑定,可以跳转到不同的shell之间。

答案 6 :(得分:0)

我修改了Harpo接受的答案,以便在没有提示的情况下启动一个新shell,shell将以* shell-1 *,* shell-2 *,* shell-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) "*"))
    ))

答案 7 :(得分:0)

这是一个超轻量级的小功能,您可以调用它来自动重命名您所使用的术语,然后开始一个新术语:

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

然后在ansi-term内绑定,我发现这有效:

(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)

如果你然后以正常的方式将new-ansi-term绑定到Ct,你会发现当你没有看到一个ansi-term时,Ct会关注ansi-term缓冲区,然后如果你正在看一个ansi-term,Ct会将它重命名为一个独特的名字,然后为你开一个新的ansi-term。这与tabbar结合使用效果非常好,它会在缓冲区的第一行上方显示所有打开的ansi-terms。易于在它们之间切换; - )