Cómo alternar el estado del bloque de código fuente del modo Org ": eval no"

9

A menudo limito o limito la evaluación de bloques de código específicos en el modo org babel usando :evalargumento de encabezado.

Aquí hay un ejemplo:

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

#+RESULTS:
: 2

Alternar los bloques de código entre :eval noy :eval n(o eliminar por :eval nocompleto) a mano.

#+PROPERTY: eval no es conveniente, pero no es adecuado para cada bloque de código.

¿Hay mejores formas de alternar el :evalestado útil, como a continuación?

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

Respuestas:

7

Se me ocurrió una solución relativamente buena, que se basa en la org-in-block-pfunción, que recomendaría echar un vistazo. Agregue el siguiente código a su init.elarchivo:

(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)

Esto define la función org-toggle-src-eval-noy debe hacer exactamente lo que desea; cada vez que esté dentro de un bloque de código, alternará la presencia de :eval no. Lo he vinculado C-c t, pero no dudes en asignarlo a lo que quieras. Feliz organización.

GJStein
fuente
1
¡Asombroso! ¡Es realmente genial! ¡Esto es exactamente lo que quería! No esperaba obtener la solución tan rápido. Mientras tanto, noté solo una cosa trivial. Cuando tengo 2 bloques de código, si hago Cc t al comienzo de una línea del segundo bloque # + BEGIN_SRC, el primer bloque de código se alterna. ¿Quizás debería agregar (move-end-of-line nil) antes de ambos (search-backward "# + BEGIN_SRC")?
RUserPassingPor
1
Excelente punto He actualizado mi respuesta para incluirla (end-of-line)antes de la búsqueda, lo que mueve el punto al final de #+BEGIN_SRCsi está antes (sin limitar ninguna otra funcionalidad). Avísame si todavía tienes problemas.
GJStein
¡Gracias por tu código! ¡¡Es realmente genial!!
RUserPassingBy
Muchas gracias. Estaba buscando esa funcionalidad durante mucho tiempo :)
Thomas Dehaeze