2011-06-30 37 views
118

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ừ các emacs bằng cách sử dụng M-x shell. Tôi muốn có nhiều cửa sổ shell trong cùng một thời gian, nhưng gõ M-x shell lần thứ hai chỉ mở cho tôi cùng một cửa sổ shell.Làm thế nào để chạy nhiều shell trên Emacs

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

Trả lời

163

C-uM-xvỏ sẽ làm điều đó.

Nó sẽ nhắc nhở cho một tên cho vỏ mới, chỉ cần ấn Enter để mặc định (mà sẽ là một cái gì đó giống như *shell*<2>

Cũng làm việc với eshell

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

+1

OK, cái này hoạt động. C-u M-x shell hỏi tôi tên của shell mới. Cảm ơn! – S4M

+1

Không có vấn đề gì S4M.Tôi đã thêm một mẹo cho eshell; khi bạn hỏi về trình bao, tôi không biết liệu bạn có thấy nó hữu ích hay không, nhưng người dùng eshell với cùng một câu hỏi có thể thấy nó hữu ích. –

+2

Đã học được điều gì đó ở đây, cảm ơn! – Giann

26

Bạn có thể đổi tên bộ đệm của vỏ bằng M-x đổi tên bộ đệm. Sau đó, bạn sẽ có thể khởi động trình bao thứ hai.

+2

tôi thích đi với Matt Giải pháp của Curtis. Chạy một trình bao dưới tên mới có vẻ dễ hơn đổi tên cái hiện tại và sau đó chạy một cái mới. – S4M

7

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

+0

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

5

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

4

Thao tác này sẽ tự động tạo một thể hiện vỏ mới trong bất kỳ bộ đệm nào bạn đang sử dụng; ràng buộc nó vào MS hoặc somethings như thế và niềm vui ngay lập tức:

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

Nhiều nhờ Phils cho giới thiệu một viết lại sử dụng phép, mặc dù kết quả là thậm chí ngoặc khủng khiếp hơn ...: \

+1

Bạn cần phải 'cho'-ràng buộc các biến nếu chúng được dự định để sử dụng tại địa phương. Vì bây giờ bạn có các giá trị toàn cục cho 'currentbuf' và' newbuf'. – phils

+0

Hàm new-shell so sánh với hàm tạo-vỏ của tôi như thế nào? – S4M

+1

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

4

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

Điều này sẽ mở ra một vỏ mới mỗi khi bạn gọi hàm và đổi tên nó tự động nếu cần. Các cộng thêm là nếu bạn đang chỉnh sửa tập tin từ xa (dired/tramp ...), điều này sẽ mở ra một lớp vỏ trên máy chủ từ xa và đổi tên nó tự động 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 "%[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) 
)) 
Các vấn đề liên quan