Як переключити блок вихідного коду в режимі «Org» у статусі «: eval no»


9

Я часто обмежую або обмежую оцінку конкретних блоків коду в babel-режимі, використовуючи :evalаргумент заголовка.

Ось приклад:

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

#+RESULTS:
: 2

Я перемикаю кодові блоки між :eval noта :eval n(або видаляю :eval noповністю) вручну.

#+PROPERTY: eval no зручно, але не підходить для кожного блоку коду.

Чи є кращі способи зміни :evalстатусу зручно, як нижче?

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

Відповіді:


7

Я придумав відносно приємне рішення, яке покладається на org-in-block-pфункцію, яку я рекомендую поглянути. Додайте у init.elфайл такий код :

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

Це визначає функцію, org-toggle-src-eval-noі вона повинна робити саме те, що ви хочете; у будь-який час ви знаходитесь у блоці коду, він перемикає присутність :eval no. Я зв'язав це C-c t, але не соромтеся нанести його на все, що завгодно. Щасливі орг.


1
Дивовижний! Це справді чудово! Це саме те, що я хотів! Я не сподівався отримати рішення так швидко. Тим часом я помітив лише одну дрібницю. Коли у мене є 2 кодові блоки, якщо я Cc t на початку рядка другого блоку # + BEGIN_SRC, перший блок коду перемикається. Можливо, я повинен додати нуль (переміщення в кінці рядка) до обох (пошук назад "# + BEGIN_SRC")?
RUserPassingBy

1
Відмінний момент. Я оновив свою відповідь, щоб включити її (end-of-line)до пошуку, яка переміщує точку до кінця, #+BEGIN_SRCякщо ви перебуваєте перед цим (не обмежуючи жодної іншої функціональності). Повідомте мене, якщо у вас все ще виникають проблеми.
GJStein

Дякую за Ваш код! Це дійсно чудово !!
RUserPassingBy

Дуже дякую. Довго шукав таку функціональність :)
Thomas Dehaeze
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.