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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.