Более одного терминала emacs

Я все больше привык делать все изнутри emacs, но кажется, что eshell, shell и term будут запускать только один экземпляр каждый. Есть ли способ запуска нескольких терминалов (предпочтительно термин) внутри emacs?

Ответы

Ответ 1

Вам просто нужно переименовать буфер, вот функция для запуска zsh и запроса для имени буфера:

(defun zsh (buffer-name)
  "Start a terminal and rename buffer."
  (interactive "sbuffer name: ")
  (term "/bin/zsh")
  (rename-buffer buffer-name t))

Ответ 2

Используйте команду M-x rename-buffer, чтобы дать текущему буферу оболочки новое имя, затем вы можете запустить новую оболочку.

Ответ 3

Вы всегда можете создать новую оболочку с C-u M-x shell

Ответ 5

Вы можете переименовать термин и начать новый. Я использую что-то подобное, взял его у кого-то другого .emacs.

(require 'term)
(defun visit-ansi-term ()
  "If the current buffer is:
     1) a running ansi-term named *ansi-term*, rename it.
     2) a stopped ansi-term, kill it and create a new one.
     3) a non ansi-term, go to an already running ansi-term
        or start a new one while killing a defunt one"
  (interactive)
  (let ((is-term (string= "term-mode" major-mode))
        (is-running (term-check-proc (buffer-name)))
        (term-cmd "/bin/bash")
        (anon-term (get-buffer "*ansi-term*")))
    (if is-term
        (if is-running
            (if (string= "*ansi-term*" (buffer-name))
                (call-interactively 'rename-buffer)
              (if anon-term
                  (switch-to-buffer "*ansi-term*")
                (ansi-term term-cmd)))
          (kill-buffer (buffer-name))
          (ansi-term term-cmd))
      (if anon-term
          (if (term-check-proc "*ansi-term*")
              (switch-to-buffer "*ansi-term*")
            (kill-buffer "*ansi-term*")
            (ansi-term term-cmd))
        (ansi-term term-cmd)))))

Или вы можете иметь только один и запустить сеанс экрана в нем.

Ответ 6

Я лично использую screen -like пакет, который я написал, а там другая версия доступна на wiki: elscreen. Он обеспечивает удобные привязки клавиш для перехода к/между различными оболочками.

Ответ 7

Я изменил принятый ответ Харпо так, что он запускает новую оболочку без запроса, оболочки будут называться в форме * shell-1 *, * shell-2 *, * shell-3 * и т.д.:

(setq bash-counter 1)
(defun bash ()
  "Start a bash shell"
  (interactive)
  (setq bash-counter (+ bash-counter 1))
  (let
    ((explicit-shell-file-name "/bin/bash"))
    (shell (concat "*shell-" (number-to-string bash-counter) "*"))
    ))

Ответ 8

Здесь супер легкая небольшая функция, которую вы можете вызвать для автоматического переименования термина, в котором вы находитесь, и затем начать новый термин:

(defun new-ansi-term ()
  (interactive)
  (if (string= "*ansi-term*" (buffer-name))
      (rename-uniquely))
  (ansi-term "/bin/bash"))

Затем, чтобы связать это в ansi-term, я нашел, что это работает:

(defvar ansi-term-after-hook nil)
(add-hook 'ansi-term-after-hook
          '(lambda ()
             (define-key term-raw-map (kbd "C-t") 'new-ansi-term)))
(defadvice ansi-term (after ansi-term-after-advice (org))
  (run-hooks 'ansi-term-after-hook))
(ad-activate 'ansi-term)

Если вы также привязываете new-ansi-term к Ct обычным способом, вы обнаружите, что, когда вы не смотрите ansi-term, Ct сосредоточит буфер ansi-term, а затем, если вы смотрят на ansi-term, Ct переименует его в какое-то уникальное имя, а затем откроет для вас новый анси-термин. Это работает очень хорошо в сочетании с tabbar, который покажет вам все ваши открытые ansi-термины чуть выше первой строки буфера. Легко переключаться между ними; -)