Cara mengganti status kode sumber Org-mode dengan status ": eval no"

9

Saya sering membatasi atau membatasi evaluasi blok kode tertentu dalam mode-org babel menggunakan :evalargumen header.

Ini sebuah contoh:

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

#+RESULTS:
: 2

Saya beralih blok kode antara :eval nodan :eval n(atau menghapus :eval nosepenuhnya) dengan tangan.

#+PROPERTY: eval no nyaman, tetapi tidak cocok untuk setiap blok kode.

Adakah cara yang lebih baik untuk beralih :evalstatus berguna, seperti di bawah ini?

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

Jawaban:

7

Saya telah datang dengan solusi yang relatif bagus, yang mengandalkan org-in-block-pfungsi, yang saya sarankan untuk melihatnya. Tambahkan kode berikut ke init.elfile Anda :

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

Ini mendefinisikan fungsi org-toggle-src-eval-nodan harus melakukan apa yang Anda inginkan; kapan saja Anda berada di dalam blok kode, itu akan mengubah keberadaan :eval no. Saya telah mengikatnya C-c t, tetapi merasa bebas untuk memetakannya ke apapun yang Anda inginkan. Selamat bersenang-senang.

GJStein
sumber
1
Luar biasa! Sangat bagus! Inilah yang saya inginkan! Saya tidak berharap untuk mendapatkan solusinya dengan begitu cepat. Sementara itu saya perhatikan hanya satu hal sepele. Ketika saya memiliki 2 blok kode, jika saya Cc di awal baris # kedua + BEGIN_SRC blok, blok kode pertama menjadi toggled. Mungkin saya harus menambahkan (pindah-end-of-line nil) sebelum keduanya (cari-mundur "# + BEGIN_SRC")?
RUserPassingBy
1
Poin luar biasa. Saya telah memperbarui jawaban saya untuk disertakan (end-of-line)sebelum pencarian, yang memindahkan titik ke akhir #+BEGIN_SRCjika Anda sebelum itu (tanpa membatasi fungsi lainnya). Beri tahu saya jika Anda masih mengalami masalah.
GJStein
Saya berterima kasih atas kode Anda! Benar-benar hebat !!
RUserPassingBy
Terima kasih banyak. Sedang mencari fungsi seperti itu untuk waktu yang lama :)
Thomas Dehaeze