Відповіді:
C-u M-x shell зробимо це.
Він запропонує назву нової оболонки, просто натисніть клавішу return за замовчуванням (що буде щось на зразок *shell*<2>
.
Також працює з eshell.
Ще одна хитрість, якщо ви використовуєте eshell: так само, як M-x 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
) переходить на сеанс із цим номером, створюючи його за потреби. Нечисловий аргумент з префіксом означає створити новий сеанс.
Подивіться на MultiTerm , це значно спрощує управління кількома терміналами в Emacs.
Також може бути корисним використання екранного інтерфейсу для оболонок. Я написав своє, але є й інші, наприклад EmacsScreen .
Після більш ніж чотирьох років я бачу, що деякі люди все ще дивляться на це питання іноді, тому я опублікую швидку функцію, яку я написав, щоб завантажити оболонку і запитати її назву. Таким чином ви можете назвати оболонку "sort-files", якщо вона призначена для сортування файлів, а інша - "вулик", якщо вона призначена для виконання запитів вуликів. Я використовую це щодня зараз (на 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)
))