Вставте фрагмент коду в R Markdown з yasnippet та polymode


10

Я намагаюся написати ясніппет, щоб вставити фрагменти коду у файл R Markdown. Я використовую полімод, щоб мати кілька основних режимів (розмітка, ESS [S]) в одному файлі. Це мій фрагмент:

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

Коли я намагаюся вставити фрагмент у файл .Rmd у режимі розмітки, я отримую цю помилку:

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

Я здогадуюсь, що я взаємодію з взаємодією з полімодом: я перебуваю в режимі розмітки, коли я вставляю фрагмент, але потім полімод перетворює вміст фрагмента коду в режим ESS [S]. Схоже, зрештою з’явиться команда вставити новий фрагмент у полімод, але тим часом чи є спосіб, щоб цей фрагмент запрацював?

Відповіді:


6

Я зіткнувся з подібним питанням і написав автономну функцію, щоб обійти дивні взаємодії між yasnippetта polymode.

Наступна функція імітує поведінку фрагмента, який ви спробували, спочатку запропонуйте інформацію заголовка, яка вставляється у вас $1, а потім опустить вас у тіло фрагмента (ваше $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, але знайомий з lisp. Чи можете ви описати, як ви реалізуєте цю функцію Rmd робочий процес ??
Чендлер

4
Помістіть код у файл .emacs, щоб він завантажувався щоразу, коли ви запускаєте Emacs. Тоді ви можете зателефонувати через M-x tws-insert-r-chunk. Ймовірно, вам захочеться прив’язати цю команду до комбінації клавіш - тут є багато питань щодо налаштування клавіш.
Тайлер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.