2013-05-19 10 views
7

Kabuk komutlarını çağırmaya çalışan bazı Emacs komutlarına sahip bir Emacs minor modunu yazıyorum. Aşağıdaki kod kullanıyorum: komutunu yerine tamamlandığındaEmacs kabuk komut çıkış arabelleğini nasıl her zaman alttan takip edebilirim?

(let ((output (get-buffer-create "*Foo Output*"))) 
     (start-process "Foo Process" output argv0) 
     (display-buffer output)) 

I ya da en azından bu kabuk otomatik her zaman çıkış sokulur altına kaydırmak için komutlar içeren tampon istiyorum. Bunu nasıl yapabilirim?

cevap

8

Bunu bir process filter function kullanarak yapabilirsiniz.

Bir işlem filtresi işlevi, ilişkili işlemden standart çıktısını alan bir işlevdir. Bir işlem bir filtreye sahipse, bu işlemden çıkan tüm çıktılar filtreye iletilir. İşlem arabelleği, yalnızca filtreli olduğu zaman işlemden çıkış için doğrudan kullanılır.

[...]

Birçok filtre fonksiyonları bazen (ya da her zaman) hiçbir filtre olduğunda Emacs eylemlerini taklit sürecin tamponu içinde çıkışını yerleştirin.

start-process bir değişkene saklayabileceğiniz Lisp'te yeni alt işlemi açılımı bir süreç nesnesi döndüren, proc söylüyorlar. İşlemin çıktısını sadece ilişkili çıktı tamponuna ekleyen basit bir filtre işlevi yazabilirsiniz, böylece point arabelleğin sonuna taşınır.

(defun my-insertion-filter (proc string) 
    (when (buffer-live-p (process-buffer proc)) 
    (with-current-buffer (process-buffer proc) 
     ;; Insert the text, advancing the process marker. 
     (goto-char (process-mark proc)) 
     (insert string) 
     (set-marker (process-mark proc) (point))))) 

kullanın set-process-filter sizin süreçlere bu filtre fonksiyonunu atamak. işlemi sonlandırıldı sadece bir kez tampon sonuna atlamak için yeterli olmadığını

(set-process-filter proc 'my-insertion-filter) 

Alternatif olarak, bir sentinel kullanmak isteyebilirsiniz.

bir proses nöbetçi ilişkili süreç , sonlandırmak durdurmak veya devam etmesini (sürecin kendi eylemleri Emacs tarafından gönderilen veya neden olsun) sinyalleri dahil olmak üzere herhangi bir nedenle durumunu her değiştirdiğinde çağrılan bir işlevdir süreç. Işlemin çıkması durumunda işlem sentinel de denir.

(defun my-sentinel (proc event) 
    (when (buffer-live-p (process-buffer proc)) 
    (with-current-buffer (process-buffer proc) 
     (end-of-buffer)))) 

(sürecin sonunda bu fonksiyon kaydırır sürecin sonunda sadece gerçekleşebilir denir her zaman tampon unutmayın. Eğer gerçekten sadece yapmak istiyorum Eğer İşlem sonlandırıldığında, event dizgisinin "finished\n" dizgisi olup olmadığını kontrol edin.)

Bu sentinel'i işleminize atamak için set-process-sentinel kullanın.

(set-process-sentinel proc 'my-sentinel) 
+0

Bu sorunun bir varyantım var. Belirli bir tuş kombinasyonunu bir kabuk komutunu (kabuk-komut fonksiyonu aracılığıyla) çalıştırmak için .emacs'de global-set-anahtar kullanıyorum.OP ile aynı sorunu yaşıyorum; Ben sadece * Kabuk Komutu Çıkışı *'nın en üstünü değil, altını görüyorum. Yukarıdaki proses filtre maddelerini .emacs dosyama körü körüne yazdım ve bir "Uyarı değeri değişken olarak geçersiz: proc" set-process-filter komutundan geliyor. Proc'un kabuk arabelleği ile ilişkili işlemin adı olduğunu varsayalım ama 0 lisp bilgim var. M-x'den kaçmak mı gerekiyor? –

+0

@KevinBuzzard Sorununuz bir yorumda yanıtlanamayacak kadar karmaşıktır; daha ayrıntılı yanıtlar için uygun bir soru sormayı düşünün. – Thomas

İlgili konular