So führen Sie mehrere Shells auf Emacs aus

146

Ich verwende Emacs 23.3.1 unter Windows 7. Ich weiß, dass ich Shell von Emacs mit Mx Shell ausführen kann. Ich möchte mehrere Shell-Fenster gleichzeitig haben, aber wenn ich Mx-Shell ein zweites Mal tippe, wird mir nur das gleiche Shell-Fenster geöffnet.

Gibt es eine Möglichkeit, verschiedene Shell-Fenster zu haben?

S4M
quelle

Antworten:

209

C-u M-x shell werde es tun.

Es wird nach einem Namen für die neue Shell gefragt. Drücken Sie einfach die Eingabetaste für die Standardeinstellung (was ungefähr so ​​sein wird) *shell*<2> .

Funktioniert auch mit eshell.

Ein weiterer Trick, wenn Sie Eshell verwenden: wie M-x eshellbringt Sie zurück zu *eshell*(anstatt eine neue Eshell Start), wenn Sie ein numerisches Präfix Argument wird es Sie , dass nehmen eShell puffern. Zum Beispiel C-3M-xeshellbringen Sie zu *eshell*<3>. Leider scheint dieser Trick nicht zu funktionieren, wenn Sie Shell (anstatt Eshell) verwenden (zumindest in meinem Emacs 24.0.50.1).

Matt Curtis
quelle
1
OK, das funktioniert. Cu Mx Shell fragt mich nach dem Namen der neuen Shell. Vielen Dank!
S4M
1
Keine Probleme S4M. Ich habe einen Tipp für eshell hinzugefügt. Als Sie nach Shell gefragt haben, weiß ich nicht, ob Sie es nützlich finden, aber eshell-Benutzer mit derselben Frage finden es möglicherweise nützlich.
Matt Curtis
Danke, Matt. Was bedeutet Cu hier?
Tim
4
C-uführt den Befehl aus universal-argument. Auf diese Weise können Sie dem nächsten Befehl ein Argument hinzufügen. Sie können mehr darüber lesen mit C-h k C-u( C-h kläuft describe-key, sehr praktisch!)
Matt Curtis
Dann C-h f eshell( C-h fläuft describe-function) zeigt, dass die Funktion eshellein optionales Argument akzeptiert. Quote: Ein numerisches Präfix arg (wie in C-u 42 M-x eshell RET) wechselt zu der Sitzung mit dieser Nummer und erstellt sie bei Bedarf. Ein nicht numerisches Präfix arg bedeutet, dass eine neue Sitzung erstellt wird.
Matt Curtis
33

Sie können den Puffer Ihrer Shell mit umbenennen M-x rename-buffer. Dann können Sie eine zweite Shell starten.

Giann
quelle
2
Ich bevorzuge die Lösung von Matt Curtis. Das Ausführen einer Shell unter einem neuen Namen scheint mir einfacher zu sein, als die aktuelle umzubenennen und dann eine neue auszuführen.
S4M
8

Schauen Sie sich MultiTerm an , es erleichtert die Verwaltung mehrerer Terminals in Emacs erheblich.

Victor Deryagin
quelle
1
Beachten Sie, dass der Shell-Modus und der Term-Modus zwei völlig verschiedene Dinge sind.
Darkfeline
5

Es kann auch nützlich sein, eine bildschirmähnliche Oberfläche für Ihre Shells zu verwenden. Ich habe meine eigenen geschrieben, aber es gibt andere da draußen, wie EmacsScreen .

Trey Jackson
quelle
5

Nach mehr als vier Jahren sehe ich, dass sich einige Leute manchmal immer noch mit diesem Problem befassen. Daher werde ich eine kurze Funktion veröffentlichen, die ich geschrieben habe, um eine Shell zu laden und nach ihrem Namen zu fragen. Auf diese Weise können Sie eine Shell als "Sortierdateien" bezeichnen, wenn sie zum Sortieren von Dateien bestimmt ist, und eine andere als "Bienenstock", wenn sie zum Ausführen von Bienenstockabfragen vorgesehen ist. Ich benutze das jetzt jeden Tag (auf 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 "*"))))
S4M
quelle
4

Dadurch wird automatisch eine neue Shell-Instanz in dem Puffer generiert, den Sie gerade verwenden. binde es an MS oder ähnliches und sofortige Freude:

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

Vielen Dank an phils für die Empfehlung eines Umschreibens mit let, obwohl das Ergebnis noch schrecklichere Klammern sind ...: \

bjsdaiyu
quelle
1
Sie müssen letVariablen binden, wenn sie für die lokale Verwendung vorgesehen sind. So wie es ist, haben Sie jetzt globale Werte für currentbufund newbuf.
Phils
Wie vergleicht sich die New-Shell-Funktion mit meiner Create-Shell-Funktion?
S4M
1
@ S4M es ist hauptsächlich ein Problem der Präferenz, ich bin faul und möchte meine Shell sofort, im aktuell aktiven Fenster und ohne vorher einen Buffernamen eingeben zu müssen.
Bjsdaiyu
@phils danke für den Tipp, ich bin mit lisp überhaupt nicht vertraut, also werde ich es mit lokaler Zuordnung überarbeiten. :-)
bjsdaiyu
hmm, ich denke, Sie können meine Funktion übernehmen und einen Standardnamen hinzufügen, der ungefähr so aussieht wie shell_n , wobei n die n-te geöffnete Shell ist, während Cu create-shell einen Namen für die Shell auffordert .
S4M
0

Dadurch wird jedes Mal, wenn Sie die Funktion aufrufen, eine neue Shell geöffnet und bei Bedarf automatisch umbenannt. Das zusätzliche Plus ist, wenn Sie Dateien remote bearbeiten (dired / tramp ...), wird eine Shell auf dem Remote-Host geöffnet und automatisch mit dem Remote-Hostnamen umbenannt:

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