¿Es posible hacer yasnippets para expandir fragmentos dentro de una sección babel en modo org en el modo apropiado?

10

Por ejemplo, tengo un modo de organización que tiene lo siguiente

#+BEGIN_SRC emacs-lisp


#+END_SRC

¿Es posible configurar yasnippets de tal manera que todos los fragmentos emacs-lisp-mode se puedan expandir dentro de ese bloque pero no fuera de él?

Rafa de Castro
fuente
66
Creo que la forma "estándar" sería editar esos bloques de C-c 'todos modos; en ese caso, el modo principal emacs-lisp tendría los fragmentos de yasnippet apropiados cargados mientras edita el bloque en su ventana separada (que también se ocupa de la sangría correcta etc.)
VanLaser
Sí, estoy de acuerdo con la respuesta de VanLaser. Funciona para cualquier idioma compatible con emacs.
dmg
Oh verdad. Tienes razón. ¿Puede poner esto en una respuesta para que marque su respuesta como correcta? No pensé en eso: P
Rafa de Castro

Respuestas:

7

A partir de 2017, 22 de enero, si configura org-src-tab-acts-nativelyy org-src-fontify-natively, luego, TAB en los bloques de origen expandirá los fragmentos del idioma del bloque. Es posible que desee configurar yas-buffer-local-conditionpara evitar que los fragmentos de modo de organización sigan los fragmentos del modo de bloque:

(defun my-org-mode-hook ()
  (setq-local yas-buffer-local-condition
              '(not (org-in-src-block-p t))))
(add-hook 'org-mode-hook #'my-org-mode-hook)

Ver también https://github.com/joaotavora/yasnippet/issues/761 , https://github.com/joaotavora/yasnippet/pull/760

npostavs
fuente
2

Yo uso dos métodos para esto. Tengo algunos fragmentos de organización para ayudarme a crear los encabezados de babel. Por ejemplo, este crea C ++ - 14 encabezados para Babel. Escribo <s C++_y amplío:

# -*- mode: snippet -*-
# name: c++_header
# key: C++_
# --
C++ :main no :flags -std=c++14 -Wall --pedantic -Werror :results output :exports both
#include <iostream>
int main()
{
   $0

   return 0;
}

Luego uso Cc 'que cambia al modo de idioma específico y uso los fragmentos para ese idioma. Luego use Cc 'para volver al archivo org. Funciona bien.

dmg
fuente
0

Como npostavs ya respondió, los fragmentos se expanden de manera diferente dependiendo de los idiomas dentro de un archivo de modo de organización.

Simplemente escriba "co" y [tab] dentro del bloque de código Python o Emacs Lisp.

#+BEGIN_SRC python :session *Python* :results output
co[tab]
# comment
#+END_SRC

#+BEGIN_SRC emacs-lisp :results value scalar
co[tab]
                                        ; comment
#+END_SRC
RUserPassingBy
fuente