使用vim的latex-suite在环境中封闭文本时,不要删除前导空格

时间:2011-09-29 11:44:07

标签: vim latex latex-suite

我正在使用带有latex-suite插件的vim。 我有一段文字,我希望将其放在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样本,我不想缩进它们或手动封装在环境中。

1 个答案:

答案 0 :(得分: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}部分但包括&lt;?xml可能有点过分,但以防万一你想要它可能值得拥有的其他非xml详细区域。

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

您需要使用语法高亮显示才能生效。