Làm cách nào tôi có thể chạy quy trình không đồng bộ trong nền mà không bật lên bộ đệm?


23

Tôi đã xác định một số chức năng để chạy quy trình nền không đồng bộ bằng cách sử dụng async-shell-commandtrong .emacs của mình, nhưng mỗi khi tôi chạy các lệnh, một cửa sổ mới (không phải khung) sẽ được tạo và bộ đệm của quy trình được hiển thị ở đó. Làm thế nào tôi có thể chạy lệnh mà không có bộ đệm "bật lên"?

Câu trả lời:


21

Bạn có thể bắt đầu các quá trình nền với start-process, không nên bật bộ đệm:

(start-process "process-name" "buffer-name" "program")

Tên quy trình được sửa đổi để tránh trùng lặp khi cần thiết, vì vậy đừng lo lắng về điều đó. Chỉ cần đặt cho nó một cái tên hữu ích để gỡ lỗi trong tương lai!

Nếu bạn đưa ra "buffer-name", một bộ đệm sẽ được tạo nhưng không được hiển thị ngay lập tức. Điều này có thể thuận tiện cho việc quản lý các quy trình và nhìn vào đầu ra. Nếu bạn không muốn tạo một bộ đệm, hãy chuyển nillàm tên bộ đệm:

(start-process "process-name" nil "program")

Có thể sử dụng start-processcho một lệnh sudo? Tôi cố gắng gói cuộc gọi của tôi để start-process(let ((default-directory "/sudo::")) ... )nhưng nó đã không làm việc cho tôi.
sid-kap

@ sid-kap: Tôi không biết. Bạn có thể nên hỏi đó là một câu hỏi độc lập.
Tikhon Jelvis

1
"program"trong trường hợp này chỉ là tên chương trình (ví dụ nautilus, caja, firefox) và "arg1 arg2 ..."phải nằm trong đối số vị trí thứ tư của start-process. Tôi đã tìm ra điều đó bằng cách đọc tài liệu :)
biocyberman

8

Giống như Tikhon đã đề cập, (start-process)là con đường để đi. Trong trường hợp bạn không muốn tạo bộ đệm nhưng vẫn muốn phản ứng với trạng thái quá trình nền, bạn cũng có thể sử dụng (set-process-sentinel). Đây là một ví dụ sửa đổi tôi lấy từ projectorgói của tôi :

(set-process-sentinel (start-process "process-name" nil "command") #'output-message-sentinel)

(defun output-message-sentinel (process msg)
  (when (memq (process-status process) '(exit signal))
    (message (concat (process-name process) " - " msg))))

Từ mô tả chức năng Emacs:

(set-process-sentinel PROCESS SENTINEL)

Give PROCESS the sentinel SENTINEL; nil for default.
The sentinel is called as a function when the process changes state.
It gets two arguments: the process, and a string describing the change.

Các trang hướng dẫn GNU trên Processes khá tốt để biết thêm thông tin.


Bạn có thể mô tả những gì set-process-sentinellàm chính xác hơn một chút? Tôi có ý tưởng chung về việc có một chức năng quản lý quy trình, nhưng tôi không hiểu đầy đủ tất cả các chi tiết. Cảm ơn!
Tikhon Jelvis

Nếu bạn làm M-x describe-functionvà nhập, set-process-sentinelbạn sẽ nhận được câu trả lời ngắn từ tài liệu Emacs: (set-process-sentinel PROCESS SENTINEL) Cung cấp PROCESS cho sentinel SENTINEL; nil cho mặc định. Sentinel được gọi là một hàm khi quá trình thay đổi trạng thái. Nó nhận được hai đối số: quá trình và một chuỗi mô tả sự thay đổi.
waymondo

1
Các trang hướng dẫn GNU Emacs trên SentinelsProcesses thực sự khá tốt để có thông tin chi tiết hơn.
waymondo

Mát mẻ. Có lẽ bạn có thể chỉnh sửa các liên kết vào câu trả lời của bạn? Tôi đoán người ta cũng có thể tìm hiểu thêm chỉ bằng cách sử dụng C-h f...
Tikhon Jelvis

2

Không cần thay đổi cách bạn chạy lệnh không đồng bộ. Emacs có một khả năng chung để cho phép bạn kiểm soát vị trí hoặc bất kỳ bộ đệm nào sẽ bật lên, bằng cách sửa đổi một cấu trúc dữ liệu duy nhất , display-buffer-alist.

Trong giải pháp bên dưới, bạn có thể thấy rằng hàm hành động display-buffer-no-window(nghĩa là không có cửa sổ bật lên) được đặt để được liên kết với bất kỳ bộ đệm nào có tên bắt đầu *Asynchronous Shell Command*(emacs thêm một hậu tố gia tăng khi được yêu cầu tạo nhiều hơn một).

Để xem danh sách các tùy chọn hiển thị có sẵn khác, hãy nhập C-h f display-buffervà tìm danh sách "các chức năng hành động".

;; Buffers that I don't want popping up by default
(add-to-list 'display-buffer-alist
  '("\\*Async Shell Command\\*.*" display-buffer-no-window))
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.