ใส่ code chunk ใน R Markdown ด้วย yasnippet และ polymode


10

ฉันพยายามเขียน yasnippet เพื่อแทรกโค้ด chunks ลงในไฟล์ R Markdown ฉันใช้ polymode เพื่อให้มีโหมดที่สำคัญหลายอย่าง (markdown, ESS [S]) ในไฟล์เดียว นี่คือตัวอย่างของฉัน:

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

เมื่อฉันพยายามแทรกตัวอย่างลงในไฟล์. RMd ในโหมด markdown ฉันได้รับข้อผิดพลาดนี้:

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

ตัวอย่างจะปรากฏขึ้นและเคอร์เซอร์ของฉันอยู่ในตำแหน่งที่ถูกต้อง (ขวาก่อนวงเล็บปีกกาที่สอง):

```{r }

```

เมื่อฉันกดแท็บฉันจะได้รับสิ่งต่อไปนี้:

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

ฉันเดาว่าฉันกำลังมีปฏิสัมพันธ์กับ polymode: ฉันอยู่ในโหมด markdown เมื่อฉันแทรก snippet แต่จากนั้น polymode จะแปลงเนื้อหาของ code chunk เป็นโหมด ESS [S] ดูเหมือนว่าในที่สุดจะมีคำสั่งให้แทรกอันใหม่ในโพลีโมด แต่ในระหว่างนี้มีวิธีใดที่จะทำให้ตัวอย่างข้อมูลนี้ทำงานได้หรือไม่

คำตอบ:


6

ฉันวิ่งเข้าไปในปัญหาที่คล้ายกันและเขียนฟังก์ชั่นแบบสแตนด์อะโลนจะได้รับรอบปฏิสัมพันธ์ระหว่างแปลกและyasnippetpolymode

เลียนแบบฟังก์ชั่นดังต่อไปนี้การทำงานของข้อมูลโค้ดที่คุณพยายามกระตุ้นครั้งแรกสำหรับข้อมูลส่วนหัวที่ได้รับการแทรกที่ของคุณ$1และจากนั้นวางคุณในร่างกาย chunck นี้ (ของคุณ$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))

ขอบคุณสำหรับสิ่งนี้. ฉันเป็นผู้ใช้ emacs ตัวยง แต่คุ้นเคยกับเสียงกระเพื่อมคุณสามารถอธิบายวิธีการใช้ฟังก์ชั่น Rmd เวิร์กโฟลว์นี้ได้หรือไม่?
แช

4
ใส่รหัสในไฟล์. emacs ของคุณเพื่อให้โหลดได้ทุกครั้งที่คุณเริ่ม Emacs M-x tws-insert-r-chunkจากนั้นคุณสามารถเรียกมันผ่าน อาจเป็นไปได้ว่าคุณต้องการผูกคำสั่งนี้กับแป้นพิมพ์ลัด - มีคำถามมากมายเกี่ยวกับการตั้งค่าการโยงคีย์
Tyler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.