Risposte:
C-u M-x shell lo farà.
Richiederà un nome per la nuova shell, basta premere return per impostazione predefinita (che sarà qualcosa del genere *shell*<2>
.
Funziona anche con eshell.
Un altro trucco, se usi eshell: proprio come M-x eshellti riporta a *eshell*
(piuttosto che avviare una nuova eshell), se usi un argomento con prefisso numerico ti porterà a quel buffer eshell. Ad esempio, C-3M-xeshellti porterà a *eshell*<3>
. Purtroppo se usi shell (anziché eshell), questo trucco non sembra funzionare (almeno nel mio Emacs 24.0.50.1).
C-u
esegue il comando universal-argument
. È un modo per iniettare un argomento nel comando successivo. Puoi leggere di più a riguardo con C-h k C-u
( C-h k
corre describe-key
, molto utile!)
C-h f eshell
( C-h f
corre describe-function
) mostra che la funzione eshell
accetta un argomento opzionale. Citazione: un prefisso numerico arg (come in C-u 42 M-x eshell RET
) passa alla sessione con quel numero, creandolo se necessario. Un prefisso non numerico arg significa creare una nuova sessione.
È possibile rinominare il buffer della shell con M-x rename-buffer. Quindi sarai in grado di lanciare una seconda shell.
Guarda MultiTerm , semplifica la gestione di più terminali in Emacs.
Potrebbe anche essere utile utilizzare un'interfaccia simile a uno schermo per le tue shell. Ho scritto il mio, ma ce ne sono altri là fuori, come EmacsScreen .
Dopo più di quattro anni, vedo che alcune persone stanno ancora affrontando questo problema a volte, quindi pubblicherò una rapida funzione che ho scritto per caricare una shell e chiederne il nome. In questo modo è possibile denominare una shell "sort-files" se è dedicata all'ordinamento dei file e un'altra "hive" se è dedicata all'esecuzione di query hive. Lo uso tutti i giorni ora (su 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 "*"))))
Questo genererà automaticamente una nuova istanza della shell in qualunque buffer tu stia usando; associarlo a MS o qualcosa del genere e gioia istantanea:
(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)
)
)
Mille grazie a phils per aver raccomandato di riscrivere usando let, anche se il risultato è ancora più terribile tra parentesi ...: \
let
associare le variabili se sono destinate all'uso locale. Come è ora hai valori globali per currentbuf
e newbuf
.
Questo aprirà una nuova shell ogni volta che invocherai la funzione e la rinominerai automaticamente se necessario. Il vantaggio aggiunto è se si stanno modificando i file in remoto (dired / tramp ...), questo aprirà una shell sull'host remoto e lo rinominerà automaticamente con il nome host remoto:
(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)
))