Bir orgmode dosyasındaki elisp'i açıldığında nasıl değerlendirebilirim?


13

Yüklediklerinde orgmode dosyalarında çalıştırmak istediğiniz elisp kodu var (farklı dosyalar için farklı ve dosyanın kendisinde tanımlanmış). Bunu yapmanın bir yolu var mı? Http://orgmode.org/manual/In_002dbuffer-settings.html adresinde hiçbir şey görmedim

Bir orgmode dosyası yüklendiğinde özel olarak adlandırılmış bir kod bloğunu çalıştıran emacs başlatma işlemine bir şey ekleyebilirsem, bu bir çözüm olabilir, ancak bunun nasıl yapılacağından emin değilim ve ideal olarak yerleşik bir şey var.


1
Dosya-yerel değişkenler, belki?
Dan

Bu çalışır! Kabul edebileceğim bir cevap haline getirmek ister misiniz?
avv

Bunun üzerinde düzenlemek için çok dağınık bir ortam olduğu düşünülürse, iyi bir çözüm, adlandırılmış bir kod bloğunu çalıştıran yerel dosya değişkenine sahip olacaktır.
avv

Belki bir progn ya da lambda sarın?
Dan

3
Ayrıca kullanabilirsiniz, # -*- eval: (lisp code here) -*-ancak tehlikelerin farkında olmalısınız. Bu belgeleri başkalarıyla paylaşmasanız bile, Emacs Lisp'in yorumlanmış doğası, bir değişikliğin yanlışlıkla veri kaybına neden olabileceği anlamına gelir. Aynı kodu birden fazla dosya için çalıştırmak istiyorsanız, mod kancası daha iyi bir seçenek gibi geliyor.
wvxvw

Yanıtlar:


9

Bu çözümde değişiklik yapılmasını gerektirmez init.el(küçük değişikliklerle). Yine de dosya-yerel değerlendirmeleri içerir - ancak OP'nin istediği tam olarak budur. Çözümün avantajları:

  • kodu değerlendirmek için onay ister
  • elisp kodu org-babel ortamında düzenlenebilir ve test edilebilir
  • çözüm init.elorgmode dosyasında değişiklik gerektirmediği için (güvenilir) kullanıcılar arasında paylaşılabilir

Buradaki çözümü yeniden ifade ediyorum.

Dosyanızın herhangi bir yerine bir src bloğu ekleyin:

#+NAME: startup
#+BEGIN_SRC emacs-lisp
(your-code-here)
#+END_SRC

Ardından, bunu orgmode dosyanızın sonuna yerleştirin:

# Local Variables:
# eval: (progn (org-babel-goto-named-src-block "startup") (org-babel-execute-src-block) (outline-hide-sublevels 1))
# End:

Ekledim (outline-hide-sublevels 1)çünkü src bloğunu bir başlık içinde gizlemek ve alt düzeylerin başlangıçta gizlenmesini istiyorum. Bu açıklama olmadan, alt düzeyler genişleyecektir (org-babel-goto-named-src-block "startup").

Bu çözümle emacs, yürütme iznini 2 kez isteyecektir (1.: Yerel Değişkenleri uygulayın; 2.: "startup" -src-block'u çalıştırın). Dosyamda çok fazla src bloğu var, başka bir dosya-yerel-değişken ayarladım, şöyle org-confirm-babel-evaluate:

# Local Variables:
# org-confirm-babel-evaluate: nil
# eval: (progn (org-babel-goto-named-src-block "startup") (org-babel-execute-src-block) (outline-hide-sublevels 1))
# End:

Uyarı: Bu ekleme ile emacs, yürütme izni için yalnızca bir kez soracaktır - bu dosyadaki tüm src blokları artık onaylanmadan yürütülebilir. Diğerlerinin daha önce işaret ettiği gibi, bu davranış tehlikeli olabilir ve bu ayara çok dikkat etmelisiniz.

Ancak, ben bu çözüm (özellikle ilk versiyon) daha güvenli olduğunu iddia ediyorum Joe Corneli tarafından verilen birinde en azından nedeniyle edecek yürütmek onay istenecektir. Joe'nun çözümü, dosyada bulunursa, özel bloğu onaylamadan değerlendirecektir. Bir saldırganın elbette özel bloğun adını tahmin etmesi gerekirdi ...

Bu yaklaşımı, örneğin kuruluş dışa aktarma mekanizmalarına uyarlama gerektiren büyük belgeler yazmak için kullanıyorum.


5

org-mode... Ana modunun outline-modeçalışmış olabileceği herhangi bir kancaya ek olarak , bu mod org-mode-hook, başlatma sırasında son adım olarak kancayı çalıştırır .

Yani, init.el:

(defun function-that-finds-and-evaluates-special-block ()
;; DWIM :-)
)
(add-hook 'org-mode-hook 'function-that-finds-and-evaluates-special-block)

Bu görev benim için dosya yerel değişkenlerinden daha makul geliyor. Ama belki bir şeyleri kaçırıyorum.
Drew

@Joe Corneli Ve sonra gerçek org dosyasına ne koyardınız?
incandescentman

"Özel blok" dışında özel bir şey yok.
Joe Corneli

3

İstediğin için

(farklı dosyalar için farklıdır ve dosyanın kendisinde tanımlanmıştır)

sonra bu çözümü deneyin .


Aşağı oylama neden açıklamak ister misiniz?
Emacs Kullanıcısı

Çünkü sadece diğer cevaplara bağlantılar olan cevaplar cesaretini kırmıştır. Olduğu söyleniyor, belki de bu soru bağlandığınız kişinin bir çiftidir?
Linus Arver

1

@Joe Corneli'nin kanca kullanma önerisine katılıyorum.

Bana da burada yer işaretlerinden yararlanabilirsiniz: kancaya belirli bir yer işareti atlaması yapın. Kod bloğuna bir yer işaretinin bir avantajı, tipik olarak otomatik olarak yeniden konumlandırılmasıdır (örneğin dosya içeriği değiştikçe), bu nedenle bloğun yerini normal olarak otomatik olarak halletmek gerekir.

[Ama kodu neden başka bir yerde değil de Org modu dosyalarında bulduğunuz açık değil. Bunu sorun ifadesi olarak verilen bir şekilde alıyoruz, ama bunu neden yaptığını merak ediyorum. Bu konuda tasarım hakkında daha fazla bilgi sahibi olmak daha iyi yardıma yol açabilir.]


0

Joe Corneli'nin kodunu geliştirmeye çalıştım:

İnit.el dosyanızda buna ihtiyacınız var:

  (defun tdh/eval-startblock ()
    (if (member "startblock" (org-babel-src-block-names))
      (save-excursion
        (org-babel-goto-named-src-block "startblock")
        (org-babel-execute-src-block))
      nil
      )
    )
  (add-hook 'org-mode-hook 'tdh/eval-startblock)

Bir kuruluş modu arabelleğini her açtığınızda, startblock adında bir kaynak bloğu arar, eğer bulunursa, onu yürütür.

Kuruluş modu dosyalarınıza şunları koyabilirsiniz:

#+NAME: startblock
#+BEGIN_SRC emacs-lisp
  ;; Any code you want
#+END_SRC
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.