Как запустить несколько оболочек на Emacs - PullRequest
138 голосов
/ 30 июня 2011

Я использую Emacs 23.3.1 в Windows 7. Я знаю, что могу запускать shell из emacs, используя Mx shell.Я хотел бы иметь несколько окон оболочки одновременно, но ввод Mx shell во второй раз просто открывает мне одно и то же окно оболочки.

Есть ли способ получить разные окна оболочки?

Ответы [ 7 ]

197 голосов
/ 30 июня 2011

C-u М-х оболочка сделает это.

Будет запрошено имя для новой оболочки, просто нажмите return для значения по умолчанию (что-то вроде *shell*<2>.

Также работает с eshell.

Еще один прием, если вы используете eshell: точно так же, как Mx eshell возвращает вас к *eshell* (вместо запуска нового eshell), если вы используете аргумент числового префикса, он приведет вас к этому буфер оболочки Например, C-3 M-x eshell приведет вас к *eshell*<3>. К сожалению, если вы используете shell (а не eshell), этот трюк не работает (по крайней мере, в моем Emacs 24.0.50.1.)

29 голосов
/ 30 июня 2011

Вы можете переименовать буфер вашей оболочки с помощью Mx rename-buffer .Тогда вы сможете запустить вторую оболочку.

7 голосов
/ 30 июня 2011

Посмотрите на MultiTerm , это значительно облегчает управление несколькими терминалами в Emacs.

5 голосов
/ 30 июня 2011

Также может быть полезно использовать экранный интерфейс для ваших оболочек.Я написал свой, но есть и другие, такие как EmacsScreen .

4 голосов
/ 06 апреля 2016

По прошествии более четырех лет я вижу, что некоторые люди по-прежнему рассматривают эту проблему иногда, поэтому я опубликую быструю написанную мной функцию для загрузки оболочки и запроса ее имени. Таким образом, вы можете назвать оболочку «sort-files», если она предназначена для сортировки файлов, и другую «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 "*"))))
4 голосов
/ 27 мая 2013

Это автоматически сгенерирует новый экземпляр оболочки в любом буфере, который вы используете; свяжите это с 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, хотя в результате получаются еще более ужасные скобки ...: \

0 голосов
/ 27 июля 2017

Это будет открывать новую оболочку каждый раз, когда вы вызываете функцию и автоматически переименовываете ее при необходимости.Плюс в том, что если вы редактируете файлы удаленно (dired / tramp ...), это откроет оболочку на удаленном хосте и автоматически переименует ее с удаленным именем хоста:

(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)
  ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...