2010-05-07 3 views
14

Je suis de plus en plus habitué à tout faire depuis l'intérieur d'emacs, mais il semble que eshell, shell et term n'exécuteront qu'une instance chacun. Existe-t-il un moyen d'exécuter plusieurs terminaux (de préférence terme) à l'intérieur d'emacs?Plus d'un terminal emacs

+6

Il arrive encore de temps en temps que les gens votent pour fermer les questions Emacs comme "non liés à la programmation". Je ne suis pas d'accord. Si la question concernait la mise en forme d'une perspective Eclipse ou la configuration de Visual Studio pour la lecture d'un flux RSS, personne ne songerait à la recommander de la sorte. Cela n'a aucun sens de traiter les questions liées à emacs de cette façon. (ps: avoir un upvote) – Cheeso

Répondre

8

Il vous suffit de renommer le tampon, voici une fonction pour démarrer zsh et demande le nom du tampon:

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

Utilisez la commande M-x rename-buffer pour donner le shell courant tampon un nouveau nom, alors vous pouvez commencer une nouvelle coquille.

+11

Vous pouvez également utiliser 'M-x rename-uniquely' pour laisser Emacs trouver le nouveau nom –

5

Vous pouvez toujours créer un nouveau shell avec C-u shell M-x

+0

dépend de l'OS sous-jacent, si vous obtenez un autre shell ou sauter à l'existant –

2

Vous pouvez renommer un terme et commencer une nouvelle. J'utilise quelque chose comme ça, je l'ai pris chez quelqu'un d'autre.

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

Ou vous pouvez avoir un seul et commencer une screen session en elle.

1

Personnellement, j'utilise un paquet semblable à screen que j'ai écrit, et il y a une autre version disponible sur le wiki ici: elscreen. Il fournit des raccourcis clavier pratiques pour sauter vers/entre les différentes coques.

0

J'ai modifié la réponse acceptée par Harpo pour qu'il démarre une nouvelle coquille sans demander, des coquillages sera nommé sous la forme * shell-1 *, * shell-2 *, * coquille 3 * etc .:

(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) "*")) 
    )) 
0

Voici une petite fonction super léger que vous pouvez appeler pour renommer automatiquement le terme que vous » re sur, puis commencer un nouveau terme:

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

ensuite à se lier qu'à l'intérieur terme ansi, je trouve cela fonctionne:

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

Si vous Rabattre aussi nouveau-ansi-terme Ct de façon normale, vous constaterez que lorsque vous Ne regardez pas un terme d'ansi, Ct mettra l'accent sur le tampon ansi-terme, et si vous regardez un terme-année, Ct le renommera en un nom unique, puis ouvrira un nouveau terme pour vous . Cela fonctionne très bien en combinaison avec tabbar, qui vous montrera tous vos ansi-termes ouverts juste au-dessus de la première ligne du tampon. Facile de basculer entre eux ;-)

Questions connexes