Ответы:
C-u M-x shell сделаю это.
Он запросит имя для новой оболочки, просто нажмите return для значения по умолчанию (что-то вроде *shell*<2>.
Также работает с eshell.
Еще один прием, если вы используете eshell: точно так же, как M-x eshellвы возвращаетесь к *eshell*(а не запускаете новый eshell), если вы используете аргумент числового префикса, он приведет вас к этому буферу eshell. Например, C-3M-xeshellприведет вас к *eshell*<3>. К сожалению, если вы используете shell (а не eshell), этот трюк не работает (по крайней мере, в моем Emacs 24.0.50.1).
C-uзапускает команду universal-argument. Это способ ввода аргумента в следующую команду. Вы можете прочитать больше об этом с C-h k C-u( C-h kработает describe-key, очень удобно!)
C-h f eshell( C-h fвыполняется describe-function) показывает, что функция eshellпринимает необязательный аргумент. Цитата: числовой префикс arg (как в C-u 42 M-x eshell RET) переключается на сеанс с этим номером, создавая его при необходимости. Нечисловой префикс arg означает создание нового сеанса.
Посмотрите на MultiTerm , он делает управление несколькими терминалами в Emacs намного проще.
Также может быть полезно использовать экранный интерфейс для ваших оболочек. Я написал свой, но есть и другие, такие как EmacsScreen .
По прошествии более четырех лет я вижу, что некоторые люди по-прежнему рассматривают эту проблему иногда, поэтому я опубликую быструю написанную мной функцию для загрузки оболочки и запроса ее имени. Таким образом, вы можете назвать оболочку «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 "*"))))
Это автоматически сгенерирует новый экземпляр оболочки в любом буфере, который вы используете; свяжите это с 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, хотя в результате получаются еще более ужасные скобки ...: \
letсвязать переменные, если они предназначены для локального использования. Как сейчас, у вас есть глобальные значения для currentbufи newbuf.
Это будет открывать новую оболочку каждый раз, когда вы вызываете функцию и автоматически переименовываете ее, если это необходимо. Плюс в том, что если вы редактируете файлы удаленно (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)
))