Cách chạy nhiều shell trên Emacs


147

Tôi đang sử dụng Emacs 23.3.1 trên windows 7. Tôi biết rằng tôi có thể chạy shell từ emacs bằng Mx shell. Tôi muốn có nhiều cửa sổ shell cùng một lúc, nhưng gõ Mx shell lần thứ hai chỉ mở cho tôi cùng một cửa sổ shell.

Có cách nào để có cửa sổ vỏ khác nhau?

Câu trả lời:


210

C-u M-x shell sẽ làm điều đó.

Nó sẽ nhắc tên cho shell mới, chỉ cần nhấn return cho mặc định (sẽ giống như thế *shell*<2>.

Cũng hoạt động với eshell.

Một mẹo khác, nếu bạn sử dụng eshell: giống như M-x eshellđưa bạn trở lại *eshell*(thay vì bắt đầu một eshell mới), nếu bạn sử dụng một đối số tiền tố số, nó sẽ đưa bạn đến bộ đệm eshell đó. Ví dụ, C-3M-xeshellsẽ đưa bạn đến *eshell*<3>. Đáng buồn thay nếu bạn sử dụng shell (chứ không phải eshell), thủ thuật này dường như không hoạt động (ít nhất là trong Emacs 24.0.50.1 của tôi.)


1
OK, cái này hoạt động. Vỏ Cu Mx hỏi tôi tên của vỏ mới. Cảm ơn!
S4M

1
Không có vấn đề S4M. Tôi đã thêm một mẹo cho eshell; như bạn đã hỏi về shell Tôi không biết liệu bạn có thấy nó hữu ích không, nhưng những người dùng có cùng câu hỏi có thể thấy nó hữu ích.
Matt Curtis

Cảm ơn, Matt. Cu có nghĩa là gì / làm gì ở đây?
Tim

4
C-uchạy lệnh universal-argument. Đó là một cách để đưa một đối số vào lệnh tiếp theo. Bạn có thể đọc thêm về nó với C-h k C-u( C-h kchạy describe-key, rất tiện dụng!)
Matt Curtis

Sau đó C-h f eshell( C-h fchạy describe-function) cho thấy hàm eshelllấy một đối số tùy chọn. Trích dẫn: Một tiền tố số arg (như trong C-u 42 M-x eshell RET) chuyển sang phiên có số đó, tạo nó nếu cần thiết. Một tiền tố nonnumeric arg có nghĩa là để tạo một phiên mới.
Matt Curtis

34

Bạn có thể đổi tên bộ đệm của vỏ của bạn với M-x rename-buffer. Sau đó, bạn sẽ có thể khởi chạy một vỏ thứ hai.


2
Tôi thích đi với giải pháp của Matt Curtis. Chạy shell dưới một tên mới đối với tôi có vẻ dễ dàng hơn so với đổi tên hiện tại và sau đó chạy một cái mới.
S4M

8

Nhìn vào MultiTerm , nó làm cho việc quản lý nhiều thiết bị đầu cuối trong Emacs dễ dàng hơn nhiều.


1
Lưu ý rằng chế độ shell và chế độ hạn là hai thứ hoàn toàn khác nhau.
darkfeline

5

Nó cũng có thể hữu ích khi sử dụng giao diện giống như màn hình cho hệ vỏ của bạn. Tôi đã viết riêng của mình, nhưng có những người khác ở ngoài đó, như EmacsScreen .


5

Sau hơn bốn năm, tôi thấy rằng đôi khi một số người vẫn đang xem xét vấn đề này, vì vậy tôi sẽ xuất bản một chức năng nhanh mà tôi đã viết để tải một trình bao và hỏi tên của nó. Bằng cách đó, bạn có thể đặt tên cho một "tập tin sắp xếp" shell nếu nó được dành riêng để sắp xếp các tập tin và một "tổ ong" khác nếu nó dành riêng để chạy các truy vấn tổ ong. Bây giờ tôi sử dụng nó hàng ngày (trên 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

Điều này sẽ tự động tạo một phiên bản shell mới trong bất kỳ bộ đệm nào bạn đang sử dụng; liên kết nó với MS hoặc đôi khi như thế và niềm vui tức thì:

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

Rất cám ơn các phils đã đề xuất viết lại bằng cách sử dụng let, mặc dù kết quả thậm chí còn là dấu ngoặc đơn khủng khiếp hơn ...: \


1
Bạn cần phải tìm letcác biến nếu chúng được sử dụng cho mục đích địa phương. Vì bây giờ bạn có các giá trị toàn cầu cho currentbufnewbuf.
phils

Hàm shell mới so với hàm tạo shell của tôi như thế nào?
S4M

1
@ S4M chủ yếu là vấn đề ưu tiên, tôi lười biếng và muốn có vỏ của mình ngay lập tức, trong cửa sổ hiện đang hoạt động và không phải nhập tên người dùng lên phía trước.
bjsdaiyu

@phils cảm ơn vì tiền boa, tôi hoàn toàn không quen với lisp nên sẽ làm lại bằng cách sử dụng bài tập địa phương. :-)
bjsdaiyu

hmm, tôi nghĩ rằng bạn có thể thực hiện chức năng của tôi và thêm một tên mặc định giống như shell_n , trong đó n sẽ là shell thứ n mở, trong khi trình tạo Cu sẽ nhắc tên cho shell.
S4M

0

Điều này sẽ mở một shell mới mỗi khi bạn gọi hàm và tự động đổi tên nó nếu cần. Điểm cộng được thêm vào là nếu bạn đang chỉnh sửa các tệp từ xa (dired / tramp ...), điều này sẽ mở một vỏ trên máy chủ từ xa và tự động đổi tên nó với tên máy chủ từ xa:

(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)
  ))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.