1

私はラテックススイートプラグインで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 サンプルを持っていますが、手動でそれらをインデントしたり、環境で囲んだりしたくありません。

4

1 に答える 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/end で区切られた領域を定義することです (また、一致する \begin{verbatim} 部分ですが、<?xml を含めるのはおそらくやり過ぎですが、他の非- xml verbose 領域は、持つ価値があるかもしれません。

その後、このスニペットは .xml を使用して XML インデント ルールをインポートしますruntime indent/xml.vim。XML は式 XmlIndentGet によってインデントされますが、その代わりにインデント式がラッパー関数に設定されますTexXML。これは、現在の行が「xml のように見える」かどうかをチェックし、そうであれば XML のようにインデントし、そうでなければ現在のインデントを使用します。行が XML のように見えるようにするために、この関数は構文の強調表示が "xml" に一致するかどうかを単純にチェックします。

これを機能させるには、構文の強調表示をオンにする必要があります。

于 2011-09-29T12:46:46.783 に答える