orgmode 파일을 열 때 elisp를 어떻게 평가할 수 있습니까?


13

로드 할 때 orgmode 파일에서 실행하고 싶은 코드가 있습니다 (다른 파일과 다르고 파일 자체에 정의되어 있음). 이것을 할 수있는 방법이 있습니까? http://orgmode.org/manual/In_002dbuffer-settings.html 에서 아무것도 보지 못했습니다.

orgmode 파일이로드 될 때마다 특별히 명명 된 코드 블록을 실행하는 emacs 초기화에 무언가를 추가 할 수 있다면 해결책이 될 수 있지만 그 방법을 잘 모르겠으며 이상적으로 내장 된 것이 있습니다.


1
파일 로컬 변수?
Dan

작동합니다! 내가 받아 들일 수있는 대답으로 만들고 싶습니까?
avv

추가로 편집하기에는 매우 지저분한 환경이므로 좋은 솔루션은 파일 로컬 변수에 명명 된 코드 블록을 실행하는 것입니다.
avv

아마도 프놈이나 람다에 싸서?
Dan

3
사용할 수도 # -*- eval: (lisp code here) -*-있지만 위험을 알고 있어야합니다. 이 문서를 다른 사람과 공유하지 않더라도 Emacs Lisp의 해석 특성은 변경으로 인해 실수로 데이터가 손실 될 수 있음을 의미합니다. 또한 둘 이상의 파일에 대해 동일한 코드를 실행하려는 경우 모드 후크가 더 나은 옵션처럼 들립니다.
wvxvw

답변:


9

솔루션은 변경 필요하지 않습니다 init.el(사소한 수정). 파일 로컬 평가가 필요하지만 OP가 요청한 것과 정확히 같습니다. 솔루션의 장점은 다음과 같습니다.

  • 코드를 확인하기 위해 확인을 요청합니다
  • org-babel 환경에서 elisp 코드를 편집하고 테스트 할 수 있습니다
  • 솔루션이 init.elorgmode 파일을 수정할 필요가 없으므로 (신뢰할 수있는) 사용자간에 공유 될 수 있음

나는 여기서 해결책을 되풀이하고있다.

파일 어딘가에 src-block을 추가하십시오 :

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

그런 다음 orgmode 파일의 끝에 이것을 넣으십시오.

# 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-block을 숨기고 시작할 때 하위 수준을 숨기고 싶기 때문에 추가했습니다 . 이 문장이 없으면 하위 수준이로 확장됩니다 (org-babel-goto-named-src-block "startup").

이 솔루션을 사용하면 emacs는 실행 권한을 두 번 요청합니다 (첫 번째 : 로컬 변수 적용; 두 번째 : "startup"-src-block 실행). 내 파일에 많은 src 블록이 있으므로 다음과 같이 다른 파일 로컬 변수를 설정 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:

경고 : 이 추가로 emacs는 한 번만 실행 권한을 요청합니다. 이제 해당 파일의 모든 src 블록 추가 확인없이 실행할 수 있습니다. 다른 사람들이 이전에 지적했듯이이 동작은 위험 할 수 있으므로이 설정에 매우주의해야합니다.

그러나, 나는이 솔루션 (특히 첫 번째 버전)이보다 더 안전하다고 주장 거라고 조 Corneli에 의해 주어진 하나 적어도 당신이 있기 때문에 것입니다 실행 확인을 묻는 메시지가. Joe의 솔루션은 파일에서 발견 된 경우 확인없이 특수 블록을 평가합니다. 공격자는 물론 특수 블록의 이름을 추측해야합니다.

이 접근 방식을 사용하여 조직 내보내기 메커니즘에 대한 적응과 같은 큰 문서를 작성하고 있습니다.


5

org-mode... 상위 모드 outline-mode가 실행했을 수 있는 후크 외에도이 모드는 org-mode-hook초기화 중 마지막 단계로 hook을 실행합니다 .

따라서 init.el에서 :

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

이 작업에서는 파일 로컬 변수보다 더 합리적입니다. 그러나 아마도 뭔가 빠졌을 것입니다.
Drew

@Joe Corneli 그리고 실제 조직 파일에 무엇을 넣겠습니까?
백열 자

"특수 블록"을 제외하고는 특별한 것이 없습니다.
Joe Corneli

3

당신이 요청한 이후

(파일마다 다르며 파일 자체에 정의되어 있음)

그런 다음이 솔루션을 사용해보십시오 .


다운 투표가 왜 필요한지 설명해 주시겠습니까?
Emacs 사용자

다른 답변과 연결되는 답변은 사용하지 않는 것이 좋습니다. 즉,이 질문은 당신이 연결 한 질문의 속담입니까?
Linus Arver

1

후크 사용에 대한 @Joe Corneli의 제안에 동의합니다.

나에게도 북마크를 활용할 수있는 일이 발생합니다. 훅에 특정 북마크 점프를 넣으십시오. 코드 블록에 대한 책갈피의 장점은 일반적으로 자동으로 재배치되는 것입니다 (예 : 파일 내용이 변경됨). 따라서 블록의 위치를 ​​자동으로 관리해야합니다.

[그러나 왜 다른 곳이 아닌 조직 모드 파일에 코드가 있는지는 분명하지 않습니다. 문제 진술에 따라 주어진 것으로 간주하지만 왜 그렇게하는지 궁금합니다. 그런 점에서 디자인에 대해 더 많이 알려 주면 도움이 더 도움이 될 수 있습니다.]


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)

org-mode 버퍼를 열 때마다 startblock이라는 소스 블록을 검색합니다 (발견 된 경우).

조직 모드 파일에서 다음을 넣을 수 있습니다.

#+NAME: startblock
#+BEGIN_SRC emacs-lisp
  ;; Any code you want
#+END_SRC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.