Подсветка синтаксиса Vim с помощью lstinline $ и lstlisting

Если я использую встроенную версию lstlisting как показано:

\lstinline{!$omp parallel for}

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

7 ответов

Давайте наконец решим эту проблему раз и навсегда!

Я отправил по почте Чарльза Э. Кэмпбелла, сопровождающего tex.vim, предлагая добавить правила подсветки для пакета листингов. Однако оказывается, что отсутствует поддержка пакета листингов в tex.vim на самом деле намеренно. Обоснование можно найти :h tex-package, Короче говоря, вы должны создать свои собственные расширенные правила подсветки синтаксиса (см. Внизу поста):

Текс: Хотите выделить больше команд?

LaTeX - это программируемый язык, поэтому существуют тысячи пакетов, полных специализированных команд, синтаксиса и шрифтов LaTeX. Если вы используете такой пакет, вам часто хочется, чтобы распределенный синтаксис / tex.vim поддерживал его. Однако ясно, что это нецелесообразно. Поэтому, пожалуйста, подумайте об использовании техник в mysyntaxfile-add для расширения или изменения подсветки, предоставляемой syntax/tex.vim. Пожалуйста, рассмотрите возможность загрузки любых написанных вами расширений, которые обычно помещаются в $HOME/after/syntax/tex/[pkgname].vim, на http://vim.sf.net/.

Лично я думаю, что немного прискорбно, что это не будет включено, поскольку это, несомненно, увеличивает порог для среднего пользователя, чтобы написать его или ее LaTeX, используя Vim. Поиск и добавление подсветки синтаксиса для lstlisting, lstinline и т. д. не так просто. Похоже, что это не изменится в ближайшее время, если взглянуть на эту ветку.

DevSolar, кажется, уже нашел его (и я благодарен за это!), Но Кэмпбелл предлагает пару примеров Vimballs поддержки пакетов LaTeX. Первый, lstlisting.vba.gz, включает правила подсветки для lstlisting а также lstinputlisting, Однако не хватает lstinline, о которой эта тема.

Наконец, вот мой listings.vim проживал в $HOME/.vim/after/syntax/tex/

syn region texZone start="\\begin{lstlisting}" end="\\end{lstlisting}\|%stopzone\>"
syn region texZone  start="\\lstinputlisting" end="{\s*[a-zA-Z/.0-9_^]\+\s*}"
syn match texInputFile "\\lstinline\s*\(\[.*\]\)\={.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt

-

Правильное выделение стенографических, списочных и стилевых окружений

Это кажется предпочтительным решением. Не требуется изменять файлы всей системы в /usr/share/vim/..вам не нужно загружать и создавать исходные тексты vimball или изменять окружение, а не исправлять подсветку синтаксиса. Я мог бы взглянуть на выпуск этого как простого плагина, чтобы сделать его более доступным.

Наконец, не забудьте проверить, что вы на самом деле запускаете tex тип файла, а не plaintex которой не хватает слишком много, чтобы быть жизнеспособным. Уже опубликовал это в комментарии выше, но некоторую дополнительную информацию можно найти в билете, который я добавил в LaTeX-Box.

Первоначальная проблема показалась мне тем, что остальная часть tex-файла показана с неправильной подсветкой синтаксиса. Так что, возможно, простым и практичным решением может быть использование

%stopzone

после lstlisting-региона.

Это на самом деле не ошибка - это дизайн. Чтобы правильно выделить это, Vim должен был бы проанализировать и интерпретировать весь документ TeX вплоть до момента, когда этот код встречается, поскольку TeX является контекстно-зависимым языком. Это слишком сложно и слишком много времени для плагина подсветки синтаксиса.

Единственным приемлемым решением было бы переписать подсветку синтаксиса с нуля, используя полную реализацию TeX, которая выдает метаинформацию для каждого токена в исходном коде. Это огромный проект. Насколько я знаю, ни одна из доступных в настоящее время реализаций TeX не дает такой информации, а это значит, что действительно придется написать это самому.

Это работает для меня:

\lstinline[mathescape]{!$\$$omp parallel for}

Насколько я понимаю, он набирает символ доллара в математическом режиме, но я не вижу видимой разницы.

У меня была похожая проблема с вставкой команд R для knitr в текстовые файлы. У меня было много $ и другие специальные символы в \rinline{}, И я исправил это так, что Vim игнорирует текст в этой команде.

Вы хотите отредактировать файл tex.vim, в моем дистрибутиве он sudo vim /usr/share/vim/vim73/syntax/tex.vim

В ок. строка 228:

syn match texInputFile      "\\\(epsfig\|input\|usepackage\)\s*\(\[.*\]\)\={.\{-}}"     contains=texStatement,texInputCurlies,texInputFileOpt

Изменить на:

syn match texInputFile      "\\\(epsfig\|input\|usepackage\|rinline\)\s*\(\[.*\]\)\={.\{-}}"        contains=texStatement,texInputCurlies,texInputFileOpt

... или для lstinline:

syn match texInputFile      "\\\(epsfig\|input\|usepackage\|lstinline\)\s*\(\[.*\]\)\={.\{-}}"      contains=texStatement,texInputCurlies,texInputFileOpt

Основываясь на ответе timss, создайте файл с именем ~/.vim/after/syntax/tex/listings.texи добавьте следующее правило. Заменить YOURENV со средой, для которой нужно сделать исключение выделения!

       syn region texZone start="\\begin{YOURENV}" end="\\end{YOURENV}\|%stopzone\>"

Теперь это правило должно автоматически загружаться при следующем открытии Vim с существующим .tex файл.

У меня нет этой проблемы. Я использую Vim 7.3.46 с filetype=tex. (По умолчанию в моих файлах.tex по умолчанию используется "plaintex"; вы можете проверить тип файла с помощью:set ft?)

Просматривая ссылку, опубликованную timss на ответ пользователя user1174052, я нашел страницу Vim доктора Чипа, которая предоставляет плагин lstlisting.vba.gz Vimball. Скачать, открыть в Vim...

vim lstlisting.vba.gz

... выполнить Vimball...

:so %

... и в следующий раз, когда вы откроете файл LaTeX, содержимое lstlisting окружение полностью игнорируется подсветкой синтаксиса.

Кредит идет на пользователя Timss, который разместил ссылку на билет LaTeX-Box, где он также разместил ссылку на страницу доктора Чипа. Я добавил этот ответ просто как ярлык "прямая ссылка".

Другие вопросы по тегам