Вставьте фрагмент кода в R Markdown с помощью yasnippet и polymode


10

Я пытаюсь написать yasnippet для вставки фрагментов кода в файл 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 }

```

Когда я нажимаю Tab, я получаю следующее:

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. Можете ли вы описать, как реализовать эту функцию?
Чандлер

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