多个Emacs终端

14

我越来越习惯在emacs中完成所有操作,但似乎eshell、shell和term每个只能运行一个实例。有没有办法在emacs中运行多个终端(最好是term)?


6
有时候人们会投票将Emacs相关问题标记为“与编程无关”,我不同意。如果问题是关于如何格式化Eclipse视图或设置Visual Studio以读取RSS提要,那么没有人会考虑这样推荐它来关闭它。对Emacs相关问题进行这种处理是没有意义的。(顺便说一句:给您点赞) - Cheeso
8个回答

18

使用命令M-x rename-buffer为当前终端缓冲区设置一个新名称,然后您可以启动一个新的终端。


11
您也可以使用 M-x rename-uniquely 命令,让 Emacs 自动为您找到一个新的名称。 - Rémi

10

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

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

6

您可以通过C-u M-x shell命令创建一个新的shell


1
取决于底层操作系统,你是获取另一个 shell 还是跳转到现有的 shell。 - Peter Miehle

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



1

我个人使用我自己编写的类似于screen的软件包,这里还有另一个版本可在维基上找到:elscreen。它提供了方便的按键绑定,以跳转到/在不同的shell之间切换。


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) "*"))
    ))

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绑定到C-t,你会发现当你没有查看ansi-term时,C-t将聚焦于ansi-term缓冲区,而如果你正在查看ansi-term,则C-t将重命名它为某个唯一的名称,然后为你打开一个新的ansi-term。这与tabbar结合使用效果非常好,它将在缓冲区第一行上方显示所有已打开的ansi-term。很容易在它们之间切换;-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接