Подтвердить что ты не робот

Проблема с использованием 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, которые кажутся релевантными, но ни один из них до сих пор не привел к решению:

4b9b3361

Ответ 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 

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