Fügen Sie einen Codeblock in R Markdown mit yasnippet und polymode ein

10

Ich versuche, ein Yasnippet zu schreiben, um Codeblöcke in eine R-Markdown-Datei einzufügen. Ich verwende Polymode, um mehrere Hauptmodi (Markdown, ESS [S]) in einer einzigen Datei zu haben. Das ist mein Ausschnitt:

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

Wenn ich versuche, das Snippet im Markdown-Modus in eine .Rmd-Datei einzufügen, wird folgende Fehlermeldung angezeigt:

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

Das Snippet wird angezeigt und mein Cursor befindet sich an der richtigen Stelle (kurz vor der zweiten geschweiften Klammer):

```{r }

```

Wenn ich auf die Tabulatortaste drücke, wird Folgendes angezeigt:

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

Ich vermute, dass ich auf eine Interaktion mit Polymode stoße: Ich bin im Markdown-Modus, wenn ich das Snippet einfüge, aber dann konvertiert Polymode den Inhalt des Codeblocks in den ESS [S] -Modus. Es sieht so aus, als würde es irgendwann einen Befehl zum Einfügen eines neuen Blocks in Polymode geben, aber gibt es in der Zwischenzeit eine Möglichkeit, dieses Snippet zum Laufen zu bringen?

Kara Woo
quelle

Antworten:

6

Ich bin auf ein ähnliches Problem gestoßen und habe eine eigenständige Funktion geschrieben, um die seltsamen Interaktionen zwischen yasnippetund zu umgehen polymode.

Die folgende Funktion ahmt das Verhalten des von Ihnen versuchten Snippets nach und fordert zuerst zur $1Eingabe der Header-Informationen auf, die bei Ihnen eingefügt werden , und lässt Sie dann in den Chunck-Body (Ihren $0) fallen:

(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
quelle
Danke dafür. Ich bin ein begeisterter Emacs-Benutzer, aber mit Lisp vertraut. Können Sie beschreiben, wie Sie diese Funktion Rmd Workflow implementieren?
Chandler
4
Fügen Sie den Code in Ihre .emacs-Datei ein, damit er bei jedem Start von Emacs geladen wird. Dann können Sie es über anrufen M-x tws-insert-r-chunk. Wahrscheinlich möchten Sie diesen Befehl an eine Tastenkombination binden - hier gibt es viele Fragen zum Festlegen von Tastenkombinationen.
Tyler