Odpowiedzi:
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).
C-u
uruchamia 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 k
biegi describe-key
, bardzo przydatne!)
C-h f eshell
( C-h f
uruchamia describe-function
) pokazuje, że funkcja eshell
przyjmuje 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.
Możesz zmienić nazwę bufora swojej powłoki za pomocą M-x rename-buffer. Wtedy będziesz mógł odpalić drugą powłokę.
Spójrz na MultiTerm , znacznie ułatwia zarządzanie wieloma terminalami w Emacsie.
Przydatne może być również użycie interfejsu ekranowego do powłok. Napisałem własne, ale są też inne, takie jak EmacsScreen .
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 "*"))))
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 ...: \
let
wiązać zmienne, jeśli są przeznaczone do użytku lokalnego. Teraz masz globalne wartości dla currentbuf
i newbuf
.
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)
))