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