orgmodeファイルを開いたときに、elispをどのように評価できますか?


13

ロード時にorgmodeファイルで実行したいelispコードがあります(ファイルごとに異なり、ファイル自体で定義されています)。これを行う方法はありますか?http://orgmode.org/manual/In_002dbuffer-settings.htmlには何も表示されませんでした

orgmodeファイルが読み込まれるたびに特別な名前のコードブロックを実行するemacs初期化に何かを追加できる場合、それは解決策かもしれませんが、それを行う方法がわからないので、理想的には何かが組み込まれています。


1
ファイルローカル変数でしょうか?
ダン

うまくいきました!それを私が受け入れられる答えにしたいですか?
avv

さらに考えると、それは編集するのに非常に厄介な環境なので、適切な解決策は、ファイルのローカル変数で名前付きコードブロックを実行することです。
avv

多分それをプロングかラムダで包みますか?
ダン

3
使用することもできます# -*- eval: (lisp code here) -*-が、危険性にも注意する必要があります。これらのドキュメントを他の人と共有していなくても、Emacs Lispの解釈された性質により、変更により誤ってデータが失われる可能性があります。また、複数のファイルに対して同じコードを実行する場合は、モードフックの方が適切なオプションのように聞こえます。
wvxvw

回答:


9

このソリューションでは、変更は必要ありませんinit.el(わずかな変更を加えます)。ただし、ファイルローカルの評価が含まれますが、それはまさにOPが求めていたものです。ソリューションの利点は次のとおりです。

  • コードを評価するために確認を求めます
  • elispコードは、org-babel環境内で編集およびテストできます
  • ソリューションはinit.elorgmodeファイルへの変更を必要としないため、(信頼できる)ユーザー間で共有できます。

ここで解決策を言い換えます。

ファイルのどこかにsrc-blockを追加します。

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

次に、これをorgmode-fileの最後に追加します。

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

(outline-hide-sublevels 1)見出し内のsrcブロックを非表示にし、起動時にサブレベルを非表示にしたいので、追加しました。このステートメントがない場合、サブレベルはによって展開され(org-babel-goto-named-src-block "startup")ます。

このソリューションでは、emacsは実行の許可を2回要求します(1番目:ローカル変数の適用、2番目: "startup" -src-blockの実行)。私のファイルには多くのsrc-blocksがあるのでorg-confirm-babel-evaluate、次のように別のfile-local-variableを設定しました:

# 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:

警告:この追加により、emacsは実行の許可を1回だけ要求します- そのファイル内のすべてのsrc-block は、これ以上の確認なしに実行される可能性があります。他の人が以前に指摘したように、この動作は危険である可能性があり、この設定には十分注意する必要があります。

しかし、私は、このソリューション(特に最初のバージョンが)よりも安全であることを主張したいジョーCorneliによって与えられた1、少なくともあなたがいるためでしょう実行するための確認を求められます。Joeのソリューションは、ファイルに見つかった場合、確認なしで特殊ブロックを評価します。もちろん、攻撃者は特別なブロックの名前を推測する必要があります...

私はこのアプローチを使用して、たとえばorg-exportメカニズムへの適応を必要とする大きなドキュメントを記述しています。


5

org-mode...親モードでoutline-mode実行された可能性のあるフックに加えて、このモードではorg-mode-hook初期化中の最後のステップとしてフックが実行されます。

それで、あなたのinit.elで:

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

このタスクでは、これはファイルローカル変数よりも私には合理的に聞こえます。しかし、おそらく何かが足りない。
2015年

@Joe Corneliそして、実際のorgファイルには何を入れますか?
白熱灯

「特別なブロック」以外に特別なものはありません。
Joe Corneli 2015

3

あなたが求めるので

(ファイルごとに異なり、ファイル自体で定義されます)

次に、このソリューションを試してください。


反対票を投じる理由を説明してください。
Emacsユーザー

これは、他の回答へのリンクにすぎない回答は推奨されないためです。そうは言っても、おそらくこの質問はあなたがリンクした質問の誤りですか?
Linus Arver

1

フックの使用に関する@Joe Corneliの提案に同意します。

ここでブックマークを活用できることも私には思い当たります。フックに特定のブックマークジャンプを配置します。コードブロックへのブックマークの利点は、通常は自動的に再配置されることです(たとえば、ファイルの内容が変更されると)、ブロックの配置は通常自動的に処理されます。

[しかし、なぜ他の場所ではなく、Org-modeファイルにコードがあるのか​​、私にははっきりしません。問題のステートメントごとに、これは当然のことと考えていますが、なぜそうしているのでしょうか。その点でデザインについて詳しく教えていただくと、より良い支援につながる可能性があります。]


0

Joe Corneliのコードを改善しようとしました:

あなたはあなたのinit.elファイルでそれを必要とします:

  (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)

組織モードバッファーを開くたびに、startblockという名前のソースブロックが検索され、見つかった場合は実行されます。

組織モードのファイルに、次のように配置できます。

#+NAME: startblock
#+BEGIN_SRC emacs-lisp
  ;; Any code you want
#+END_SRC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.