Jak uruchomić wiele powłok w Emacsie

147

Używam Emacsa 23.3.1 w Windows 7. Wiem, że mogę uruchomić powłokę z emacsa używając powłoki Mx. Chciałbym mieć wiele okien powłoki w tym samym czasie, ale wpisanie powłoki Mx po raz drugi otwiera mi to samo okno powłoki.

Czy jest sposób, aby mieć różne okna powłoki?

S4M
źródło

Odpowiedzi:

210

C-u M-x shell zrobię to.

Zostanie wyświetlony monit o nazwę nowej powłoki, po prostu naciśnij klawisz powrotu, aby ustawić wartość domyślną (będzie to coś w rodzaju *shell*<2>.

Działa również z eshell.

Kolejna sztuczka, jeśli używasz eshell: tak samo jak M-x eshellprzenosi cię z powrotem do *eshell*(zamiast rozpoczynania nowej eshell), jeśli użyjesz liczbowego prefiksu argumentu, przeniesie cię do tego bufora eshell. Na przykład C-3M-xeshellzabierze Cię do *eshell*<3>. Niestety, jeśli używasz powłoki (zamiast eshell), ta sztuczka wydaje się nie działać (przynajmniej w moim Emacs 24.0.50.1).

Matt Curtis
źródło
1
OK, ten działa. Cu Mx shell pyta mnie o nazwę nowej powłoki. Dzięki!
S4M
1
Żadnych problemów S4M. Dodałem wskazówkę dotyczącą eshell; jak pytałeś o powłokę, nie wiem, czy uznasz ją za przydatną, ale użytkownicy eshell z tym samym pytaniem mogą uznać ją za przydatną.
Matt Curtis,
Dzięki, Matt. Co tu oznacza Cu?
Tim
4
C-uuruchamia polecenie universal-argument. Jest to sposób na wprowadzenie argumentu do następnego polecenia. Możesz przeczytać więcej na ten temat z C-h k C-u( C-h kbiegi describe-key, bardzo przydatne!)
Matt Curtis
Następnie C-h f eshell( C-h furuchamia describe-function) pokazuje, że funkcja eshellprzyjmuje opcjonalny argument. Cytat: numeryczny prefiks arg (jak w C-u 42 M-x eshell RET) przełącza na sesję z tym numerem, tworząc go w razie potrzeby. Nienumeryczny prefiks arg oznacza utworzenie nowej sesji.
Matt Curtis,
34

Możesz zmienić nazwę bufora swojej powłoki za pomocą M-x rename-buffer. Wtedy będziesz mógł odpalić drugą powłokę.

Giann
źródło
2
Wolę skorzystać z rozwiązania Matta Curtisa. Wydaje mi się, że uruchomienie powłoki pod nową nazwą jest łatwiejsze niż zmiana nazwy bieżącej i uruchomienie nowej.
S4M
8

Spójrz na MultiTerm , znacznie ułatwia zarządzanie wieloma terminalami w Emacsie.

Victor Deryagin
źródło
1
Zauważ, że tryb powłoki i tryb terminów to dwie zupełnie różne rzeczy.
darkfeline
5

Przydatne może być również użycie interfejsu ekranowego do powłok. Napisałem własne, ale są też inne, takie jak EmacsScreen .

Trey Jackson
źródło
5

Po ponad czterech latach widzę, że niektórzy ludzie nadal czasami patrzą na ten problem, więc opublikuję szybką funkcję, którą napisałem, aby załadować powłokę i zapytać o jej nazwę. W ten sposób możesz nazwać powłokę „sort-files”, jeśli jest przeznaczona do sortowania plików, a kolejną „gałąź”, jeśli jest przeznaczona do uruchamiania zapytań gałęzi. Używam tego codziennie (na 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
źródło
4

Spowoduje to automatyczne wygenerowanie nowej instancji powłoki w jakimkolwiek buforze, którego używasz; związać go ze stwardnieniem rozsianym lub czymś podobnym i natychmiastową radością:

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

Wielkie dzięki dla phils za zalecenie przepisania przy użyciu let, mimo że wynikiem są jeszcze okropniejsze nawiasy ...: \

bjsdaiyu
źródło
1
Musisz letwiązać zmienne, jeśli są przeznaczone do użytku lokalnego. Teraz masz globalne wartości dla currentbufi newbuf.
phils
Jak wypada funkcja nowej powłoki w porównaniu z moją funkcją tworzenia powłoki?
S4M
1
@ S4M to głównie kwestia preferencji, jestem leniwy i chcę mieć moją powłokę natychmiast, w aktualnie aktywnym oknie i bez konieczności wpisywania nazwy bufora z góry.
bjsdaiyu
@phils dzięki za wskazówkę, w ogóle nie jestem zaznajomiony z lispem, więc przerobię to, używając lokalnego zadania. :-)
bjsdaiyu
hmm, myślę, że możesz wziąć moją funkcję i dodać domyślną nazwę, która byłaby podobna do shell_n , gdzie n byłoby n-tą otwartą powłoką, podczas gdy Cu create-shell zapyta o nazwę powłoki.
S4M
0

Spowoduje to otwarcie nowej powłoki za każdym razem, gdy wywołasz funkcję i automatycznie zmieni jej nazwę w razie potrzeby. Dodatkowym plusem jest to, że jeśli edytujesz pliki zdalnie (dired / tramp ...), otworzy to powłokę na zdalnym hoście i automatycznie zmieni jej nazwę na zdalną nazwę hosta:

(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
źródło