Як запустити кілька оболонок на Emacs


147

Я використовую Emacs 23.3.1 у Windows 7. Я знаю, що я можу запускати оболонку з Emacs за допомогою оболонки Mx. Я хотів би мати декілька вікон оболонок одночасно, але введення Mx оболонки вдруге просто відкриває мені те саме вікно оболонки.

Чи є спосіб мати різні вікна оболонки?

Відповіді:


210

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.)


1
Добре, цей працює. Оболонка Cu Mx запитує у мене назву нової оболонки. Дякую!
S4M

1
Без проблем S4M. Я додав підказку для ешелла; як ви запитували про shell, я не знаю, чи не вважаєте ви його корисним, але користувачі eshell з тим самим питанням можуть вважати його корисним.
Метт Кертіс

Спасибі, Метт. Що тут означає / робить Ку?
Тім

4
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) переходить на сеанс із цим номером, створюючи його за потреби. Нечисловий аргумент з префіксом означає створити новий сеанс.
Метт Кертіс

34

Ви можете перейменувати буфер оболонки за допомогою M-x rename-buffer. Тоді ви зможете запустити другу оболонку.


2
Я вважаю за краще піти з рішенням Метта Кертіса. Запустити оболонку під новою назвою мені здається легше, ніж перейменувати поточну та потім запустити нову.
S4M


5

Також може бути корисним використання екранного інтерфейсу для оболонок. Я написав своє, але є й інші, наприклад EmacsScreen .


5

Після більш ніж чотирьох років я бачу, що деякі люди все ще дивляться на це питання іноді, тому я опублікую швидку функцію, яку я написав, щоб завантажити оболонку і запитати її назву. Таким чином ви можете назвати оболонку "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 "*"))))

4

Це автоматично створить новий екземпляр оболонки в будь-якому буфері, який ви використовуєте; прив'яжіть його до 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, хоча результат є ще жахливішими дужками ...: \


1
Вам потрібно letзв’язати змінні, якщо вони призначені для місцевого використання. Оскільки зараз у вас є глобальні цінності для currentbufта newbuf.
філс

як функція нової оболонки порівнюється з моєю функцією створення оболонки?
S4M

1
@ S4M - це головним чином питання уподобань, я лінивий і хочу, щоб моя оболонка була негайно, у поточному активному вікні і без необхідності вводити ім'я буфера вперед.
bjsdaiyu

@phils дякую за підказку, я зовсім не знайомий з lisp, тому перероблю його, використовуючи місцеве завдання. :-)
bjsdaiyu

хм, я думаю, ви можете взяти мою функцію і додати ім'я за замовчуванням, яке було б щось на зразок shell_n , де n було б відкритим n-ою оболонкою, тоді як Cu create-shell запропонує назву оболонки.
S4M

0

Це відкриє нову оболонку кожного разу, коли ви викликаєте функцію та автоматично перейменовуєте її, якщо потрібно. Додатковим плюсом є те, що якщо ви віддалено редагуєте файли (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)
  ))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.