Code Indent dans les blocs org-babel src

Dans un org-mode fichier, avec le code suivant:

#+begin_src emacs-lisp
(add-to-list 'org-tab-before-tab-emulation-hook
             (lambda ()
               (when (within-the-body-of-a-begin-src-block)
                 (indent-for-tab-command--as-if-in-lisp-mode))))
#+end_src

je voudrais la touche TAB pour indenter le code comme il le ferait s'il était dans un tampon en mode lisp.

Ce dont j'ai besoin est:

  • un moyen de savoir si le curseur se trouve dans un bloc src. Il a besoin de ne pas se déclencher lorsque sur la ligne d'en-tête elle-même, comme dans ce cas, le pliage org par défaut devrait avoir lieu.
  • une façon d'indenter le code selon le mode (emacs-lisp dans ce cas) spécifié dans l'en-tête.

Org peut déjà mettre en surbrillance les blocs src selon le mode, et les crochets de tabulation sont là. Cela semble faisable.

10
demandé sur user103576 2013-04-03 00:05:51

4 réponses

Depuis Emacs 24.1 vous pouvez maintenant définir l'option suivante:

(setq org-src-tab-acts-natively t)

...et ça devrait gérer tous les blocs src.

21
répondu TabFace 2014-12-01 20:23:39

il suffit de déplacer le point dans le bloc de code et appuyez sur C-c '

cela fera apparaître un tampon en mode elisp, syntaxe higlighting ad all...

11
répondu Tarzan 2013-06-11 06:45:36

Voici une solution approximative:

(defun indent-org-src-block-line ()
  "Indent the current line of emacs lisp code."
  (interactive)
  (let ((info (org-babel-get-src-block-info 'light)))
    (when info
      (let ((lang (nth 0 info)))
        (when (string= lang "emacs-lisp")
          (let ((indent-line-function 'lisp-indent-line))
            (indent-for-tab-command)))))))

(add-to-list 'org-tab-before-tab-emulation-hook
             'indent-org-src-block-line)

il ne traite que les blocs emacs-lisp. J'ai seulement testé avec le bloc src Non-indenté (pas par défaut org).

il est difficile en général de faire fonctionner un mode à l'intérieur d'un autre - de nombreuses commandes de clavier vont entrer en conflit. Mais certains des coups les plus basiques, comme tab for indent, newline, commenting (org va Commenter le code lisp avec #, ce qui est faux) semblent comme s'ils pouvaient être fait pour fonctionner et auraient le plus grand impact.

2
répondu user103576 2013-04-04 19:31:49
(defun my/org-cleanup ()
  (interactive)
  (org-edit-special)
  (indent-buffer)
  (org-edit-src-exit))

devrait le faire, où le "tiret-tampon" est défini comme suit:

(defun indent-buffer ()
  (interactive)
  (indent-region (point-min) (point-max)))
1
répondu ustun 2014-12-01 14:30:03