如何在Emacs上运行多个shell

如何在Emacs上运行多个shell,emacs,Emacs,我正在windows 7上使用Emacs 23.3.1。我知道我可以使用M-xshell从emacs运行shell。我希望在同一时间有多个shell窗口,但第二次键入M-x shell只会打开同一个shell窗口 有没有办法拥有不同的shell窗口?您可以使用M-x重命名缓冲区重命名shell的缓冲区。然后您将能够启动第二个shell。C-u M-x shell将完成此操作 它将提示输入新shell的名称,只需按return键即可获得默认名称(类似于*shell*) 还与埃塞尔合作 另一个技巧是

我正在windows 7上使用Emacs 23.3.1。我知道我可以使用M-xshell从emacs运行shell。我希望在同一时间有多个shell窗口,但第二次键入M-x shell只会打开同一个shell窗口


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

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

C-u M-x shell将完成此操作

它将提示输入新shell的名称,只需按return键即可获得默认名称(类似于
*shell*

还与埃塞尔合作


另一个技巧是,如果你使用eshell:正如M-x eshell会带你回到
*eshell*
(而不是开始一个新的eshell),如果你使用一个数字前缀参数,它会带你到那个eshell缓冲区。例如,C-3M-xeshell会带你到
*eshell*
。遗憾的是,如果你使用shell(而不是eshell),此技巧似乎不起作用(至少在我的Emacs 24.0.50.1中)

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

在shell中使用类似屏幕的界面也可能很有用。我自己写了,但还有其他一些,比如。

这将在您使用的任何缓冲区中自动生成新的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命名为“排序文件”如果它专用于对文件进行排序,如果它专用于运行配置单元查询,则使用另一个“配置单元”。我现在每天都使用它(在emacs 24上):


这将在每次调用函数时打开一个新的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)
  ))

好的,这一个有效。C-u M-x shell问我新shell的名称。谢谢!没问题S4M。我为eshell添加了一个提示;当你问shell时,我不知道你是否会发现它有用,但有相同问题的eshell用户可能会发现它有用。谢谢,Matt。C-u在这里是什么意思/做什么?
C-u
运行命令
universal argument
>。这是一种向下一个命令中注入参数的方法。您可以通过
C-hk C-u
阅读更多关于它的信息(
C-hk
运行
descripe key
,非常方便!)我一直都在使用它。我有一种恼怒,尽管我最后在Ibuffer中看到一行写着
*shell*3038 shell(壳牌公司)~/
当您尝试退出时,emacs将shell称为shell,即使名称为shell。当然,我可以编辑建议的默认名称参数,但我不这样做。我更喜欢使用Matt Curtis的解决方案。在我看来,使用新名称运行shell比重命名当前名称然后运行新名称更容易。您需要
-如果变量是本地使用的,就绑定它们。现在,你有了
currentbuf
newbuf
的全局值。新的shell函数与我的create shell函数相比如何?@S4M这主要是一个偏好问题,我很懒,希望我的shell立即出现在当前活动的窗口中,并且没有ha要预先输入缓冲区名称。@phils谢谢您的提示,我对lisp一点也不熟悉,因此将使用本地赋值对其进行修改。:-)嗯,我想你可以使用我的函数,添加一个默认名称,类似于shell_n,其中n是第n个打开的shell,而C-u create shell会提示shell的名称。请注意,shell模式和term模式是两个完全不同的东西。
(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)
  ))