Masukkan potongan kode dalam R Markdown dengan yasnippet dan polymode

10

Saya mencoba untuk menulis yasnippet untuk memasukkan potongan kode ke file R Markdown. Saya menggunakan polymode untuk memiliki beberapa mode utama (penurunan harga, ESS [S]) dalam satu file. Ini cuplikan saya:

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

Ketika saya mencoba memasukkan cuplikan ke file .Rmd dalam mode penurunan harga, saya mendapatkan kesalahan ini:

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

Cuplikan memang muncul dan kursor saya berada di tempat yang benar (tepat sebelum kurung kurawal kedua):

```{r }

```

Ketika saya menekan tab saya mendapatkan yang berikut:

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

Saya menduga bahwa saya mengalami interaksi dengan polymode: Saya dalam mode penurunan harga ketika saya memasukkan snippet, tetapi kemudian polymode mengubah isi dari kode chunk ke mode ESS [S]. Sepertinya pada akhirnya akan ada perintah untuk memasukkan potongan baru dalam polymode, tetapi sementara itu apakah ada cara untuk membuat potongan ini berfungsi?

Kara Woo
sumber

Jawaban:

6

Saya mengalami masalah yang sama, dan menulis fungsi yang berdiri sendiri untuk menyiasati interaksi aneh antara yasnippetdan polymode.

Fungsi berikut meniru perilaku potongan yang Anda coba, meminta pertama untuk info header, yang dimasukkan di Anda $1, dan kemudian menjatuhkan Anda di badan chunck (Anda $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
sumber
Terima kasih untuk ini. Saya pengguna avid emacs tetapi terbiasa dengan lisp, Bisakah Anda jelaskan bagaimana Anda menerapkan fungsi ini alur kerja Rmd ??
lilin
4
Masukkan kode dalam file .emacs Anda, sehingga akan dimuat setiap kali Anda memulai Emacs. Maka Anda dapat memanggilnya via M-x tws-insert-r-chunk. Mungkin Anda ingin mengikat perintah ini ke pintasan keyboard - ada banyak pertanyaan di sini tentang pengaturan ikatan kunci.
Tyler