Wstaw fragment kodu w R Markdown za pomocą yasnippet i polymode

10

Próbuję napisać yasnippet, aby wstawić fragmenty kodu do pliku R Markdown. Używam trybu wielomodowego, aby mieć wiele głównych trybów (markdown, ESS [S]) w jednym pliku. Oto mój fragment:

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

Gdy próbuję wstawić fragment kodu do pliku .Rmd w trybie Markdown, pojawia się następujący błąd:

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

Fragment pojawia się, a mój kursor znajduje się we właściwym miejscu (tuż przed drugim nawiasiem klamrowym):

```{r }

```

Po naciśnięciu klawisza pojawia się:

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

Zgaduję, że wpadam w interakcję z trybem wielomodowym: po wstawieniu fragmentu znajduję się w trybie Markdown, ale następnie tryb wielomodowy przekształca zawartość fragmentu kodu w tryb ESS [S]. Wygląda na to, że w końcu pojawi się polecenie wstawienia nowego fragmentu w trybie wielomodowym, ale czy w międzyczasie jest jakiś sposób, aby ten fragment kodu zadziałał?

Kara Woo
źródło

Odpowiedzi:

6

Zetknąłem się z podobnym problemem i napisałem samodzielną funkcję, aby obejść dziwne interakcje między yasnippeti polymode.

Poniższa funkcja naśladuje zachowanie próbnego fragmentu, który próbowałeś, najpierw $1pytając o informacje nagłówka, które są wstawiane w twoim , a następnie upuszczając cię do ciała chunck (twoje $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
źródło
Dzięki za to. Jestem zapalonym użytkownikiem emacsa, ale znam Lisp. Czy możesz opisać, jak zaimplementować tę funkcję.
chandler
4
Umieść kod w pliku .emacs, aby był ładowany przy każdym uruchomieniu Emacsa. Następnie możesz zadzwonić za pośrednictwem M-x tws-insert-r-chunk. Prawdopodobnie będziesz chciał powiązać to polecenie ze skrótem klawiaturowym - tutaj jest wiele pytań na temat ustawiania skrótów klawiszowych.
Tyler