Подсветка синтаксиса Vim с помощью lstinline $ и lstlisting - PullRequest
27 голосов
/ 19 июля 2011

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

\lstinline{!$omp parallel for}

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

Ответы [ 7 ]

20 голосов
/ 09 февраля 2014

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

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

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

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

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

DevSolar, кажется, уже нашел его (и я ценю кредит!), Но Кэмпбелл предлагаетпара примеров пакетов поддержки LaTeX vimballs .Первый, 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

-

Proper highlighting of verbatim, lstlisting and lstinline environments.

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

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

6 голосов
/ 27 августа 2011

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

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

4 голосов
/ 28 мая 2014

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

%stopzone

после lstlisting-Region.

4 голосов
/ 09 июня 2012

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

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

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

3 голосов
/ 28 августа 2013

У меня была похожая проблема с вставкой команд 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
0 голосов
/ 14 января 2014

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

vim lstlisting.vba.gz

... выполните vimball ...

:so %

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

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

0 голосов
/ 26 августа 2011

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

...