Jak przełączać blok kodu źródłowego w trybie Org status „: eval no”

9

Często ograniczam lub nie ograniczam oceny konkretnych bloków kodu w Babel w trybie org za pomocą :evalargumentu nagłówka.

Oto przykład:

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

#+RESULTS:
: 2

Przełączam bloki kodu pomiędzy :eval noi :eval n(lub usuwam :eval nocałkowicie) ręcznie.

#+PROPERTY: eval no jest wygodny, ale nie nadaje się do każdego bloku kodu.

Czy są lepsze sposoby przełączania :evalstatusu przydatne, na przykład poniżej?

C-c C-t     (org-todo)
Rotate the TODO state of the current item among
(unmarked) -> TODO -> DONE
RUserPassingBy
źródło

Odpowiedzi:

7

Wymyśliłem stosunkowo fajne rozwiązanie, które opiera się na org-in-block-pfunkcji, którą poleciłbym rzucić okiem. Dodaj następujący kod do init.elpliku:

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

To definiuje funkcję org-toggle-src-eval-noi powinna robić dokładnie to, co chcesz; za każdym razem, gdy znajdziesz się w bloku kodu, zmieni on obecność :eval no. Związałem to C-c t, ale możesz zmapować to, co chcesz. Happy orginging.

GJStein
źródło
1
Niesamowity! To naprawdę wspaniałe! Właśnie tego chciałem! Nie spodziewałem się tak szybkiego rozwiązania. Tymczasem zauważyłem tylko jedną trywialną rzecz. Gdy mam 2 bloki kodu, jeśli I Cc t na początku wiersza drugiego bloku # + BEGIN_SRC, przełącza się pierwszy blok kodu. Być może powinienem dodać (zero końca linii) przed obydwoma (wyszukiwanie wstecz „# + BEGIN_SRC”)?
RUserPassingBy
1
Doskonały punkt Zaktualizowałem swoją odpowiedź, aby uwzględnić ją (end-of-line)przed wyszukiwaniem, co przesuwa punkt na koniec znaku „ #+BEGIN_SRCjeśli jesteś przed” (nie ograniczając żadnej innej funkcjonalności). Daj mi znać, jeśli nadal masz problemy.
GJStein,
Dziękuję za twój kod! To naprawdę wspaniałe!!
RUserPassingBy
Wielkie dzięki. Długo szukałem takiej funkcjonalności :)
Thomas Dehaeze