Emacsli tarafından Emacs tarafından çağrılan bir programdan çağrı yapın


9

AucTex ile pdf dokümantasyon dosyalarını görüntülerken bir sorunla karşılaştım. pdf-toolsPDF dosyalarını Emacs içinden görüntülemek için kullanıyorum ve emacsclient -nvarsayılan pdf-görüntüleyicim olarak ayarladım (Debian Linux'ta xdg-mime aracılığıyla). Bu çoğu durumda iyi çalışır, ancak (Tex-documentation-texdoc ...)Auctex ( C-c ?) işlevini bozar .

Sorunu tek bir kod satırına daralttım. listingsPaketin belgelerini görüntülemeye çalıştığımda , TeX-documentation-texdocbunu aşağıdaki sexp'e dönüştürür:

(shell-command-to-string "texdoc --view  listings")

texdocsırayla emacsclientdosyayı gerçekten açmak için aramalar (masaüstümü xdg üzerinden nasıl yapılandırdığımı temel alarak). Ancak, bu noktada, Emacs askıda kalır ve C-gkontrolü geri almak için ( ) çıkmak gerekir . Bundan sonra yeni pdf açılmaz. Aynı şeyi doğrudan emacsclient aramaya çalışırsanız olur:

(shell-command-to-string "emacsclient -n tmp.pdf")

Her iki komut da komut satırında (yani, emacsclient -n tmp.pdfve texdoc --view listings.

Benim sorum, böyle bir örnekte Emacsli'den nasıl emacsclient diyebilirim? (ve ben sadece pdf dosyasını açabileceğimi biliyorum find-file; burada bir seçenek değil çünkü dosyayı bulmak için harici bir işlemi (texdoc) çağırmam gerekiyor ve bu işlem daha sonra emacsclient'i çağırıyor).


Neden sadece texdoc -M --list listingsdosyayı bulmak için kullanmıyoruz find-file?
Quarky

@suvayu Sadece kolaylık. Başka bir alternatif, çağrı yapmak için bir terminale geçmek texdoc --viewve daha sonra dosyayı açtığında Emacs'a geri dönmek. Ama bence bunu Emacs'tan tek adımda yapmanın bir yolu olmalı mı?
Tyler

1
Can (async-shell-command "emacsclient -n tmp.pdf")sorunu çözmek?
Adı

1
@ İsim ilginç - (async-shell-command "emacsclient -n tmp.pdf")işe yarıyor ama (async-shell-command "texdoc --view listings")çalışmıyor. Bu yararlı bir ipucu.
Tyler

1
Mu C-u C-c ?iş? İlk olarak paketle ilgili dokümanların listesini gösterir, ardından görüntüleyiciyi ile açar (call-process "texdoc" nil 0 nil "--just-view" doc).
giordano

Yanıtlar:


5

Çözüm, texdoceşzamansız bir süreç içinde çalışmaktır .

Bunu yapmanın en iyi yolu muhtemelen start-file-processyerine kullanmaktır shell-command-to-string(bu, ilgili Elisp kodundan daha küçük bir kabuk komut dosyası yazmak daha uygun olduğunda hızlı ve kirli kod için kullanışlı bir işlevdir, ancak başka türlü benim deneyimimden kaçınılmalıdır).

Ancak start-file-process, işlemin çıktısını doğrudan döndürmediği için, çevreleyen kodda önemli değişiklikler yapılması gerekir , bunun yerine çıktıyı hangi tamponun yerleştireceğini belirtmenize izin verir ve daha sonra çıktıyı bu arabellekten alan set-process-sentinelbir geri çağırma işlevi kullanmanız ve komut bittiğinde "onunla ne yapılması gerekiyorsa" yapar.


texdocAUCTeX'te çalışmanın özel durumunda, bir sentinel kullanımını biraz abartı buluyorum, çünkü bu temel bir özellik değil (çıktı belgesi için görüntüleyenin açılması gibi, bu durumda sentinel).
giordano

Neden "-to-string" fonksiyonunun kullanıldığı hakkında hiçbir fikrim yok, bu yüzden komutun çıktısı ile ne yapıldığını bilmiyorum. Bu çıktıya ihtiyaç duyulursa (kullanılmasıyla önerildiği gibi ...-to-string), bir eşzamansız çözümün bir işlem filtresine veya bir işlem-sentine ihtiyacı olacaktır. Değilse, kod belki gibi bir şey kullanabilir (shell-command "texdoc --view listings &").
Stefan

Yorumlarda şu şekilde açıklanmıştır TeX-documentation-texdoc: ...-to-stringvaryant kullanıcılara olası hata mesajlarını göstermek için kullanılır (örneğin hiçbir belge bulunmadığında). Ayrıca, texdoc nonexistingpackage0 değerini döndürür, ancak sentinel çıktıyı ayrıştırmak için kullanılabilir.
giordano

Sonra bir nöbetçi en iyi seçenek gibi görünüyor.
Stefan

start-file-processBurada işe yaradığına dair bir çağrı bulamıyorum . "İşlem texdoc tamamlandı" eklenmiş (start-file-process "texdoc" "*texdoc*" "texdoc" "--view" "listings")tamponu oluşturur *texdoc*ve pdf asla açılmaz. Aynı şey xdg-mime pdf görüntüleyicisini de uyarmak için ayarladığımda olur.
Tyler

1

Bir yanıtı beklemeden yalnızca Emacs'a bir isteği geri beslemeniz gerekiyorsa emacsclient, arka planda çalışabilirsiniz . Unix tarzı işletim sistemleri (Linux, macOS, Cygwin,…) altında:

emacsclient … &

Yerel Windows altında:

start emacsclient …

Tabii, ama bu özel durumda sonra (emacsclient) çağıran bir programı (texdoc) çağırmak gerekir. Ek yönlendirme düzeyi sorunlara neden oluyor.
Tyler

@Tyler texdoceşzamansız (yani tamamlanmasını beklemiyorsunuz), değil mi? Böylece aynı prensibi uygulayabilirsiniz: texdoc … &shell komutu olarak çalıştırın .
Gilles 'SO- kötü olmayı bırak'

Bunu sorum altındaki yorumlarda denedik; emacsclientdoğrudan arama yaparken çalışır , ancak arama yaparken çalışmaz texdoc.
Tyler
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.