Подсветка синтаксиса 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, где он также разместил ссылку на страницу доктора Чипа. Я добавил этот ответ просто как ярлык "прямая ссылка".