Как запустить несколько оболочек на 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)
))