Ответы:
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)
))