VimインデントXMLファイル


100

Vimを学習していますが、これは簡単な作業だと思いましたが、うまく機能しません。ブラウザSOを使用していますが、ソリューションが機能しません。

ファイル(xml)を正しくインデントしようとしています。私が使用するコマンドは:

gg=G 

またはggVG =(これを自分で作成すると、おそらく別のことを行います;))

私の.vimrcは:

syntax on 
filetype plugin indent on 
set nu 

オリジナル、結果、期待される出力は何ですか?
Ingo Karkat 2014年

:set ft? indentexpr?Do it it readの出力は何filetype=xml indentexpr=XmlIndentGet(v:lnum,1)ですか?
Ingo Karkat 2014年

filetype = xml indentexpr = XmlIndentGet(v:lnum、1)。うん
Haagenti


1
このマップに少しだけ追加して作成しm'ggVG=''ます。これにより、現在の行が保存され、ファイルの再インデント後に元の行に戻ります。
Hovis Biddle 2014

回答:


192

ベレイの答えが好きです。ただし、vimrcファイルを変更する必要がないという点で、以下の方が少し柔軟性があります。さらに、XMLファイルの選択した部分をフォーマットする方が簡単です(たまたま私がよく行うことです)。

まず、フォーマットするXMLを強調表示します。

次に、通常モードで次のように入力します ! xmllint --format -

下部のコマンドラインは次のようになります。

:'<,'>!xmllint --format -

次にEnterキーを押します。

技術説明

選択されたテキストはxmllintコマンドに送信されてから送信され--format、結果がxmllintvimで選択されたテキストの上に配置されます。-この場合には、Vimはに送信することが選択されたテキストである、 -コマンドの終了時には、標準入力を受信するためのものですxmllint


6
もちろん、これは外部ツールxmllintをインストールしてパスに追加した場合にのみ機能します。
Polymorphix

65
コマンドを簡略化するために:%!xmllint --format -%は、このxmlファイルのスコープ全体を意味します。
白波2015年

1
なぜ誰もがxmllintツールがあることを期待しますか?Ubuntu 15.04にはありませんし、apt-getでも見つかりません。
erikbwork

8
@ erikb85 パッケージおよびパッケージの内容を検索する場合apt-cache searchapt-get、ではなく、を使用します。libxml2-utils不足しているツールが含まれています。
ParanoiaPuppy

私は、そのプロセスを簡略化するために、あなたに1000倍をupvoteことがしたい@hakunami
niken

69

外部プログラムを使用してxmlファイルをインデントします。この場合はを選択xmllintしたので、コマンドをequalprgオプションに設定します。

:set equalprg=xmllint\ --format\ -

これで実行できます

gg=G

できるようにxmllintあなたのフォーマットxmlのファイルを。

使うたびに手に入れるには 、を使用しautocommandて設定します。

autocommand 下のコメントから

au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null

なぜこれが初心者のためにうまくいくのかわからないが、私はこれを理解するつもりです;)ありがとう今それはうまくいきます;)
Haagenti

8
.vimrcで以下を使用して、xmlファイルを編集するときに有効にすることができますau FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null。ソース- ku1ik.com/2011/09/08/...
studgeek

1
ありがとうございました!大きなXMLファイルとvimで非常にイライラし、Sublimeでは非常にすばやく再インデント(5000〜10,000行とbase64データ)しますが、Vimでは数分再インデントします。このソリューションは、大きなXMLファイルの問題を修正します。もう一度私はVimに満足しています。
Sonique

ubuntuを使用している場合は、libxml2-utilsパッケージをインストールしてxmllintを取得する必要があります
hoffmanc

33

サードパーティのツールを必要としないシンプルな解決策は、各開始タグ「<...>」の前に改行を挿入することです。次に、標準のvim自動インデントを使用できます。要するに:

  1. %s/</\r</g
  2. gg=G 自動インデントする

大きなxmlファイルで試してみましたが、処理に時間がかかります。
Luc M

