Смешанный цветовой синтаксис в vim

12

Я часто пишу документы в knitr, используя vim, что означает, что у меня есть код уценки, смешанный с R-кодом. Я хотел бы иметь раскраску синтаксиса R для фрагментов R, но уценку или отсутствие раскраски для всех остальных фрагментов. Это выполнимо? Как?

январь
источник
3
Я думаю , что вы можете, попробуйте посмотреть на vim.wikia.com/wiki/...
nobe4
5
В зависимости от вашего плагина уценки, вы можете иметь или не иметь поддержку раскраски синтаксиса для включенных «блоков кода». В первом случае вам (просто) придется изменить синтаксис плагина, чтобы распознать ваши «R-блоки» как допустимые блоки кода. Во втором случае, возможно, вы можете вдохновить себя на vimrc Джунгунна, особенно на функции s:syntax_includeи s:file_type_handler: github.com/junegunn/dotfiles/blob/master/vimrc
VanLaser
5
Это файл уценки, в котором есть код R внутри блоков кода? Если это так, вы можете добавить R g:markdown_fenced_languagesв свой, vimrcнапример, let g: markdown_fenced_languages ​​= ['r'] `. Я предполагаю, что вы используете синтаксис уценки по умолчанию, предоставленный Тимом Папой. Подробнее об огороженных языках
Питер Ринкер,
1
Файлы синтаксиса Vim, как и большинство вещей в Vim, представляют собой просто последовательность команд Ex, помещенных в файл. Вы можете включить один, два, три или столько, сколько хотите. Создание файла синтаксиса, который выделяет некоторые блоки как язык A и другие блоки как язык B не так сложно (на самом деле, я просто сделал это в другом ответе ). Однако я не совсем уверен, как выглядят документы "knitr"? Это просто уценка? Или другой синтаксис?
Мартин Турной

Ответы:

2

Как отмечает Питер Ринкер , стандартное форматирование разметки Vim уже включает поддержку выделения rкода внутри «блока выделенного кода», и для его включения вам просто нужно установить глобальную переменную с кодом в вашем vimrc:

let g:markdown_fenced_languages = ['r']

Однако после этого вы обнаружите, что ваши блоки кода knitr все еще не выделены.

Это связано с тем, что knitr использует форматирование информационных строк в Pandoc , чтобы отличить код R, который должен быть запущен, от обычного блока кода , а регулярное выделение Markdown в Vim не поддерживает это 1 .

Самый простой способ исправить это - вручную добавить дополнительный элемент синтаксиса, соответствующий блоку кода этого типа, добавив следующую строку в ~/.vim/after/syntax/markdown.vim

syntax region markdownHighlightr matchgroup=markdownCodeDelimiter start=/^\s*```{r}.*$/ end=/^\s*```\ze\s*$/ keepend contains=@markdownHighlightr

Вы также можете рассмотреть возможность установки плагина Vim для подсветки Pandoc, который предположительно будет поддерживать это из коробки.

1: Это не может считаться проблемой в файле синтаксиса уценки Vim. Оригинальный синтаксис Markdown не включает огорожен блоки коды на всех, и CommonMark спецификация не определяет , как информацию строка должна быть отформатирована.

Богатый
источник