Inserte un fragmento de código en R Markdown con yasnippet y polymode

10

Estoy tratando de escribir un yasnippet para insertar fragmentos de código en un archivo R Markdown. Utilizo polymode para tener múltiples modos principales (markdown, ESS [S]) en un solo archivo. Este es mi fragmento:

# -*- mode: snippet -*-
# name: chunk
# key: chunk
# --
\`\`\`{r $1}
$0
\`\`\`

Cuando trato de insertar el fragmento en un archivo .Rmd en modo de reducción, obtengo este error:

Error in post-command-hook (yas--post-command-handler): (error "Marker points into wrong buffer" #<marker at 7 in test.Rmd>)

El fragmento aparece y mi cursor está en el lugar correcto (justo antes de la segunda llave):

```{r }

```

Cuando presiono la pestaña, aparece lo siguiente:

yas-next-field: Wrong type argument: overlayp, nil

Supongo que me encuentro con una interacción con polymode: estoy en modo markdown cuando inserto el fragmento, pero luego polymode convierte el contenido del fragmento de código en modo ESS [S]. Parece que eventualmente habrá un comando para insertar un nuevo fragmento en el modo polimérico, pero mientras tanto, ¿hay alguna manera de hacer que este fragmento funcione?

Kara Woo
fuente

Respuestas:

6

Me encontré con un problema similar y escribí una función independiente para sortear las extrañas interacciones entre yasnippety polymode.

La siguiente función imita el comportamiento del fragmento que probó, solicitando primero la información del encabezado, que se inserta en su $1, y luego lo deja en el cuerpo del fragmento (su $0):

(defun tws-insert-r-chunk (header) 
  "Insert an r-chunk in markdown mode. Necessary due to interactions between polymode and yas snippet" 
  (interactive "sHeader: ") 
  (insert (concat "```{r " header "}\n\n```")) 
  (forward-line -1))
Tyler
fuente
Gracias por esto. Soy un usuario ávido de emacs pero estoy familiarizado con lisp. ¿Puede describir cómo implementa esta función de flujo de trabajo Rmd?
chandler
44
Ponga el código en su archivo .emacs, para que se cargue cada vez que inicie Emacs. Entonces puedes llamarlo a través de M-x tws-insert-r-chunk. Probablemente querrá vincular este comando a un atajo de teclado: aquí hay muchas preguntas sobre cómo configurar las combinaciones de teclas.
Tyler