Vim语法突出显示为$1和lstlisting';s LSTNINLINE

Vim语法突出显示为$1和lstlisting';s LSTNINLINE,vim,latex,vim-syntax-highlighting,lstlisting,Vim,Latex,Vim Syntax Highlighting,Lstlisting,如果我使用清单的内联版本,如图所示: \lstinline{!$omp parallel for} vim中的语法高亮显示出错,latex文件的其余部分被涂成红色,就好像它是代码列表的一部分一样。是美元引起了问题。我怎样才能避免这个问题?我没有这个问题。我使用filetype=tex运行Vim 7.3.46。(我的.tex文件默认为“plaintex”;您可能想使用:set ft检查文件类型?这不是一个真正的bug–这是出于设计。为了正确强调这一点,Vim必须解析和解释整个TeX文档,直到出现

如果我使用清单的内联版本,如图所示:

\lstinline{!$omp parallel for}

vim中的语法高亮显示出错,latex文件的其余部分被涂成红色,就好像它是代码列表的一部分一样。是美元引起了问题。我怎样才能避免这个问题?

我没有这个问题。我使用filetype=tex运行Vim 7.3.46。(我的.tex文件默认为“plaintex”;您可能想使用:set ft检查文件类型?

这不是一个真正的bug–这是出于设计。为了正确强调这一点,Vim必须解析和解释整个TeX文档,直到出现此代码为止,因为TeX是一种上下文敏感语言。对于语法突出显示插件来说,这既太复杂又太耗时

唯一可接受的修复方法是从头重写语法highlighter,使用一个完整的TeX实现,为源代码中的每个令牌发出元信息。这是一个巨大的项目。据我所知,目前没有可用的TeX实现提供此类信息,这意味着必须自己编写此文件。

这对我很有用:

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

据我所知,它在数学模式下打印美元符号,但我看不出任何明显的区别。

在tex文件中插入knitr的R命令时,我遇到了类似的问题。我在
\rinline{}
中有很多
$
和其他特殊字符。我修正了它,使得Vim忽略了这个命令中的文本

您想编辑tex.vim文件,在我的发行版上是
sudo-vim/usr/share/vim/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在用户1174052的答案上发布的链接,我发现,它提供了Vimball插件。下载,在Vim中打开

vim lstlisting.vba.gz
…执行vimball

:so %
…下次打开LaTeX文件时,语法突出显示将完全忽略
lstlisting
环境的内容


归功于用户timss,他发布了乳胶盒门票的链接,并在那里发布了Chip博士页面的链接。我添加这个答案只是为了“直接链接”快捷方式。

让我们最终一劳永逸地解决这个问题吧

我给Charles E.Campbell发了邮件,他是
tex.vim
的维护者,建议他为列表包添加突出显示规则。然而,事实证明,缺乏对
tex.vim
中listings包的支持实际上是故意的。推理可以在
:h tex package
中找到。简而言之,您应该创建自己的扩展语法突出显示规则(请参阅文章底部):

特克斯:想突出显示更多命令吗

LaTeX是一种可编程语言,因此有数千个完整的包 专门的LaTeX命令、语法和字体。如果你用的是这样的 您通常希望分布式语法/tex.vim支持的包 信息技术然而,这显然是不切实际的。所以请考虑使用 mysyntaxfile中的技术用于扩展或修改所提供的突出显示 按语法/tex.vim。请考虑上传你所写的任何扩展, 通常是$HOME/after/syntax/tex/[pkgname].vim,to

就我个人而言,我认为它没有被包括进来有点遗憾,因为它肯定会增加普通用户使用Vim编写自己的LaTeX的门槛。为
lstlisting
lstinline
等查找和添加语法突出显示并不容易。看线程时,它看起来也不会很快改变

DevSolar似乎已经找到了它(我很感激这一点!),但坎贝尔提供了一些建议。第一个,包括突出显示
lstlisting
lstinputlisting
的规则。但是,它确实缺少本主题所涉及的
lstinline

最后,这里是我的
清单。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
,因为它缺少太多不可行的内容。已经在上面的评论中发布了这篇文章,但是更多的信息可以在一篇文章中找到

在我看来,最初的问题是,tex文件的其余部分显示时语法突出显示混乱。因此,也许简单可行的解决方案是使用

%stopzone
在lstlisting区域之后。

基于'answer',创建一个名为
~/.vim/after/syntax/tex/listings.tex的文件,并添加以下规则。将
YOURENV
替换为要为其设置突出显示例外的环境

syn region texZone start="\\begin{YOURENV}" end="\\end{YOURENV}\|%stopzone\>"
现在,下次使用现有的
.tex
文件打开Vim时,应自动加载此规则


这似乎是tex的一般vim语法中的一个错误,因为
\verb{!$omp}
会产生相同的结果。您可以尝试最新的语法文件,并联系它的作者Charles E.Campbell,Jr.50 rep,无论谁用tex.vim的修复程序来回答。如果它处理
\lstinline{…}
块就足够了,就像处理一切正常的
\begin{lstlisting}…\end{lstlisting}
块一样。祝您好运。我使用Vim 7.3和
:set ft?
给出文件类型=tex。可以选择在/syntax/tex/lstinline.Vim之后添加
syn match texInputFile“\\lstinline\s*(\[.*\]\)\={.\{-}”包含=texStatement、texinputcollies、texInputFileOpt
$HOME/.Vim/after/syntax/tex/lstinline.Vim