Bagaimana saya bisa menjalankan proses async di latar belakang tanpa memunculkan buffer?

23

Saya telah mendefinisikan beberapa fungsi untuk menjalankan proses async background menggunakan async-shell-command.emacs saya, tetapi setiap kali saya menjalankan perintah, sebuah jendela baru (bukan frame) dibuat dan buffer proses ditampilkan di sana. Bagaimana saya bisa menjalankan perintah tanpa buffer "pop up"?

rlazo
sumber

Jawaban:

21

Anda dapat memulai proses latar belakang start-process, yang seharusnya tidak memunculkan buffer:

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

Nama-nama proses dimodifikasi untuk menghindari duplikasi yang diperlukan, jadi jangan khawatir tentang itu. Berikan saja nama yang berguna untuk debugging di masa depan!

Jika Anda memberi "buffer-name", buffer akan dibuat tetapi tidak segera ditampilkan. Ini bisa nyaman untuk mengelola proses dan melihat output. Jika Anda tidak ingin buffer dibuat sama sekali, berikan nilsebagai nama buffer:

(start-process "process-name" nil "program")
Tikhon Jelvis
sumber
Apakah mungkin untuk menggunakan start-processperintah sudo? Saya mencoba memasukkan panggilan saya ke start-processdalam (let ((default-directory "/sudo::")) ... )tetapi tidak berhasil untuk saya.
sid-kap
@ sid-kap: Saya tidak tahu. Anda mungkin harus menanyakannya sebagai pertanyaan mandiri.
Tikhon Jelvis
1
"program"dalam hal ini hanya nama program (misalnya nautilus, caja, firefox) dan "arg1 arg2 ..."harus dalam argumen posisi keempat start-process. Saya mengetahuinya dengan membaca dokumentasi :)
biocyberman
8

Seperti yang disebutkan Tikhon, (start-process)adalah jalan yang harus ditempuh. Jika Anda tidak ingin membuat buffer tetapi masih ingin bereaksi terhadap status proses latar belakang, Anda juga dapat menggunakan (set-process-sentinel). Ini contoh modifikasi yang saya ambil dari projectorpaket saya :

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

Dari deskripsi fungsi 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.

The GNU halaman manual pada Proses ini cukup bagus untuk info lebih lanjut.

waymondo
sumber
Bisakah Anda menggambarkan apa set-process-sentinelyang sedikit lebih akurat? Saya mendapatkan ide umum memiliki fungsi yang mengelola proses, tetapi saya tidak sepenuhnya memahami semua detail. Terima kasih!
Tikhon Jelvis
Jika Anda M-x describe-functionmasuk dan masuk, set-process-sentinelAnda akan mendapatkan jawaban singkat dari dokumentasi Emacs: (set-process-sentinel PROCESS SENTINEL) Berikan PROCESS SENTINEL sentinel; nol untuk default. Sentinel disebut sebagai fungsi ketika proses berubah status. Itu mendapat dua argumen: proses, dan string yang menggambarkan perubahan.
waymondo
1
The GNU Emacs pengguna halaman di Sentinel dan Proses sebenarnya cukup bagus untuk informasi lebih lanjut rinci.
waymondo
Keren. Mungkin Anda bisa mengedit tautan ke jawaban Anda? Saya kira orang juga bisa belajar lebih banyak hanya dengan menggunakan C-h f...
Tikhon Jelvis
2

Tidak perlu mengubah cara Anda menjalankan perintah asinkron. Emacs memiliki kemampuan generik untuk memungkinkan Anda mengontrol di mana atau apakah buffer akan muncul, dengan mengubah struktur data tunggal, the display-buffer-alist.

Dalam solusi di bawah ini, Anda dapat melihat bahwa fungsi aksi display-buffer-no-window(mis. Tidak ada pop-up) disetel untuk dikaitkan dengan buffer apa pun dengan nama awal *Asynchronous Shell Command*(emacs menambahkan akhiran tambahan ketika diminta untuk membuat lebih dari satu).

Untuk melihat daftar opsi tampilan lain yang tersedia, ketik C-h f display-bufferdan cari daftar "fungsi tindakan".

;; Buffers that I don't want popping up by default
(add-to-list 'display-buffer-alist
  '("\\*Async Shell Command\\*.*" display-buffer-no-window))
pengguna1404316
sumber