Comment basculer le statut du bloc de code source en mode Org: «eval no»

9

Je limite ou délimite souvent l'évaluation de blocs de code spécifiques dans babel en mode org en utilisant l' :evalargument d'en-tête.

Voici un exemple:

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

#+RESULTS:
: 2

Je bascule les blocs de code entre :eval noet :eval n(ou supprime :eval nocomplètement) à la main.

#+PROPERTY: eval no est pratique, mais ne convient pas à chaque bloc de code.

Existe-t-il de meilleures façons de basculer le :evalstatut à portée de main, comme ci-dessous?

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

Réponses:

7

J'ai trouvé une solution relativement agréable, qui repose sur la org-in-block-pfonction, que je recommanderais de jeter un coup d'œil. Ajoutez le code suivant à votre init.elfichier:

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

Ceci définit la fonction org-toggle-src-eval-noet devrait faire exactement ce que vous voulez; chaque fois que vous êtes à l'intérieur d'un bloc de code, il basculera la présence de :eval no. Je l'ai lié C-c t, mais n'hésitez pas à le mapper à ce que vous voulez. Bonne organisation.

GJStein
la source
1
Incroyable! C'est vraiment super! C'est exactement ce que je voulais! Je ne m'attendais pas à obtenir la solution aussi rapidement. Pendant ce temps, j'ai remarqué une chose banale. Lorsque j'ai 2 blocs de code, si je Cc t au début d'une ligne du deuxième bloc # + BEGIN_SRC, le premier bloc de code est basculé. Peut-être devrais-je ajouter (move-end-of-line nil) avant les deux (search-backward "# + BEGIN_SRC")?
RUserPassingPar
1
Excellent point. J'ai mis à jour ma réponse pour l'inclure (end-of-line)avant la recherche, ce qui déplace le point à la fin du #+BEGIN_SRCsi vous êtes avant (sans limiter aucune autre fonctionnalité). Faites-moi savoir si vous rencontrez toujours des problèmes.
GJStein
Je vous remercie pour votre code! C'est vraiment super!!
RUserPassingPar
Merci beaucoup. Je cherchais une telle fonctionnalité depuis longtemps :)
Thomas Dehaeze