2011-09-29 32 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