Come eseguire più shell su Emacs


147

Sto usando Emacs 23.3.1 su Windows 7. So che posso eseguire shell da Emacs usando Mx shell. Vorrei avere più finestre shell allo stesso tempo, ma digitando Mx shell una seconda volta mi si apre la stessa finestra shell.

C'è un modo per avere diverse finestre shell?

Risposte:


210

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


1
OK, questo funziona. Cu Mx shell mi chiede il nome della nuova shell. Grazie!
S4M,

1
Nessun problema S4M. Ho aggiunto un suggerimento per eshell; come hai chiesto di shell non so se lo troverai utile, ma gli utenti eshell con la stessa domanda potrebbero trovarlo utile.
Matt Curtis,

Grazie Matt. Cosa vuol dire / fare Cu qui?
Tim

4
C-uesegue 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 kcorre describe-key, molto utile!)
Matt Curtis,

Quindi C-h f eshell( C-h fcorre describe-function) mostra che la funzione eshellaccetta 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.
Matt Curtis,

34

È possibile rinominare il buffer della shell con M-x rename-buffer. Quindi sarai in grado di lanciare una seconda shell.


2
Preferisco andare con la soluzione di Matt Curtis. Eseguire una shell con un nuovo nome mi sembra più facile che rinominare quello attuale e quindi eseguirne uno nuovo.
S4M,


5

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 .


5

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

4

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 ...: \


1
È necessario letassociare le variabili se sono destinate all'uso locale. Come è ora hai valori globali per currentbufe newbuf.
phils,

come si confronta la funzione new-shell con la mia funzione create-shell?
S4M,

1
@ S4M è principalmente un problema di preferenza, sono pigro e voglio la mia shell immediatamente, nella finestra attualmente attiva e senza dover digitare un nome utente in anticipo.
bjsdaiyu,

@phils grazie per il suggerimento, non ho alcuna familiarità con lisp, quindi lo rielaborerò usando un incarico locale. :-)
bjsdaiyu

hmm, penso che tu possa prendere la mia funzione e aggiungere un nome predefinito che sarebbe qualcosa come shell_n , dove n sarebbe l'ennesima shell aperta, mentre Cu create-shell richiederebbe un nome per la shell.
S4M,

0

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)
  ))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.