Insérer un morceau de code dans R Markdown avec yasnippet et polymode

10

J'essaie d'écrire un yasnippet pour insérer des morceaux de code dans un fichier R Markdown. J'utilise le polymode pour avoir plusieurs modes majeurs (markdown, ESS [S]) dans un seul fichier. Voici mon extrait:

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

Lorsque j'essaie d'insérer l'extrait de code dans un fichier .Rmd en mode démarque, j'obtiens cette erreur:

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

L'extrait apparaît et mon curseur est au bon endroit (juste avant la deuxième accolade):

```{r }

```

Lorsque j'appuie sur l'onglet, j'obtiens ce qui suit:

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

Je suppose que je rencontre une interaction avec le polymode: je suis en mode démarque lorsque j'insère l'extrait de code, mais le polymode convertit ensuite le contenu du bloc de code en mode ESS [S]. Il semble qu'il y aura éventuellement une commande pour insérer un nouveau morceau en polymode, mais en attendant, y a-t-il un moyen de faire fonctionner cet extrait?

Kara Woo
la source

Réponses:

6

J'ai rencontré un problème similaire et j'ai écrit une fonction autonome pour contourner les interactions étranges entre yasnippetet polymode.

La fonction suivante imite le comportement de l'extrait de code que vous avez essayé, en demandant d'abord les informations d'en-tête, qui sont insérées dans votre $1, puis vous déposent dans le corps du chunck (votre $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
la source
Merci pour cela. Je suis un utilisateur passionné d'emacs mais familier avec lisp, pouvez-vous décrire comment vous implémentez cette fonction Rmd workflow ??
chandler
4
Mettez le code dans votre fichier .emacs, afin qu'il soit chargé à chaque démarrage d'Emacs. Ensuite, vous pouvez l'appeler via M-x tws-insert-r-chunk. Vous voudrez probablement lier cette commande à un raccourci clavier - il y a beaucoup de questions ici sur la configuration des raccourcis clavier.
Tyler