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.