Orgモードのソースコードブロックの「: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
すごい!本当に素晴らしい!これはまさに私が欲しかったものです!すぐに解決策が得られるとは思っていませんでした。その間、私は些細なことに気づきました。2つのコードブロックがある場合、2番目の#+ BEGIN_SRCブロックの行の先頭でCtを押すと、最初のコードブロックが切り替わります。(search-backward "#+ BEGIN_SRC")の両方の前に(move-end-of-line nil)を追加する必要がありますか?
RUserPassingBy 2015

1
優れた点。(end-of-line)検索の前に含めるように私の回答を更新しました。これにより、#+BEGIN_SRC(前にいる場合は)の末尾にポイントが移動します(他の機能は制限されません)。それでも問題が解決しない場合はお知らせください。
GJStein 2015

コードをありがとう!本当に素晴らしい!
RUserPassingBy 2015

どうもありがとう。そのような機能を長い間探していました:)
Thomas Dehaeze
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.