Chèn đoạn mã trong R Markdown với yasnippet và polymode


10

Tôi đang cố gắng viết một yasnippet để chèn các đoạn mã vào tệp R Markdown. Tôi sử dụng polymode để có nhiều chế độ chính (markdown, ESS [S]) trong một tệp duy nhất. Đây là đoạn trích của tôi:

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

Khi tôi cố gắng chèn đoạn mã vào tệp .Rmd ở chế độ đánh dấu, tôi gặp lỗi này:

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

Đoạn mã xuất hiện và con trỏ của tôi ở đúng vị trí (ngay trước dấu ngoặc nhọn thứ hai):

```{r }

```

Khi tôi nhấn tab tôi nhận được như sau:

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

Tôi đoán rằng tôi đang chạy vào một tương tác với polymode: Tôi đang ở chế độ đánh dấu khi tôi chèn đoạn mã, nhưng sau đó polymode chuyển đổi nội dung của đoạn mã thành chế độ ESS [S]. Có vẻ như cuối cùng sẽ có một lệnh để chèn một đoạn mới trong polymode, nhưng trong lúc này, có cách nào để đoạn trích này hoạt động không?

Câu trả lời:


6

Tôi gặp phải một vấn đề tương tự, và đã viết một hàm độc lập để khắc phục các tương tác kỳ lạ giữa yasnippetpolymode.

Hàm sau bắt chước hành vi của đoạn mã bạn đã thử, trước tiên nhắc thông tin tiêu đề, được chèn vào của bạn $1, sau đó thả bạn vào phần thân của chunck (của bạn $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))

Cám ơn vì cái này. Tôi là một người dùng emacs cuồng nhiệt nhưng quen thuộc với lisp, Bạn có thể mô tả cách bạn thực hiện chức năng này Rmd workflow ??
chandler

4
Đặt mã trong tệp .emacs của bạn để nó được tải mỗi khi bạn khởi động Emacs. Sau đó, bạn có thể gọi nó thông qua M-x tws-insert-r-chunk. Có lẽ bạn sẽ muốn liên kết lệnh này với một phím tắt - có rất nhiều câu hỏi ở đây về việc thiết lập các phím bấm.
Tyler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.