Как переключить статус исходного кода в режиме Org «: eval no»

9

Я часто ограничиваю или ограничиваю оценку конкретных блоков кода в babel-режиме org, используя :evalаргумент header.

Вот пример:

#+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
RUserPassingBy
источник

Ответы:

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, но не стесняйтесь сопоставить это с тем, что вы хотите. Счастливая организация.

GJStein
источник
1
Удивительно! Это действительно здорово! Это именно то, что я хотел! Я не ожидал получить решение так быстро. Между тем я заметил только одну тривиальную вещь. Когда у меня есть 2 кодовых блока, если я Cc t в начале строки второго блока # + BEGIN_SRC, первый кодовый блок переключается. Возможно, мне стоит добавить (move-end-of-line nil) перед обоими (search-backward "# + BEGIN_SRC")?
RUserPassingBy
1
Отличный момент. Я обновил свой ответ, добавив его (end-of-line)перед поиском, который перемещает точку в конец, #+BEGIN_SRCесли вы находитесь перед ней (без ограничения каких-либо других функций). Дайте мне знать, если у вас все еще есть проблемы.
GJStein
Я благодарю вас за ваш код! Это действительно здорово!!
RUserPassingBy
Большое спасибо. Давно искал такую ​​функциональность :)
Томас Дехаз