2010-05-07 5 views
14

Sto diventando sempre più abituato a fare tutto da dentro emacs, ma sembra che eshell, shell e term eseguiranno solo un'istanza ciascuno. Esiste un modo per eseguire più terminali (preferibilmente termine) all'interno di emacs?Più di un terminale emacs

+6

Succede ancora di volta in volta che le persone votino per chiudere le domande di emacs come "non correlate alla programmazione". Non sono d'accordo Se la domanda riguardasse come formattare una prospettiva di Eclipse, o come impostare Visual Studio per leggere un feed rss, nessuno prenderebbe in considerazione la possibilità di raccomandarlo per la chiusura in questo modo. Non ha senso trattare le domande relative a emacs in questo modo. (ps: avere un upvote) – Cheeso

risposta

8

Basta rinominare il buffer, ecco una funzione per avviare zsh e richiedere il nome del buffer:

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

Utilizzare il comando M-x rename-buffer per dare la shell corrente buffer di un nuovo nome, allora si può iniziare una nuova shell.

+11

Puoi anche usare 'M-x rename-uniquely' per consentire a emacs di trovare il nuovo nome –

5

si può sempre creare una nuova shell con C-u M-x guscio

+0

dipende dal sistema operativo sottostante, sia che tu ottenga UN'ALTRA shell o che passi a quella esistente –

2

È possibile rinominare un termine e iniziare uno nuovo. Sto usando qualcosa del genere, preso da qualcun altro .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))))) 

Oppure si può avere un solo e iniziare una screen session in esso.

1

Io personalmente uso un pacchetto screen -like che ho scritto e c'è un'altra versione disponibile sul wiki qui: elscreen. Fornisce comode associazioni di tasti per saltare a/tra i diversi gusci.

0

Ho modificato la risposta accettata dalla Harpo in modo che inizi una nuova shell senza chiedere conferma, conchiglie sarà nominato nella forma * shell-1 *, * shell-2 *, * shell-3 * ecc .:

(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

Ecco una piccola funzione super leggero che si può chiamare per rinominare automaticamente il termine si' re e quindi iniziare un nuovo termine:

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

Poi, per legare che entro ansi-termine, ho trovato questo funziona:

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

Se poi si associa anche il nuovo-ansi-termine al Ct in modo normale, troverete che quando si Non guardando un termine ansioso, Ct metterà a fuoco il buffer ansi-termine, e poi se stai guardando un termine ansi, Ct lo rinominerà con un nome univoco, e quindi aprirà un nuovo termine ansi-term per te . Funziona molto bene in combinazione con la tabbar, che ti mostrerà tutti i tuoi termini ansi aperti appena sopra la prima riga del buffer. Facile da cambiare tra di loro ;-)