Vim语法用$和lstlisting的lstinline突出显示

时间:2011-07-18 20:19:19

标签: vim latex vim-syntax-highlighting lstlisting

如果我使用lstlisting的内联版本,如下所示:

\lstinline{!$omp parallel for}

vim中的语法高亮显示错误,并且乳胶文件的其余部分显示为红色,就好像它是代码清单的所有部分一样。导致问题的是美元$。我怎么能避免这个?

8 个答案:

答案 0 :(得分:20)

让我们一劳永逸地解决这个问题!

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

  

特克斯:想要突出更多命令?

     

LaTeX是一种可编程语言,因此有数千个软件包已满   专业的LaTeX命令,语法和字体。如果你正在使用这样的   包你通常希望分布式语法/ tex.vim支持   它。但是,显然这是不切实际的。所以请考虑使用   mysyntaxfile-add中的技术可以扩展或修改提供的突出显示   通过syntax / tex.vim。请考虑上传您撰写的任何扩展程序,   通常会进入$ HOME / after / syntax / tex / [pkgname] .vim,to   http://vim.sf.net/

就我个人而言,我认为它不会被包括在内有点不幸,因为它肯定会增加普通用户使用Vim编写他或她的LaTeX的门槛。查找和添加lstlistinglstinline等语法突出显示并不太容易。在查看this线程时,它看起来不会很快改变。

DevSolar似乎已经找到了它(我很感激信用!),但坎贝尔提供了几个example LaTeX package support vimballs。第一个lstlisting.vba.gz包括lstlistinglstinputlisting的突出显示规则。但它确实缺少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,这些文件类型缺乏足够的可行性。已在上面的评论中发布此内容,但可以在ticket I added to LaTeX-Box中找到更多信息。

答案 1 :(得分:6)

这不是一个真正的错误 - 它是设计的。为了正确地突出显示这一点,Vim必须解析并解释整个TeX文档,直到此代码出现,因为TeX是一种上下文敏感的语言。这对于语法高亮插件来说太复杂且太耗时。

唯一可接受的修复方法是从头开始重写语法高亮显示,使用完整的TeX实现,为源代码中的每个标记发出元信息。这是一个巨大的项目。据我所知,目前没有可用的TeX实现提供了这样的信息,这意味着一个人真的必须自己写这个。

答案 2 :(得分:4)

这对我有用:

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

据我了解,它在数学模式中排版美元符号,但我看不出任何明显的差异。

答案 3 :(得分:4)

最初的问题在我看来,tex-File的其余部分显示为混乱的语法高亮显示。因此,简单实用的解决方案可能是使用

%stopzone

在lstlisting-Region之后。

答案 4 :(得分:3)

我在tex文件中为knitr插入R命令时遇到了类似的问题。我在$中有很多\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

答案 5 :(得分:1)

基于timss'答案,创建一个名为~/.vim/after/syntax/tex/listings.tex的文件并添加以下规则。将YOURENV替换为您要使其成为突出显示异常的环境!

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

现在,下次使用现有的.tex文件打开Vim时,应该自动加载此规则。

screenshot of the highlighting before and after adding the rule

答案 6 :(得分:0)

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

答案 7 :(得分:0)

通过timss发布的关于user1174052答案的链接,我找到了Dr Chip's Vim Page,它提供了lstlisting.vba.gz Vimball插件。下载,在Vim中打开...

vim lstlisting.vba.gz

...执行vimball ......

:so %

...下次打开LaTeX文件时,语法突出显示会完全忽略lstlisting个环境的内容。

信用转到用户timss,谁发布了LaTeX-Box票证的链接,他还在那里发布了Dr Chip的页面链接。我将这个答案仅仅作为“直接链接”的快捷方式添加了。