如何切换组织模式源代码块的“:eval no”状态


9

我经常使用:eval标头参数来限制或取消对组织模式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

Answers:


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
惊人!真的很棒!这正是我想要的!我没想到这么快就能得到解决方案。同时,我注意到一件小事。当我有2个代码块时,如果我在第二个#+ BEGIN_SRC块的一行的开始处输入ct,则将切换第一个代码块。也许我应该在(search-backward“#+ BEGIN_SRC”)两者之前都添加(move-end-of-line nil)?
RUserPassing2015年

1
优点。我已经更新了答案,使其包含(end-of-line)在搜索之前,#+BEGIN_SRC如果您在搜索之前,则将其移动到的末尾(不限制任何其他功能)。如果您仍有问题,请告诉我。
GJStein

感谢您的验证码!真的很棒!
RUserPassing2015年

非常感谢。长期以来一直在寻找这样的功能:)
Thomas Dehaeze
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.