2011-09-29 68 views
1

我使用乳胶套房插件VIM在一个封闭的环境文本时不删除空格领先。 我有一段文字,我想在verbatim环境包围。比方说,它看起来像这样:使用vim的乳胶套房

<?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

执行此操作的一种方法是在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}+ [email protected] 
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详细区域,则可能值得。

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

您需要使用语法高亮才能使其工作。

+0

太好了,谢谢。它现在就像一种魅力! :) – jmatraszek