Soru Emacs kabuk betikleri - başlangıçtaki seçenekleri betiğe nasıl yazılır?


Yığın Taşması sorusundan ilham alındı Emacs'de metinlerin düzenli olarak işlenmesi? Aşağıdaki başlık ile bir Emacs kabuk betiğini denedim:

#!/usr/bin/emacs --script 

Bazı Emacs Lisp kodunu koydum ve textfile rcat olarak kaydettim.

--Script seçeneği site başlangıç ​​dosyasının yüklenmesini engellemediğinden,

Loading /etc/emacs/site-start.d/20apel.el (source)...
Loading /etc/emacs23/site-start.d/35elib-startup.el (source)...
Loading /etc/emacs23/site-start.d/50auctex.el (source)...

Bash kabuğundaki (stdout) mesajlar. Bunu arayarak önleyebilirim

rcat --no-site-file

veya

rcat -Q

ancak komut dosyasındaki başlığı değiştirerek değil:

 #!/usr/bin/emacs --script --no-site-file

Emacs'e komut dosyasının daha sonra komut satırında yapılması yerine ek seçenekler aktarmanın bir yolu var mı?


18
2018-06-04 17:34


Menşei




Cevaplar:


Her zaman değişebilirsin #!/usr/bin/emacs gibi bir şey #!/home/thorsten/bin/emacs-no-site-fileve şöyle ayarlayın:

#!/bin/sh
exec /usr/bin/emacs --no-site-file "$@"

Bu sizin için işe yaramıyorsa veya komut dosyanızın taşınabilir olmasını istiyorsanız Gilles'nin yanıtı aşağıdadır Daha sağlam (ve biraz korkak :) bir yaklaşım için.


11
2018-06-05 03:50



Bu çalışıyor, teşekkürler. Her zaman unutuyorum ki, Bilgisayar Bilimi'nde hemen hemen tüm problemlerin çözümü, ortada bir ek (soyutlama) adımı atıyor;) - Thorsten
Ne yazık ki, tüm birimler zincirleme tercümanları kabul etmemektedir (örneğin, bir betik başka bir komut dosyasının yorumlayıcısı olamaz). - Gilles


Birçok unix varyantı, sadece shebang hattındaki programa tek bir argümana izin verir. Acı ama gerçek. Eğer kullanırsan #!/usr/bin/env emacs öyle ki, emacs çalıştırılabilir, hiç bir argüman geçemezsiniz.

Zincirleme komutları bazı sistemlerde bir olasılık, ancak bu da her yerde desteklenmiyor.

Bir polyglot komut dosyası yazmanın zamana dayalı yoluna gidebilirsiniz: hem bir kabuk betiği hem de bir Emacs Lisp betiği olan bir betik (Perl's gibi) if $running_under_some_shell, Örneğin). Kesin görünüyor, ama işe yarıyor.

Elisp ile başlayan yorumlar ;Kabukta iki komutu ayıran. Böylece bir ; bir sonraki satırda başlayan gerçek Lisp kodu ile Emacs'e geçmek için bir kabuk talimatı takip eder. Kabukların çoğu boş bir komuttan hoşlanmıyor, bu yüzden hem kabuğun hem de Emacs'ın bir no-op olarak ele alması gereken bir şey bulmamız gerekiyor. ;. Kabuk no-op komutu :; yazabilirsin ":" Kabuk söz konusu olduğunda ve Emacs bunu da bir üst-op olan üst seviyedeki bir sabit olarak ayrıştırır.

#! /bin/sh
":"; exec emacs --no-site-file --script "$0" -- "$@" # -*-emacs-lisp-*-
(print (+ 2 2))

34
2018-06-06 23:53



+1. Fantastik sh trickery. Şans eseri, her gün e-posta yoluyla org-ajandamı göndermek için bazı emacs script'leri yapmaya başlamak üzereydim ve bu sadece mükemmel. Teşekkürler! Yine de, başında boş bir satır çıkarmanın hafif can sıkıcı bir yanı vardır: - Diego Sevilla
Harika! Neden herkes hacking ve hackerlar konusunda çok kritik? Yazılım Mühendisleri muhtemelen bu kadar yaratıcı bir çözüm bulamazlardı. - Thorsten
Nasıl birleştirileceğini gösteren aşağıdaki yanıtı + yorumuyla çapraz referanslama -- Emacs'in komut dosyanıza iletilen komut satırı argümanlarını işlemeye çalışmasını engellemek için bu yaklaşıma karşı argüman stackoverflow.com/questions/6759606/... - phils
@DiegoSevilla Bu boş satırdan print Nesne öncesi ve sonrası bir satırsonu basan işlev. kullanım prin1 veya princ Yeni satırlardan kaçınmak için. - Gilles
Hala ihtiyaç duyulan genel bir çözüm gibi görünüyor (setq argv nil) Scacs çıkmadan önce (Jurijs Oniscuks'un cevabına göre), Emacs kalan argümanları ziyaret edilecek dosya isimleri olarak işleyecek. Görmek stackoverflow.com/a/24352935/324105 - phils


Komut dosyası modunda emacs çalıştırırsanız, betiğinizin sonunda "argv" değişkenini sıfırlamanızı öneririm, aksi halde komutlar bittikten sonra "argv" yi yorumlamaya çalışırlar.

Aşağıdaki içerikle "test-emacs-script.el" adında bir dosyanız olduğunu varsayalım:

#!/usr/bin/emacs --script
(print argv)
(setq argv nil)

Bu betiği "./test-emacs-script.el -a" şeklinde çalıştırmayı deneyin. Bu betiği "argv" (betikte son satır) olmadan yeniden çalıştırırsanız çıktı aşağıdaki gibi olur:

("-a")
Unknown option `-a'

"Argv" nin sıfırlanması "bilinmeyen seçenek" hata mesajından kurtuluyor


7
2017-10-14 14:49



Görünüşe göre bu bile önemli -- argarr olarak argüman kullanılır başka bir Soru & Cevapta işaret ediyor Emacs, eğer mevcut değilse, opsiyonel olmayan argümanları dosya isimleri olarak işleyecektir. boşaltma argv bunu engeller. - phils
Daha da iyisi, eğer sen (kill-emacs 0) Belirtilen durumdan açıkça çıkmak için Emacs yapmayacak her şey Başka. Bu ipucu lunaryorn.com/2014/08/12/emacs-script-pitfalls.html (oldukça kapsamlı bir genel bakış haline geldi, bence). - phils