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"?

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

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.


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))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.