Cách tạo lệnh shell hoàn toàn im lặng (ngăn không cho cửa sổ tách hoặc mở khung / cửa sổ mới, v.v.)


8

Có thể chạy một lệnh shell một cách im lặng (trong nền)? Khi tôi sử dụng async-shell-command, emacs chia các cửa sổ. Tôi muốn rằng một lệnh shell cụ thể hoàn toàn ở chế độ nền (không có bất kỳ hiệu ứng hình ảnh nào).

Để làm ví dụ rõ ràng, tôi có đoạn mã sau (mượn từ https://emacs.stackexchange.com/a/7932 ). Nó mở phiên bản pdf của tệp tex tôi đang làm việc. Khi chạy nó, nó sẽ chia cửa sổ, tôi muốn ngăn nó khỏi hành vi này trong tình huống cụ thể này.

 (defun my-view-pdf ()
  (interactive)
  (async-shell-command
    (concat "SumatraPDF " (file-name-base (buffer-file-name)) ".pdf")))

3
Không phải về câu hỏi trừu tượng, nhưng trường hợp sử dụng cụ thể: Bạn có đang sử dụng AocateeX không? Bất kỳ lý do cụ thể nào bạn không sử dụng TeX-view( C-c C-v)?
Dan

@Dan vấn đề là khi tôi không làm C-c C-vgì cả. Tôi không hiểu tại sao. Nếu bạn biết một tùy chỉnh đơn giản trong .emacsđó tạo ra C-c C-vcác tác phẩm, tôi sẽ rất vui khi sử dụng nó. Hệ điều hành của tôi là Windows và trình xem pdf của tôi được đặt tại C:\Program Files\SumatraPDF\sumatrapdf.exe. Trong đó liên kết danh sách pháp luật đã cung cấp một liên kết toàn diện. Tôi chỉ quan tâm để làm cho TeX-người xem hoạt động.
Tên

Không phải trên Windows, vì vậy không thể nói lý do tại sao bạn gặp vấn đề. Bạn có thể thử làm việc với TeX-view-program-list.
Dan

Câu hỏi này có câu trả lời rất hay vì vậy tôi sẽ ghét việc này để được đóng lại. Nhưng đây là một bản sao của câu hỏi này: emacs.stackexchange.com/q/5553/115
Kaushal Modi

Câu trả lời:


8

save-window-excursionlà một macro để chạy một đoạn mã mà không thay đổi cấu hình cửa sổ. Một cái gì đó như thế này sẽ hoạt động:

 (defun my-view-pdf ()
  (interactive)
  (save-window-excursion
   (async-shell-command
     (concat "SumatraPDF " (file-name-base (buffer-file-name)) ".pdf"))))

Macro đẹp, tôi xác nhận rằng giải pháp của bạn hoạt động.
Tên

2
@legoscia Bạn đang tìm kiếm save-window-excursion, gần giống với triển khai của bạn.
bmag 04/07/2015

@bmag Tôi muốn biết về sự khác biệt giữa save-window-excursionsave-window-configuration. Dường như cả hai đều làm việc trong tình huống này.
Tên

1
@ Tên Không có sự khác biệt, ngoại trừ việc save-window-excursionsử dụng một số thực tiễn tốt nhất vĩ mô để tránh đưa các biến vào môi trường của cơ thể. Ngoài ra, save-window-excursionđược tích hợp vào Emacs. Tôi đã tìm kiếm macro đó, nhưng không tìm thấy nó, vì vậy tôi đã viết phiên bản của riêng tôi. May mắn thay bmag biết người thực sự.
Legoscia 7/07/2015

8

Nếu bạn chỉ muốn tạo ra một quá trình trong nền, bạn không cần tất cả những tiếng chuông mà các hàm lệnh shell cung cấp.

Thay vào đó, bạn có thể sử dụng chức năng call-process. Ví dụ:

(call-process
 "a_command"
 nil
 0                                  ; <- Discard and don't wait
 nil
 "arg1"
 "arg2")

Cụ thể, điều này có nghĩa là bạn có thể thực hiện lệnh của bạn như:

(defun my-view-pdf ()
    (interactive)
    (call-process "SumatraPDF" nil 0 nil
                  (concat (file-name-base (buffer-file-name)) ".pdf")))

Tôi đã cố gắng áp dụng đề xuất của bạn cho ví dụ cụ thể của tôi (defun my-pdf-viewer () (interactive) (call-process (async-shell-command (concat "SumatraPDF " (file-name-base (buffer-file-name)) ".pdf")) nil 0 ; <- Discard and don't wait nil "arg1" "arg2") )Tôi nhận được lỗi `Đối số kiểu sai: stringp, comint-output-filter`. Tôi không chắc liệu cú pháp tôi sử dụng có đúng không.
Tên

Bạn nên thả async-shell-commandtất cả lại với nhau. Nó sẽ là một cái gì đó như (defun my-pdf-viewer () (interactive) (call-process "SumatraPDF" nil 0 nil (concat (file-name-base (buffer-file-name)) ".pdf")).
Lindydancer

1
Cảm ơn bạn, giải pháp của bạn hoạt động hoàn hảo, chỉ có một dấu ngoặc bị thiếu, vì vậy mã chính xác phải là : (defun my-view-pdf () (interactive) (call-process "SumatraPDF" nil 0 nil (concat (file-name-base (buffer-file-name)) ".pdf"))) .
Tên

@Name, cảm ơn, tôi đã cập nhật câu trả lời để bao gồm chức năng cụ thể.
Lindydancer

7

Sử dụng display-buffer-alistvới display-buffer-no-windownếu bạn trên Emacs 24.4 trở lên.

(setq display-buffer-alist '(("\\`\\*Async Shell Command\\*\\'" display-buffer-no-window)))

Ngoài ra, sử dụng còng :

(setq shackle-rules '(("*Async Shell Command*" :ignore t)))

Sử dụng (setq display-buffer-alist '(("\`\\*Async Shell Command\\*\\'" display-buffer-no-window)))tôi nhận được lỗi apply: Wrong type argument: sequencep, display-buffer-no-window.
Tên

Ồ đúng rồi, display-buffer-no-windowđã được giới thiệu trong Emacs 24.4, vì vậy nó sẽ không hoạt động. Mặt khác, gói của tôi sẽ hoạt động vào ngày 24.3.
wasamasa

Backporting display-buffer-no-windowlà một tùy chọn thứ ba, chỉ cần chèn (defun display-buffer-no-window (_buffer alist) (when (cdr (assq 'allow-no-window alist)) 'fail))vào cấu hình Emacs của bạn.
wasamasa

Tôi đã cố gắng áp dụng bình luận cuối cùng của bạn bằng cách đặt tất cả mọi thứ lại với nhau (defun display-buffer-no-window (_buffer alist) (when (cdr (assq 'allow-no-window alist)) 'fail)) (setq display-buffer-alist '(("\`\\*Async Shell Command\\*\\'" display-buffer-no-window))) (defun my-view-pdf () (interactive) (progn (async-shell-command (concat "SumatraPDF " (file-name-base (buffer-file-name)) ".pdf")))) . Nhưng sau khi thực hiện my-view-pdf, emacs tách cửa sổ và *Async Shell Command*được hiển thị.
Tên

Tôi xác nhận rằng giải pháp của bạn hoàn toàn hoạt động cho phiên bản 24.4 trở lên.
Tên
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.