如何在 Emacs 上运行多个 shell

我在 Windows7上使用 Emacs 23.3.1。我知道我可以使用 M-x shell 从 emacs 运行 shell。我希望同时拥有多个 shell 窗口,但是第二次输入 M-x shell 只会打开相同的 shell 窗口。

有没有办法使用不同的 shell 窗口?

38118 次浏览

你可以用 M-x rename-buffer重命名你的 shell 的缓冲区,然后你就可以启动第二个 shell 了。

M-x shell会做到的。

它将提示输入新 shell 的名称,只需按回车键输入默认值(类似于 *shell*<2>)。

同样适用于贝壳。

另一个技巧是,如果使用 esshell: 就像 M-x eshell将您带回到 *eshell*(而不是启动一个新的 esshell)一样,如果使用数字前缀参数,它将带您到该 esshell 缓冲区。例如,C-3M-xeshell将带您到 *eshell*<3>。遗憾的是,如果使用 shell (而不是 shell) ,这个技巧似乎不起作用(至少在我的 Emacs 24.0.50.1中是这样)

看看 多期,它使得在 Emacs 中管理多个终端变得更加容易。

对 shell 使用类似屏幕的界面可能也很有用。我已经写了自己的,但还有其他的,像 EmacsScreen

这将自动生成一个新的 shell 实例在任何你碰巧正在使用的缓冲区中; 将它绑定到 M-S 或类似的东西,并立即享受:

(defun new-shell ()
(interactive)


(let (
(currentbuf (get-buffer-window (current-buffer)))
(newbuf     (generate-new-buffer-name "*shell*"))
)


(generate-new-buffer newbuf)
(set-window-dedicated-p currentbuf nil)
(set-window-buffer currentbuf newbuf)
(shell newbuf)
)
)

非常感谢 phils 推荐使用 let 进行重写,尽管结果是更糟糕的括号... ... :

四年多以后,我发现有些人有时仍然在关注这个问题,所以我将发布一个快速函数,这个函数是我编写的,用于加载 shell 并询问它的名称。这样,如果一个 shell 专门用于对文件进行排序,那么可以将其命名为“ sort-files”; 如果另一个 shell 专门用于运行 hive 查询,那么可以将其命名为“ hive”。我现在每天都用它(在 emacs 24上) :

(defun create-shell ()
"creates a shell with a given name"
(interactive);; "Prompt\n shell name:")
(let ((shell-name (read-string "shell name: " nil)))
(shell (concat "*" shell-name "*"))))

这将在每次调用函数时打开一个新的 shell,并在需要时自动重命名它。 附加的好处是,如果你远程编辑文件(dired/tramp...) ,这将在远程主机上打开一个 shell,并用远程主机名自动重命名它:

(defun ggshell (&optional buffer)
(interactive)
(let* (
(tramp-path (when (tramp-tramp-file-p default-directory)
(tramp-dissect-file-name default-directory)))
(host (tramp-file-name-real-host tramp-path))
(user (if (tramp-file-name-user tramp-path)
(format "%s@" (tramp-file-name-user tramp-path)) ""))
(new-buffer-nameA (format "*shell:%s*" host))
(new-buffer-nameB (generate-new-buffer-name new-buffer-nameA))
(currentbuf (get-buffer-window (current-buffer)))
)
(generate-new-buffer new-buffer-nameB)
(set-window-dedicated-p currentbuf nil)
(set-window-buffer currentbuf new-buffer-nameB)
(shell new-buffer-nameB)
))