我越来越习惯在emacs中完成所有操作,但似乎eshell、shell和term每个只能运行一个实例。有没有办法在emacs中运行多个终端(最好是term)?
使用命令M-x rename-buffer
为当前终端缓冲区设置一个新名称,然后您可以启动一个新的终端。
M-x rename-uniquely
命令,让 Emacs 自动为您找到一个新的名称。 - Rémi您只需重命名缓冲区,这里是一个启动zsh并提示缓冲区名称的函数:
(defun zsh (buffer-name)
"Start a terminal and rename buffer."
(interactive "sbuffer name: ")
(term "/bin/zsh")
(rename-buffer buffer-name t))
您可以通过C-u M-x shell命令创建一个新的shell
你可以重命名一个术语并开始一个新的。我正在使用类似这样的方式,这个方法是从别人的 .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。
我修改了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) "*"))
))
(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)