2017-01-31 2 views
3

org-mode (9.0.3)의 #+BIND: 메커니즘과 완전히 혼동됩니다.# + BIND : 실제로 작동하는 방법

특정 키워드가없는 일부 설정을 수정해야하며 내 조직 파일을 이식 가능하도록 지정해야합니다. 사람들의 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: 

파일을 열기 전에 : 바인딩이 완료 또는하지 않을 경우 이해하기 위해

, 나는 다음과 같은 예제를 내보낼 때 변수의 내용을 인쇄하려고 이맥스 init 파일에 (setq myvar " empty ")을 통해 myvar으로 보내주십시오.

내보낼 때 예상 값인 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 이상이므로 가까이 있어야하지만 최근 버전의 조직에서는 같지 않아야합니다.)

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