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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.