Aktif M-! M- & (Ctrl-Z bash'a eşdeğer a'ka emacs)


14

Zaman zaman M-! some_commandkomutun beklediğimden daha uzun sürdüğünü ve emaclarımı uzun saniyeler boyunca donmuş halde tuttuğumu fark ettim. Bu yüzden donmuş emac'larıma sır M-& some_commandveriyorum ve kullanmadığım için kendimi tekmeliyorum ve bir M-&dahaki sefere kullanacağım için söz veriyorum . Ama M-!onlarca yıldır kas hafızamda… Ve elbette var Ctrl-G, ama komutu kırıp tekrar çalıştırırken tercih edilmeyen durumlar var (belki de kırılabilir, belki tekrar çalıştırmak pahalıya mal olabilir…).

Kabuk konsolda benzer bir hata doğru önemsiz olduğunu Ctrl-Z, bgve işi arka planda çalışıyor.

Emacs'ta benzer bir hile var mı - şu anda çalışan ön plan (senkron) komutunu arka plan (asenkron) komutuna dönüştürmenin bir yolu var mı?

Not: varsayılan olarak imkansız olduğu takdirde, başka bir şeye M-!nasıl yeniden M-!bağlanacağına dair önerilere açığım ( bu hile dışında işlevsel olarak eşdeğer olacaktı).


2
Sadece &bir normal shell-command( M-!) sonuna bir ekleme yapmanın onu eşzamansız hale getireceğini bilmek isteyebilirsiniz . Elbette, bir komutu çalıştırmadan önce bunu yapmanız gerekir, ancak en azından aynı tuş takımını kullanabilirsiniz.
dadı

4
Her zamanda yeniden eşleştirmek olabilir M-!için async-shell-command. :-) Kaybettiğiniz tek şey, yeterince kısa olduğunda yankı alanında çıktı almak gibi görünüyor.
glucas

1
@nanny, aslında, hepsi async-shell-commandbu. Dizenin &sonuna bir ekler COMMANDve yürütür shell-command.
Matthew Piziak

Yanıtlar:


2

Emacs'ta benzer bir hile var mı - şu anda çalışan ön plan (senkron) komutunu arka plan (asenkron) komutuna dönüştürmenin bir yolu var mı?

Böyle bir hile olmadığından şüpheleniyorum. Sorun, senkron kabuk komutunun (gerçekten call-process-region) emacs olay döngüsünü engellemesidir. Bunu kırmanın tek yolu, işlemi bir USR1 veya USR2 sinyaliyle öldürmek veya yapmaktır C-g. (Başka yollar da olabilir, ama bunu yapıyorum).

Bu, yapabileceğiniz hiçbir şey olmadığı anlamına gelir çünkü olay döngüsü dururken Emacs girdiyi işlemediğinden, hile çağırmanın bir yolunuz yoktur.


Eğer bir şey olabilir yapmak basitçe tuşları yer değiştirme edilir:

(global-set-key (kbd "M-!") #'async-shell-command)
(global-set-key (kbd "M-&") #'shell-command)

M-! async-shell-command kısmi bir anlam ifade eder, ancak: (1) M-1 M-! davranış (arabellek komut çıkışı) - basit hızlı durumlarda çalışır ama komut daha yavaş ve ben sth yazın? (2) birçok durumda, komut net bir bitiş göstergesi verdiğinden (bazı komutların çıktısı yok…) komut davranışı bitirene kadar dondurmayı severim , bu nedenle açık tuş vuruşu "arka plana koy" daha iyi olurdu (3) async, bu Async tamponlarını bırakmalıdır. reaped
Mekk

Async-shell-komutunun etrafındaki bazı paketleyicilerin yazmak mümkün olup olmadığını düşünüyorum (async-shell-komutunu doğuracak, sonra bitmesini bekleyecek, komutu iptal ederek Ctrl-G'ye ve bırakarak diğer tuş vuruşlarına tepki verecek bir işlev çalışıyor, ancak artık beklemiyor ve çıktı boş veya kısasa Async arabelleğini bir kez tamamla ). Bekleyen kısmı nasıl yapacağımdan emin değilim…
Mekk
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.