it-swarm.com.de

Wie man mehrere Shells auf Emacs laufen lässt

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

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

132
S4M

C-uM-xShell werde es tun.

Es wird nach einem Namen für die neue Shell gefragt. Drücken Sie einfach die Eingabetaste für die Standardeinstellung (dies ist etwa *Shell*<2>).

Funktioniert auch mit Eshell.

Ein weiterer Trick, wenn Sie eshell verwenden: genau wie M-x eshell Sie kehren zu *eshell* zurück (anstatt eine neue Shell zu starten). Wenn Sie ein numerisches Präfix-Argument verwenden, gelangen Sie zu diesem Shell-Puffer. Zum Beispiel, C-3M-xeshell bringt Sie zu *eshell*<3>. Leider funktioniert dieser Trick nicht, wenn Sie Shell (und nicht Eshell) verwenden (zumindest in meinem Emacs 24.0.50.1).

196
Matt Curtis

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

29
Giann

In MultiTerm wird die Verwaltung mehrerer Terminals in Emacs wesentlich vereinfacht.

7
Victor Deryagin

Es kann auch nützlich sein, eine bildschirmähnliche Oberfläche für Ihre Shells zu verwenden. Ich habe mein eigenes geschrieben, aber es gibt noch andere, wie EmacsScreen .

5
Trey Jackson

Nach mehr als vier Jahren sehe ich, dass einige Leute sich dieses Problem manchmal noch ansehen. Ich werde eine schnelle Funktion veröffentlichen, die ich geschrieben habe, um eine Shell zu laden und nach dem Namen zu fragen. Auf diese Weise können Sie eine Shell "sort-files" benennen, wenn sie zum Sortieren von Dateien bestimmt ist, und eine andere "Hive", wenn sie Hive-Abfragen ausführen soll. 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 "*"))))
4
S4M

Dadurch wird automatisch eine neue Shell-Instanz in dem Puffer generiert, den Sie gerade verwenden. binden Sie es an M-S 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 ist ...

4
bjsdaiyu

Dadurch wird bei jedem Aufruf der Funktion eine neue Shell geöffnet und bei Bedarf automatisch umbenannt. 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 "%[email protected]" (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)
  ))
0
DenverCoder9