ありがとうございました。これは十分に簡単で、外部ツールを必要とせずに仕事をします。
空爆

6
私はを好む%s/></>\r</gので、各テキスト要素は同じ行に残ります。
Nicola Musatti

2
@NicolaMusattiまたは、タグの間にスペースがある場合%s/> *</>\r</g
Arthur Tacca

11

〜/ .vimrcが正しく設定されていれば、これは簡単に実現できます。

〜/ .vimrcで以下のオプションを設定します。

filetype indent on
set smartindent

これにより、カーソルをファイルの先頭に移動し、末尾までインデントすることができます:gg = G

ビジュアルモードで目的のテキストを選択し、=を押してインデントすることもできます。


2
.vimrc代わりになると思います.bashrc
美麗

1
おっと。丁度。修正しました。ありがとうございました。
jarederaj

これは、すべてのタグが一列に並んでいるときに機能します。XMLにスペースも終了行もない場合、これは何もしません。
ホセ・ラモン・

マークアップが有効である限り、それは常に私にとってうまくいきました。
jarederaj 2015年

マークアップが(一貫して?)異なる行にない場合は、:%s / </ \ r </ gを使用してそれを次のように変更し、:%s / \ n \ n / \ r /
jarederaj

11

短い答え:をオンにしmatchit.vim。あなたは追加することができpackadd matchit、あなたに.vimrc、または使用VIM-賢明な、デフォルトでそれを可能にします。

長い答え:Vim wikiで議論されているxmllintアプローチを含む、VimでXMLを自動インデントする多くの戦略を試しました。問題点xmllint(およびなど他の外部CLIツールと同じアプローチxmlformattidy、あまりにも)は、それらのすべてが空白改行を絞り出しを主張ということです。空白行、コメント、および/またはその他の意図的なフォーマットを削除せずにXMLをインデントすることだけが必要な場合xmllintは、最善の選択ではありません。

matchit.vimスクリプトが有効になっている限り、Vimの等号(=)コマンドはすでにXMLをサポートしていることがわかります。それを可能にする非常に簡単な方法の1つは、tpopeのvim-sensibleを採用することです。もう1つは、に追加するpackadd matchitこと.vimrcです。そうすれば、XMLフォーマットはそのまま使用できます。


1
より正確には、それがmatchit.vim実際の解決策のように見えます。あなたは、あなたにそれを有効にすることができvimrc、この行を追加することによって:packadd matchit
クリスチャン・ロンドー

1
クリスチャン、ありがとう。答えを更新して、matchit.vimが問題を解決するものであることを明確にしました。
ctrueden 2017年

これは私にとって最も効果的だったので賛成です。しかし、私はそれが非常に簡単で、仕事をして(少なくとも私にとっては)短い答えに(packadd matchit)クリスチャンの提案を追加することをお勧め
マーク

@マーククリスチャンの提案を含めるように回答を更新しました。
ctrueden 2018

4

VIMでは、次のコマンドを使用して(ハードタブを使用して)ファイル全体を自動インデントします。

:%!XMLLINT_INDENT="^I" xmllint --format -

^I:あなたは経由して生成する単一の文字でありますCTRL+ vCTRL+i


1

私も同じ問題を抱えていました。結局、その行は

set viewdir=~\.vim\views\

.vimrcの中で問題を引き起こした。確認してください、あなたはそれを持っていません。


1

ジェシー・ホーガンの答えは良いですが、私はもっと簡単な答えをしたいと思います:

vimでXMLファイルを開いている間に、通常モードで次のように記述します。

:%!xmllint --format %

次にEnterキーを押します。すべてのXMLファイルがフォーマットされます。

以前にxmllintをインストールしておく必要があることに注意してください。


0

coc.nvimプラグインを使用している場合は、でインストールcoc-xmlして:CocInstall coc-xml から、設定ファイルにフォーマットキーをマッピングしますnmap <silent> fm <Plug>(coc-format)。これからは、XMLファイルだけでなく他のファイルも非常に簡単にフォーマットできます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.