2017-01-31 5 views
3

のメカニズムと完全に混同されています。org-mode(9.0.3)です。#+ BIND:実際にはどのように動作しますか

特定のキーワードを持たない設定を修正する必要があります。私のorgファイルを移植可能にしたい(人のemacs initファイルに変更を加えたくない)。

したがって、ファイルローカル変数でorg-export-allow-bind-keywordsを変更し、#+BIND:メカニズムを使用して必要なemacs変数を修正しようとしました。

指定された変数はバインドされていないようです。すべてです。

は、結合が行われているかどうかを理解するために、私は次の例でエクスポート時に変数の内容を印刷してみました。もちろん

#+BIND: myvar " middle " 

#+BEGIN_SRC emacs-lisp :results value :exports results 
(concat "before" myvar "after") 
#+END_SRC 

# Local Variables: 
# org-export-allow-bind-keywords: t 
# End: 

を私は初期値を固定し、ファイルを開く前に私のemacs initファイルのmyvarから(setq myvar " empty ")までです。

エクスポートすると、期待値、before middle afterが表示されますが、次の値はbefore empty afterになります。

私が逃したものは何ですか?

答えて

2

これは完全な答えではありません。#+ BINDの微妙な違いがあります。しかし、上記の例がうまくいかない基本的な理由は、エクスポート中に#+ BIND構成が使用される前にソースブロックの評価が行われるということです。関数org-export-as(ファイルlisp/ox.el)を参照してください。行3061では、ソースブロックを処理するために関数org-babel-exp-process-bufferが呼び出されます。 #+ BIND構成は、ソースブロックが処理された後の、org-export-get-environmentの行3078で使用されます。 (行番号は私のバージョン9.0.3以降であるため、最近のバージョンのorgでは近いが、おそらく同じではないはずです)。

#+ BIND構成は、エクスポート中に任意の変数をバインドするメカニズムとしては決して意味がありませんでした。エクスポートに影響するバッファ内設定と、バッファ内で設定できない設定がありましたが、それらをグローバルに設定する必要はなく、エクスポート後にファイルを設定解除する必要がありません。そこでCarsten Dominik(org-modeの作成者)はいくつかを追加しましたが、より一般的な仕組みを作り、バッファ内の設定を追加し続ける必要がないようにすることを決めました。一般的に、私は、#+ BINDはもはやそれほど有用ではないと考えています。輸出の仕組みが実質的に無関係に変更されています。

更新:

#+name: myvar 
#+BEGIN_SRC emacs-lisp 
" middle " 
#+END_SRC 

#+BEGIN_SRC emacs-lisp :var x=myvar :results value :exports results 
(concat "before" x "after") 
#+END_SRC 
+0

実は、あなたが本当にやろうとしたかを説明することがあります:それはあなたの例が動作しない理由は、多かれ少なかれ明らかだが、私のここにあなたが欲しいものを行うための一つの方法です「あなたが望むことをやる方法」はおそらく予期せぬことです。例を修正しますが、おそらく問題を解決するものではありません。だから、おそらくあなたは質問を更新することができます(または、おそらく良い、別のものを尋ねる)。 – Nick

関連する問題