So schalten Sie den Status des Org-Modus-Quellcodeblocks „: eval no“ um

9

Ich beschränke oder entlimitiere oft die Auswertung bestimmter Codeblöcke im org-mode babel mithilfe eines :evalHeader-Arguments.

Hier ist ein Beispiel:

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

#+RESULTS:
: 2

Ich schalte die Codeblöcke von Hand zwischen :eval nound :eval n(oder lösche sie :eval novollständig) um.

#+PROPERTY: eval no ist praktisch, aber nicht für jeden Codeblock geeignet.

Gibt es bessere Möglichkeiten, um den :evalStatus wie unten umzuschalten?

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

Antworten:

7

Ich habe eine relativ schöne Lösung gefunden, die auf der org-in-block-pFunktion beruht , die ich empfehlen würde, einen Blick darauf zu werfen. Fügen Sie Ihrer init.elDatei den folgenden Code hinzu :

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

Dies definiert die Funktion org-toggle-src-eval-nound sollte genau das tun, was Sie wollen. Jedes Mal, wenn Sie sich in einem Codeblock befinden, wird das Vorhandensein von umgeschaltet :eval no. Ich habe es gebunden, kann es C-c taber beliebig zuordnen. Viel Spaß beim Organisieren.

GJStein
quelle
1
Tolle! Es ist wirklich großartig! Genau das wollte ich! Ich hatte nicht erwartet, die Lösung so schnell zu bekommen. Inzwischen ist mir nur eine Kleinigkeit aufgefallen. Wenn ich 2 Codeblöcke habe und am Anfang einer Zeile des zweiten # + BEGIN_SRC-Blocks Cc t, wird der erste Codeblock umgeschaltet. Vielleicht sollte ich (Verschieben-Ende der Zeile nil) vor beiden hinzufügen (rückwärts suchen "# + BEGIN_SRC")?
RUserPassingBy
1
Hervorragender Punkt. Ich habe meine Antwort so aktualisiert, dass sie (end-of-line)vor der Suche eingefügt wird. Dadurch wird der Punkt an das Ende von #+BEGIN_SRCverschoben, wenn Sie davor stehen (ohne andere Funktionen einzuschränken). Lassen Sie mich wissen, wenn Sie immer noch Probleme haben.
GJStein
Ich danke Ihnen für Ihren Code! Es ist wirklich großartig!!
RUserPassingBy
Vielen Dank.
Ich habe