Более одного терминала Emacs - PullRequest
14 голосов
/ 07 мая 2010

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

Ответы [ 8 ]

17 голосов
/ 07 мая 2010

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

10 голосов
/ 07 мая 2010

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

(defun zsh (buffer-name)
  "Start a terminal and rename buffer."
  (interactive "sbuffer name: ")
  (term "/bin/zsh")
  (rename-buffer buffer-name t))
6 голосов
/ 07 мая 2010

Вы всегда можете создать новую оболочку с Cu Mx shell

2 голосов
/ 07 мая 2010

Вы можете переименовать термин и начать новый. Я использую что-то подобное, взял это у кого-то другого .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)))))

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

2 голосов
/ 07 мая 2010
1 голос
/ 07 мая 2010

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

0 голосов
/ 07 сентября 2012

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

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

Затем, чтобы связать это в течение одного семестра, я обнаружил, что это работает:

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

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

0 голосов
/ 21 марта 2012

Я изменил принятый ответ Harpo, чтобы он запускал новую оболочку без запроса, оболочки будут называться в виде * 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) "*"))
    ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...