Проблема использования syn-include и syn-region в Vim для вставки подсветки синтаксиса - PullRequest
11 голосов
/ 03 марта 2011

Я пытаюсь заставить Vim синтаксически выделить любой файл, который заканчивается расширением .Rtex, следующим образом:

  • Весь текст верхнего уровня выделен как TeX
  • Исключение: любой текст, заключенный в \begin{python}...\end{python}, выделяется как Python

Я могу выполнить каждый из этих критериев индивидуально, но не могу достичь обоих одновременно. Я думаю, что каким-то образом подсветка TeX переопределяет мои области, выделенные Python, или препятствует их действию, и я застрял, пытаясь понять, как это сделать.

Первый шаг: изменить .vimrc, чтобы получить файлы с расширением .Rtex тип файла rtex:

  au BufRead *.Rtex setf rtex

Второй шаг: создать ~/.vim/syntax/rtex.vim. Именно содержимое этого файла будет определять способ выделения .Rtex файлов.

Третий шаг: включить общую подсветку TeX верхнего уровня, сделав rtex.vim похожим на это:

runtime! syntax/tex.vim

Если я сейчас открою файл .Rtex, весь файл будет выделен как TeX, включая любой текст в \begin{python}...\end{python}, как и ожидалось.

Четвертый шаг: следуйте инструкциям Vim's :help syn-include, чтобы включить подсветку Python и применить ее ко всем регионам, ограниченным \begin{python} и \end{python}. Мой rtex.vim файл теперь выглядит так:

runtime! syntax/tex.vim
unlet! b:current_syntax
syntax include @Python syntax/python.vim
syntax region pythonCode start="\\begin{python}" end="\\end{python}" contains=@Python

Команда unlet! b:current_syntax предназначена для принудительного выполнения файла синтаксиса python.vim, даже если существующий синтаксис (TeX) уже активен.

Проблема: Если я сейчас открою файл .Rtex, весь файл будет выделен только как TeX. Регион \begin{python}...\end{python}, кажется, не имеет никакого эффекта.

Эксперимент: Если я удаляю или комментирую команду runtime!, я делаю получаю подсветку python, в пределах областей \begin{python}...\end{python}, точно так, как нужно, но, конечно, нет Выделение TeX в оставшейся части документа. Поэтому я прихожу к выводу, что подсветка TeX как-то ответственна за предотвращение влияния областей python.

Может ли Мастер Вима предложить мне какие-нибудь предложения? Я в настоящее время в тупике. Я просмотрел несколько страниц и вопросов о стекопереработке, которые кажутся актуальными, но пока ни один из них не привел к решению:

Ответы [ 2 ]

14 голосов
/ 03 марта 2011

После более подробного изучения руководства и гораздо большего количества проб и ошибок я наконец-то ответил на свой собственный вопрос (одновременно смущающее и возвышенное достижение), который я сейчас оставлю здесь для потомков.

В принципе, я думаю, что проблема в том, что подсветка питона не будет действовать, потому что область pythonCode сама содержалась в области или группе подсветки, определенной tex.vim, поэтому она не была верхнего уровня. Решение также состоит в том, чтобы include (а не просто runtime) tex.vim, присвоив ему имя типа @TeX, и затем добавить containedin=@TeX в мое определение области Python. Итак, syntax/rtex.vim теперь выглядит так:

let b:current_syntax = ''
unlet b:current_syntax
runtime! syntax/tex.vim

let b:current_syntax = ''
unlet b:current_syntax
syntax include @TeX syntax/tex.vim

let b:current_syntax = ''
unlet b:current_syntax
syntax include @Python syntax/python.vim
syntax region pythonCode matchgroup=Snip start="\\begin{python}" end="\\end{python}" containedin=@TeX contains=@Python

hi link Snip SpecialComment
let b:current_syntax = 'rtex'

И это работает! Я не уверен, что все эти unlet b:current_syntax команды строго необходимы. Я также дал разделителям области Python группу совпадений (Snip), чтобы они могли выделяться самостоятельно (цветом SpecialComment), а не просто выделяться, что, по-видимому, и происходит по умолчанию, поскольку они больше не рассматриваются часть TeX.

Теперь довольно просто добавить больше областей выделения для разных языков (например, \begin{Scode}...\end{Scode}), что здорово, если вы начинаете грамотное программирование - оригинальная мотивация для моего вопроса.

Редактировать: вот скриншот, показывающий, как он работает с кодом Python и R, встроенным в документ TeX: Screenshot: Python and R embedded in TeX

0 голосов
/ 03 марта 2011

Я не знаю, поможет ли это, но взлом, который я использую с моими файлами Rnw, использующими функции tex и rnoweb, выглядит следующим образом:

 au BufEnter *.Rnw set filetype=tex | set filetype=rnoweb 

Будет ли адаптированная версия работать в вашем случае?

...