Come attivare lo stato del blocco del codice sorgente in modalità Org ": eval no"


9

Spesso limito o limito la valutazione di blocchi di codice specifici in babel in modalità org usando l' :evalargomento header.

Ecco un esempio:

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

#+RESULTS:
: 2

Attivo manualmente i blocchi di codice tra :eval noe :eval n(o elimina :eval nocompletamente).

#+PROPERTY: eval no è conveniente, ma non è adatto per ogni blocco di codice.

Esistono modi migliori per attivare lo :evalstato, come di seguito?

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

Risposte:


7

Ho trovato una soluzione relativamente bella, che si basa sulla org-in-block-pfunzione, che consiglierei di dare un'occhiata. Aggiungi il seguente codice al tuo init.elfile:

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

Questo definisce la funzione org-toggle-src-eval-noe dovrebbe fare esattamente quello che vuoi; ogni volta che ti trovi all'interno di un blocco di codice, commuta la presenza di :eval no. L'ho vincolato C-c t, ma sentiti libero di mapparlo a qualsiasi cosa tu voglia. Buona organizzazione.


1
Sorprendente! E 'davvero grandioso! Questo è esattamente quello che volevo! Non mi aspettavo di ottenere la soluzione così rapidamente. Nel frattempo ho notato solo una cosa banale. Quando ho 2 blocchi di codice, se I Cc t all'inizio di una riga del secondo blocco # + BEGIN_SRC, il primo blocco di codice viene attivato. Forse dovrei aggiungere (sposta-fine-riga-zero) prima di entrambi (ricerca indietro "# + BEGIN_SRC")?
RUserPassingBy

1
Punto eccellente. Ho aggiornato la mia risposta per includerla (end-of-line)prima della ricerca, che sposta il punto alla fine del punto in #+BEGIN_SRCcui ci si trova prima (senza limitare altre funzionalità). Fammi sapere se hai ancora problemi.
GJStein,

Ti ringrazio per il tuo codice! E 'davvero grandioso!!
RUserPassingBy

Molte grazie. Cercavo una tale funzionalità da molto tempo :)
Thomas Dehaeze il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.