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

use*_*370 28 vim latex lstlisting vim-syntax-highlighting

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

\lstinline{!$omp parallel for}
Run Code Online (Sandbox Code Playgroud)

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

tim*_*mss 22

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

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

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

LaTeX是一种可编程语言,因此有成千上万的软件包充满了专门的LaTeX命令,语法和字体.如果你正在使用这样的软件包,你通常希望分布式语法/ tex.vim支持它.但是,显然这是不切实际的.因此,请考虑使用mysyntaxfile-add中的技术来扩展或修改syntax/tex.vim提供的突出显示.请考虑将您编写的任何扩展名上传到http://vim.sf.net/,这些扩展名通常位于$ HOME/after/syntax/tex/[pkgname] .vim中 .

就我个人而言,我认为它不会被包括在内有点不幸,因为它肯定会增加普通用户使用Vim写他或她的LaTeX的门槛.查找并添加语法高亮lstlisting,lstinline等等是不是太容易了.看到这个帖子时,它看起来不会很快改变.

DevSolar似乎已经找到了它(我很感激信用!),但Campbell提供了几个示例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
Run Code Online (Sandbox Code Playgroud)

-

正确突出逐字,lstlisting和lstinline环境.

这似乎是首选的解决方案.它不需要更改系统范围的文件/usr/share/vim/..,您不必下载和获取vimball或更改环境,而不是修复语法突出显示本身.我可能会考虑将其作为一个简单的插件发布,以使其更易于访问.

最后,请记住检查您实际上是在运行tex文件类型,而不是plaintex缺少太多不可行的文件类型.已在上面的评论中发布此内容,但在我添加到LaTeX-Box的故障单中可以找到更多信息.

  • 重复一遍,你的课程改变工作*只要*你使用裸`\ begin {lstlisting}`.但通常你不会这样做,你会在一个名为`\ terminal`的宏中使用`lstlisting`.如果你然后使用`\ terminal {$ uname -a}`这会搞砸你的突出显示.当然,您现在可以为`\ terminal`添加特殊的语法规则.我只是说这不是一般的*解决方案(虽然它在实践中可能运行得很好),因为在执行脚本期间可能会重新定义`\ terminal`.不,这不仅仅是一个理论问题,我遇到过这种情况. (3认同)

Kon*_*lph 6

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

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

  • 好吧,如果它处理`\ lstinline {...}`块就足够了,例如``begin {lstlisting} ...\end {lstlisting}`其中一切正常. (5认同)

小智 6

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

%stopzone
Run Code Online (Sandbox Code Playgroud)

在 lstlisting-Region 之后。


小智 0

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