Como alternar o status do bloco de código-fonte do modo Org ": eval no"


9

Geralmente limito ou desmito a avaliação de blocos de código específicos no modo org babel usando o :evalargumento do cabeçalho.

Aqui está um exemplo:

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

#+RESULTS:
: 2

Alterno os blocos de código entre :eval noe :eval n(ou excluo :eval nocompletamente) manualmente.

#+PROPERTY: eval no é conveniente, mas não é adequado para cada bloco de código.

Existem maneiras melhores de alternar o :evalstatus, como abaixo?

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

Respostas:


7

Eu vim com uma solução relativamente boa, que depende da org-in-block-pfunção, que eu recomendo dar uma olhada. Adicione o seguinte código ao seu init.elarquivo:

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

Isso define a função org-toggle-src-eval-noe deve fazer exatamente o que você deseja; sempre que você estiver dentro de um bloco de código, ele alternará a presença de :eval no. Eu o vinculei C-c t, mas fique à vontade para mapeá-lo como desejar. Feliz orgia.


11
Surpreendente! É realmente ótimo! Isto é exatamente o que eu queria! Eu não esperava obter a solução tão rapidamente. Enquanto isso, notei apenas uma coisa trivial. Quando tenho dois blocos de código, se eu Cc t no início de uma linha do segundo bloco # + BEGIN_SRC, o primeiro bloco de código é alternado. Talvez eu deva adicionar (mover o fim da linha nulo) antes de ambos (pesquisar para trás "# + BEGIN_SRC")?
RUserPassingBy

11
Ponto excelente. Atualizei minha resposta para incluir (end-of-line)antes da pesquisa, que move o ponto para o final do #+BEGIN_SRCse você estiver antes (sem limitar nenhuma outra funcionalidade). Deixe-me saber se você ainda está tendo problemas.
GJStein 11/07

Agradeço o seu código! É realmente ótimo !!
RUserPassingBy

Muito obrigado. Estava procurando essa funcionalidade por um longo tempo :)
Thomas Dehaeze
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.