Arka planda bir arabellek açmadan eşzamansız bir işlemi nasıl çalıştırabilirim?


23

async-shell-command.Emac'lerimi kullanarak eşzamansız arka plan işlemini çalıştırmak için bazı işlevler tanımladım , ancak komutları her çalıştırdığımda yeni bir pencere (kare değil) oluşturulur ve 'buffer orada gösteriliyor. "Açılır pencere" arabelleği olmadan komutu nasıl çalıştırabilirim?

Yanıtlar:


21

Arka plan işlemlerini start-processbir tampon açmaması gereken ile başlatabilirsiniz :

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

İşlem adları gerektiğinde yinelemeyi önlemek için değiştirilir, bu yüzden endişelenmeyin. Sadece gelecekte hata ayıklamak için yararlı bir isim verin!

A verirseniz "buffer-name", bir tampon oluşturulur ancak hemen gösterilmez. Bu süreçleri yönetmek ve çıktıya bakmak için uygun olabilir. Tamponun hiç oluşturulmasını istemiyorsanız nil, tampon adı olarak geçin :

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

start-processSudo komutu için kullanmak mümkün mü ? Ben benim çağrı kaydırma denedim start-processde (let ((default-directory "/sudo::")) ... )ama benim için işe yaramadı.
sid-kap

@ sid-kap: Bilmiyorum. Muhtemelen bunu bağımsız bir soru olarak sormalısınız.
Tikhon Jelvis

1
"program"Bu durumda, sadece program adı (örneğin nautilus, caja, firefox) ve "arg1 arg2 ..."dördüncü konum argümanında olmalıdır start-process. Dokümanları okuyarak
çözdüm

8

Tikhon'un dediği gibi (start-process), gitmenin yolu bu. Bir arabellek oluşturmak istemiyor ancak yine de arka plan işlem durumuna tepki vermek istiyorsanız da kullanabilirsiniz (set-process-sentinel). İşte paketimden alıyorum değiştirilmiş bir örnek projector:

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

Emacs fonksiyon tanımından:

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

Süreçler GNU manuel sayfaları daha fazla bilgi için oldukça iyidir.


set-process-sentinelBiraz daha doğru olanı tarif eder misiniz ? Süreci yöneten bir işleve sahip olma konusunda genel bir fikrim var, ancak tüm detayları tam olarak anlamadım. Teşekkürler!
Tikhon Jelvis

Bunu yaparsanız M-x describe-functionve set-process-sentinelgirerseniz, Emacs belgelerinden kısa bir cevap alırsınız: (set-process-sentinel PROCESS SENTINEL) PROCESS'e sentinel SENTINEL verin; varsayılan olarak sıfır. İşlem durumu değiştiğinde sentinel bir işlev olarak adlandırılır. İki argüman alır: süreç ve değişikliği tanımlayan bir dize.
waymondo

1
Nöbetçiler üzerinde GNU Emacs manuel sayfaları ve Süreçler aslında daha ayrıntılı bilgi almak için oldukça iyi.
waymondo

Güzel. Belki de cevabınızdaki linkleri düzenleyebilirsiniz. Sanırım biri daha kullanarak daha fazlasını da öğrenebilir C-h f...
Tikhon Jelvis

2

Eşzamansız bir komutu nasıl çalıştırdığınızı değiştirmenize gerek yoktur. Emacs, tek bir veri yapısını değiştirerek tamponun nerede açılacağını veya açılacağını kontrol etmenize olanak tanıyan genel bir yeteneğe sahiptir display-buffer-alist.

Aşağıdaki çözümde, eylem işlevinin display-buffer-no-window(yani, pop-up yok) bir adla başlayan herhangi bir tamponla ilişkilendirileceğini görebilirsiniz *Asynchronous Shell Command*(emacs, birden fazla oluşturma istendiğinde artan bir sonek ekler).

Kullanılabilir diğer ekran seçeneklerinin listesini görmek için C-h f display-buffer"işlem işlevleri" listesini yazın ve arayın.

;; Buffers that I don't want popping up by default
(add-to-list 'display-buffer-alist
  '("\\*Async Shell Command\\*.*" display-buffer-no-window))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.