如何在Emacs上运行多个shell

我在Windows 7上使用Emacs 23.3.1。我知道我可以使用Mx shell从emacs运行shell。 我想在同一时间有多个shell窗口,但第二次打字Mxshell只是打开我相同的shell窗口。

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

Mx 会做到这一点。

它会提示input新shell的名称,只需按回车键即可(默认为*shell*<2>

也适用于eshell。

另一个窍门,如果你使用eshell:就像Mx eshell把你带回*eshell* (而不是开始一个新的eshell)一样,如果你使用数字前缀参数,它会带你到那个eshell缓冲区。 例如, C-3 Mx eshell会带你到*eshell*<3> 。 可悲的是,如果你使用shell(而不是eshell),这个技巧似乎不起作用(至less在我的Emacs 24.0.50.1中)。

您可以使用Mx重命名缓冲区来重命名shell 的缓冲区 。 然后你将能够启动第二个shell。

看看MultiTerm ,它使得在Emacs中pipe理多个terminal变得更容易。

在屏幕上使用类似屏幕的界面也是有用的。 我写了自己的,但也有其他人,如EmacsScreen 。

这将在你正在使用的任何缓冲区中自动生成一个新的shell实例; 绑定到MS或类似的东西,瞬间的喜悦:

 (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”,如果它专用于sorting文件,而另一个专门用来运行configuration单元查询,则可以命名为“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) ))