Inserir pedaço de código no R Markdown com yasnippet e polymode

10

Estou tentando escrever um yasnippet para inserir pedaços de código em um arquivo R Markdown. Eu uso o polimodo para ter vários modos principais (remarcação, ESS [S]) em um único arquivo. Este é o meu trecho:

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

Quando tento inserir o trecho em um arquivo .Rmd no modo de remarcação, recebo este erro:

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

O trecho aparece e meu cursor está no local correto (logo antes da segunda chave):

```{r }

```

Quando clico na guia, obtenho o seguinte:

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

Suponho que estou tendo uma interação com o polimodo: estou no modo de marcação quando insiro o trecho, mas o polimodo converte o conteúdo do bloco de código no modo ESS [S]. Parece que, eventualmente, haverá um comando para inserir um novo pedaço no polimodo, mas, enquanto isso, existe alguma maneira de fazer esse snippet funcionar?

Kara Woo
fonte

Respostas:

6

Encontrei um problema semelhante e escrevi uma função independente para contornar as interações estranhas entre yasnippete polymode.

A função a seguir imita o comportamento do snippet que você tentou, solicitando primeiro as informações do cabeçalho, que são inseridas no seu $1e, em seguida, soltando você no corpo do chunck (seu $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
fonte
Obrigado por isso. Eu sou um usuário ávido do emacs, mas familiarizado com o lisp. Você pode descrever como você implementa essa função Rmd workflow?
Chandler
4
Coloque o código no seu arquivo .emacs, para que ele seja carregado toda vez que você iniciar o Emacs. Então você pode chamá-lo via M-x tws-insert-r-chunk. Provavelmente, você desejará vincular esse comando a um atalho de teclado - há muitas perguntas aqui sobre como definir combinações de teclas.
Tyler #