Проблема с использованием Vim syn-include и syn-region для включения подсветки синтаксиса
Я пытаюсь заставить Vim синтаксис выделить любой файл, который заканчивается расширением .Rtex
следующим образом:
- Весь текст верхнего уровня выделяется как TeX
- Исключение: любой текст, заключенный в
\begin{python}...\end{python}
, выделяется как Python
Я могу выполнить каждый из этих критериев индивидуально, но не могу достичь одновременно. Я думаю, что как-то подсветка TeX переопределяет области, выделенные Python, или препятствует их вступлению в силу, и я застреваю, пытаясь понять, как это сделать.
Первый шаг: изменить .vimrc
, чтобы предоставить файлы с расширением .Rtex
filetype 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 :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}" [email protected]
Команда unlet! b:current_syntax
предназначена для принудительного выполнения файла синтаксиса python.vim
, даже если существующий синтаксис (TeX) уже активен.
Проблема: Если я теперь открою файл .Rtex
, весь файл по-прежнему будет выделен только как TeX. Область \begin{python}...\end{python}
, по-видимому, не имеет эффекта.
Эксперимент:. Если я удалю или закомментирую команду runtime!
, я получаю выделение python в пределах областей \begin{python}...\end{python}
точно так, как вам нужно, но, конечно же, подсветка TeX в остальном документа. Поэтому я пришел к выводу, что подсветка TeX как-то ответственна за предотвращение влияния областей python.
Может ли Мастер Vim предложить мне какие-нибудь предложения? Сейчас я в тупике. Я рассмотрел несколько страниц и вопросы, связанные с stackoverflow, которые кажутся релевантными, но ни один из них до сих пор не привел к решению:
Ответы
Ответ 1
После некоторого более подробного изучения руководства и гораздо большего количества проб и ошибок я наконец ответил на свой вопрос (одновременно смущающее и возвышенное достижение), которое я теперь сохраняю здесь для потомков.
В принципе, я думаю, проблема в том, что подсветка python не будет действовать, потому что область pythonCode
сама содержалась в области или группе выделения, определенной tex.vim
, поэтому она не была верхним уровнем. Решение также должно include
(а не просто runtime
) tex.vim
, указывая ему имя как @TeX
, а затем добавьте [email protected]
в мое определение области 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}" [email protected] [email protected]
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]()
Ответ 2
Я не знаю, помогает ли это, но хак, который я использую с моими файлами Rnw, использующими как текс, так и функции rnoweb, выглядит следующим образом:
au BufEnter *.Rnw set filetype=tex | set filetype=rnoweb
Будет ли адаптированная версия работать в вашем случае?