如何在Emacs上运行多个Shell


147

我在Windows 7上使用Emacs 23.3.1。我知道我可以使用Mx shell从emacs运行shell。我想同时拥有多个外壳窗口,但是第二次输入Mx shell只会打开同一个外壳窗口。

有没有办法拥有不同的外壳窗口?

Answers:


210

C-u M-x shell 会做的。

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

也可以与eshell一起使用。

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


1
好的,这个可行。Cu Mx shell问我新外壳的名称。谢谢!
2011年

1
S4M没问题。我为eshell添加了技巧;当您询问有关shell的信息时,我不知道您是否会发现它有用,但是遇到相同问题的eshell用户可能会发现它有用。
马特·柯蒂斯

谢谢,马特。铜在这里是什么意思?
蒂姆(Tim)

4
C-u运行命令universal-argument。这是将参数注入下一个命令的方式。您可以通过C-h k C-uC-h k运行describe-key,非常方便!)阅读有关它的更多信息
Matt Curtis 2014年

然后C-h f eshellC-h f运行describe-function)表明该函数eshell采用可选参数。Quote:数字前缀arg(如中的C-u 42 M-x eshell RET)切换到具有该数字的会话,并在必要时创建它。非数字前缀arg表示创建新会话。
Matt Curtis 2014年

34

您可以使用来重命名shell的缓冲区M-x rename-buffer。然后,您将能够启动第二个Shell。


2
我更喜欢Matt Curtis的解决方案。在我看来,以新名称运行外壳比重命名当前外壳然后运行新外壳容易。
2011年



5

四年多以后,我发现有些人有时仍在研究此问题,因此我将发布我编写的一个快速函数来加载shell并询问其名称。这样,如果专用于对文件进行排序,则可以将外壳命名为“ sort-files”,如果专用于运行配置单元查询,则可以命名为另一个“配置单元”。我现在每天都使用它(在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 "*"))))

4

这将在您碰巧使用的任何缓冲区中自动生成一个新的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进行重写,即使结果是更加可怕的括号...:\


1
如果let变量是供本地使用的,则需要对它们进行绑定。因为它是你现在对全球价值观currentbufnewbuf
菲利普斯

new-shell函数与我的create-shell函数相比如何?
2013年

1
@ S4M主要是一个优先问题,我很懒惰,并且想要我的shell立即出现在当前活动的窗口中,而不必事先输入buffername。
bjsdaiyu

@phils感谢您的提示,我对Lisp一点都不熟悉,因此将使用本地分配对其进行重做。:-)
bjsdaiyu 2013年

嗯,我想您可以接受我的函数,并添加一个默认名称,该名称类似于shell_n,其中n是打开的第n个外壳,而Cu create-shell会提示该外壳的名称。
2013年

0

每次您调用该函数时,都会打开一个新的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)
  ))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.