1

我正在使用 vim 和 latex-suite 插件。我有一段文字,我想将其包含在verbatim环境中。假设它看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>  
<errors>  
  <error>Record not found</error>  
</errors>

所以我直观地选择文本,按<F5>,键入verbatim并按<CR>。我得到:

\begin{verbatim}
<?xml version="1.0" encoding="UTF-8"?>
<errors>
<error>Record not found</error>
</errors>
\end{verbatim}

我想要得到的是:

\begin{verbatim}
<?xml version="1.0" encoding="UTF-8"?>
<errors>
  <error>Record not found</error>
</errors>
\end{verbatim}

有没有办法使用这种机制来防止封闭在环境中删除前导空格?我有很多 xml 示例,我不想缩进它们或手动将它们包含在环境中。

4

1 回答 1

1

一种方法是在 Tex 语法中嵌入 XML 语法,然后在 XML 代码上使用由相关行的语法突出显示属性确定的 XML 缩进规则。

这样你就可以=在一个区域上运行缩进,它应该做正确的缩进明智的事情。或者甚至它会第一次正确缩进。

首先,创建一个.vim/after/syntax/tex目录并添加以下代码.vim/after/syntax/tex/xmlembed.vim

if exists("b:current_syntax")
    unlet b:current_syntax
endif
syn include @XML syntax/xml.vim
syn region XMLEmbedded matchgroup=XMLCommand
            \ start=+\\begin{verbatim}\n\+<?xml+rs=s+16
            \ skip=+\\$+
            \ end=+\\end{verbatim}+ contains=@XML
syn cluster texZone add=XMLEmbedded
hi def link XMLCommand texZone

func! TexXML(lnum)
    let name = tolower(synIDattr(synID(a:lnum, 1, 1), "name"))
    if  name =~ 'xml'
        return XmlIndentGet(a:lnum, 1)
    endif
    return -1
endfunc
runtime indent/xml.vim
set indentexpr=TexXML(v:lnum)

所做的是将 XML 语法突出显示为 @XML 并定义一个由开始/结束限定的区域(并且还匹配 \begin{verbatim} 部分但包含 <?xml 可能是过大的,但以防万一你想要其他非xml 详细区域可能值得拥有。

之后,此代码段将 XML 缩进规则与runtime indent/xml.vim. XML 由表达式 XmlIndentGet 缩进,但缩进表达式设置为包装函数而不是缩进TexXML。这将检查当前行是否“看起来像 xml”,如果是,则缩进它像 XML,否则使用当前缩进。对于看起来像 XML 的行,该函数只检查语法突出显示是否与“xml”匹配。

您需要启用语法突出显示才能使其正常工作。

于 2011-09-29T12:46:46.783 回答