조직 모드 소스 코드 블록 ": eval no"상태를 전환하는 방법


9

나는 종종 :eval헤더 인수를 사용하여 org-mode babel에서 특정 코드 블록의 평가를 제한하거나 제한하지 않습니다 .

예를 들면 다음과 같습니다.

#+BEGIN_SRC emacs-lisp :results value scalar :eval no
(+ 1 1)
#+END_SRC

#+RESULTS:
: 2

나는 코드 블록 사이를 전환 :eval no:eval n(또는 삭제 :eval no완전히) 손으로.

#+PROPERTY: eval no 편리하지만 각 코드 블록에 적합하지 않습니다.

:eval아래와 같이 상태를 편리하게 전환하는 더 좋은 방법이 있습니까?

C-c C-t     (org-todo)
Rotate the TODO state of the current item among
(unmarked) -> TODO -> DONE

답변:


7

나는 org-in-block-p기능에 의존하는 비교적 멋진 솔루션을 생각해 냈습니다.이 기능을 살펴 보는 것이 좋습니다. init.el파일에 다음 코드를 추가 하십시오.

(defun org-toggle-src-eval-no ()
  "Will toggle ':eval no' on the src block begin line"

  (defun in-src-block-p ()
    "Returns t when the point is inside a source code block"
    (string= "src" (org-in-block-p '("src"))))

  (defun beginning-src ()
    "Find the beginning of the src block"
    (let ((case-fold-search t)) (search-backward "#+BEGIN_SRC")))

  (defun toggle-eval-no ()
    "Handles the toggling of ' :eval no'"
     (save-excursion
      (end-of-line)
      (let ((case-fold-search t)) (search-backward "#+BEGIN_SRC")
       (if (search-forward " :eval no" (line-end-position) "f")
           (replace-match "")
         (insert " :eval no")
         ))))

  (if (in-src-block-p) (toggle-eval-no)))

(defun add-org-toggle-src-key ()
  (local-set-key (kbd "C-c t") (lambda () (interactive) (org-toggle-src-eval-no))))

(add-hook 'org-mode-hook 'add-org-toggle-src-key)

이것은 함수를 정의하며 org-toggle-src-eval-no원하는 것을 정확하게 수행해야합니다. 코드 블록 안에 있으면의 존재를 토글합니다 :eval no. 에 바인딩 C-c t했지만 원하는대로 자유롭게 매핑하십시오. 행복한 조직.


1
놀랄 만한! 정말 대단해! 이것이 바로 내가 원하는 것입니다! 나는 해결책을 그렇게 빨리 얻을 것으로 기대하지 않았다. 그 동안 나는 한 가지 사소한 것을 발견했습니다. 두 개의 코드 블록이있을 때 두 번째 # + BEGIN_SRC 블록의 시작 부분에 Ct가 있으면 첫 번째 코드 블록이 토글됩니다. 어쩌면 (검색 뒤로 "# + BEGIN_SRC") 앞에 (줄 끝 이동 nil)을 추가해야합니까?
RUserPassing 작성자 :

1
훌륭한 지적입니다. (end-of-line)검색 전에 포함하도록 답변을 업데이트 #+BEGIN_SRC했습니다.이 기능은 다른 기능을 제한하지 않고 이전 의 경우 포인트를 끝으로 이동합니다 . 여전히 문제가있는 경우 알려주십시오.
GJStein

코드 감사합니다! 정말 대단해 !!
RUserPassing 작성자 :

고마워 오랫동안 이러한 기능을 찾고있었습니다 :)
Thomas Dehaeze
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.