Как запустить несколько оболочек на Emacs

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

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

Ответ 1

C-u M-x shell сделает это.

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

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

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

Ответ 2

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

Ответ 3

Посмотрите MultiTerm, он упрощает управление несколькими терминалами в Emacs.

Ответ 4

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

Ответ 5

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

Ответ 6

Спустя более четырех лет, я вижу, что некоторые люди по-прежнему рассматривают эту проблему иногда, поэтому я опубликую краткую функцию, которую я написал, чтобы загрузить оболочку и запросить ее имя. Таким образом, вы можете назвать shell-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 "*"))))

Ответ 7

Это откроет новую оболочку при каждом вызове функции и при необходимости переименует ее автоматически. Добавленный плюс - если вы редактируете файлы удаленно (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 "%[email protected]" (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)
  ))