Vim indent file xml

101

Saya mempelajari Vim tetapi saya pikir ini adalah tugas yang sederhana tetapi saya tidak dapat membuatnya berfungsi. Saya memiliki browser SO tetapi solusinya tidak berfungsi untuk saya.

Saya mencoba memasukkan file (xml) dengan benar. Perintah yang saya gunakan adalah:

gg=G 

atau ggVG = (membuat yang ini sendiri mungkin melakukan sesuatu yang berbeda;))

.Vimrc saya adalah:

syntax on 
filetype plugin indent on 
set nu 
Haagenti
sumber
Apa keluaran asli, hasil, dan yang diharapkan?
Ingo Karkat
Apa output dari :set ft? indentexpr?Does it read filetype=xml indentexpr=XmlIndentGet(v:lnum,1)?!
Ingo Karkat
filetype = xml indentexpr = XmlIndentGet (v: lnum, 1). Yup
Haagenti
1
Saya suka menambahkan sedikit saja ke peta ini dan membuatnya m'ggVG='', yang hanya menyimpan garis tempat Anda berada dan kembali ke sana setelah mengindentifikasi kembali file tersebut.
Hovis Biddle

Jawaban:

193

Saya suka jawaban Berei. Namun, menurut saya yang berikut ini sedikit lebih fleksibel karena Anda tidak perlu mengubah vimrcfile Anda . Selain itu, lebih mudah untuk memformat bagian tertentu dari file XML (sesuatu yang sering saya lakukan).

Pertama, sorot XML yang ingin Anda format.

Kemudian, dalam mode normal, ketik ! xmllint --format -

Baris perintah Anda di bagian bawah akan terlihat seperti ini:

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

Lalu tekan enter.

Penjelasan Teknis

Teks yang dipilih dikirim ke xmllintperintah, lalu --format'ed, dan hasilnya xmllintditempatkan di atas teks yang Anda pilih di vim. Di -akhir perintah adalah untuk menerima input standar - yang, dalam hal ini, adalah teks terpilih yang dikirim ke vim xmllint.

Jesse Hogan
sumber
6
Ini tentu saja hanya berfungsi jika Anda menginstal alat eksternal xmllint dan ditambahkan ke jalur Anda.
Polymorphix
66
untuk menyederhanakan perintah, :%!xmllint --format -, %berarti seluruh lingkup file xml ini.
hakunami
1
Mengapa semua orang berharap ada alat xmllint? Di Ubuntu 15.04 tidak ada dan apt-get juga tidak dapat menemukannya.
erikbwork
8
@ erikb85 Gunakan apt-cache search, bukan apt-get, saat mencari paket dan isi paket. libxml2-utilsberisi alat yang hilang.
ParanoiaPuppy
@hakunami saya harap saya dapat memberi suara positif 1000 kali untuk menyederhanakan proses itu
niken
69

Gunakan program eksternal untuk memasukkan xmlfile Anda . Dalam hal ini saya telah memilih xmllint, jadi atur perintah ke equalprgopsi:

:set equalprg=xmllint\ --format\ -

Sekarang Anda bisa mengeksekusi

gg=G

untuk xmllintmemformat xmlfile Anda .

Untuk mendapatkannya setiap kali Anda gunakan , gunakan autocommanduntuk menyetelnya.

autocommand dari komentar di bawah

au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null
Birei
sumber
Tidak yakin mengapa ini berhasil maka pemula tapi saya akan mencari tahu yang ini;) Terima kasih ini berhasil sekarang;)
Haagenti
8
Anda dapat menggunakan berikut ini di .vimrc Anda untuk mengaktifkannya saat mengedit file xml - au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null. Sumber - ku1ik.com/2011/09/08/…
studgeek
1
Terima kasih! Sangat frustrasi dengan file XML dan vim yang besar, di Sublime mereka mengindentasi ulang dengan sangat cepat (5000-10000 baris dan data base64), tetapi di Vim mereka mengindentasi ulang beberapa menit. Solusi ini memperbaiki masalah dengan file XML yang besar. Sekali lagi saya senang dengan Vim.
Sonique
jika Anda menggunakan ubuntu, Anda harus menginstal libxml2-utilspaket untuk mendapatkan xmllint
hoffmanc
33

Solusi sederhana yang saya suka yang tidak memerlukan alat pihak ketiga adalah memasukkan baris baru sebelum setiap tag pembuka '<...>'. Kemudian Anda dapat menggunakan indentasi otomatis vim standar. Pendeknya:

  1. %s/</\r</g
  2. gg=G ke indentasi otomatis
KFL
sumber
Saya sudah mencobanya dengan file xml yang besar dan prosesnya sangat lama.
Luc M
Terima kasih. Ini cukup mudah dan melakukan pekerjaan tanpa memerlukan alat eksternal.
serangan udara
6
Saya lebih suka %s/></>\r</g, agar setiap elemen teks tetap pada baris yang sama.
Nicola Musatti
2
@NicolaMusatti Atau jika terkadang ada spasi di antara tag,%s/> *</>\r</g
Arthur Tacca
11

Ini mudah dicapai setelah ~ / .vimrc diatur dengan benar.

Setel opsi berikut di ~ / .vimrc:

filetype indent on
set smartindent

Ini memungkinkan Anda untuk memindahkan kursor ke atas file dan menjorok ke akhir: gg = G

Anda juga dapat memilih teks yang diinginkan dengan mode visual dan tekan = untuk membuat indentasi.

jarederaj.dll
sumber
2
Saya kira itu akan menjadi .vimrcgantinya .bashrc.
Birei
1
Ups. Persis. Perbaiki itu. Terima kasih.
jarederaj
Itu akan berfungsi saat setiap tag berada dalam satu baris. Jika XML tidak memiliki spasi atau garis akhir, ini tidak akan menghasilkan apa-apa.
José Ramón
Itu selalu berhasil untuk saya selama markupnya valid.
jarederaj
Jika markup Anda tidak (secara konsisten?) Pada baris yang berbeda, Anda dapat dengan sembarangan mengubahnya dengan:% s / </ \ r </ g dan kemudian:% s / \ n \ n / \ r /
jarederaj
11

Jawaban singkat: Nyalakan matchit.vim . Anda dapat menambahkan packadd matchitke Anda .vimrc, atau menggunakan vim-sensible , yang mengaktifkannya secara default.

Jawaban panjang: Saya telah mencoba banyak strategi untuk mengindentasi XML secara otomatis di Vim, termasuk pendekatan xmllint yang dibahas di wiki Vim . Masalah dengan xmllint(dan pendekatan yang sama dengan alat CLI eksternal lainnya seperti xmlformatdan tidy, juga) adalah bahwa mereka semua bersikeras memeras baris baru yang kosong. Jika semua yang Anda inginkan adalah mengindentasi XML Anda, tanpa menghapus baris kosong, komentar dan / atau pemformatan yang disengaja lainnya, maka xmllintitu bukanlah pilihan terbaik.

Ternyata perintah Vim's equals (=) sudah mendukung XML, selama script matchit.vim diaktifkan. Salah satu cara super mudah untuk mengaktifkannya adalah dengan mengadopsi vim-sensible tpope . Cara lainnya adalah menambahkan packadd matchitfile .vimrc. Kemudian, pemformatan XML akan "langsung berfungsi" di luar kotak.

ctrueden
sumber
1
Lebih tepatnya, sepertinya itu matchit.vimadalah solusi sebenarnya. Anda dapat mengaktifkannya di Anda vimrcdengan menambahkan baris ini:packadd matchit
Christian Rondeau
1
Terima kasih Christian; Saya memperbarui jawaban untuk mengklarifikasi bahwa matchit.vim adalah yang memecahkan masalah.
ctrueden
Dipilih karena ini paling berhasil untuk saya. Namun, saya akan menyarankan untuk menambahkan saran Christian (packadd matchit) ke jawaban singkat karena sangat sederhana dan melakukan pekerjaan (setidaknya untuk saya)
tandai
@ Mark Saya memperbarui jawaban untuk memasukkan saran Christian.
ctrueden
4

Di VIM, saya membuat indentasi otomatis seluruh file (menggunakan tab keras) menggunakan perintah berikut:

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

Ini ^Iadalah karakter tunggal yang Anda hasilkan melalui: CTRL+ v, CTRL+i

Awan
sumber
1

Saya memiliki masalah yang sama. Ternyata, garis itu

set viewdir=~\.vim\views\

di .vimrcpenyebab masalah saya. Pastikan saja, Anda tidak memilikinya.

Boris Brodski
sumber
1

Jawaban Jesse Hogan bagus, tapi saya lebih suka jawaban yang lebih sederhana:

Saat Anda berada di vim dan file XML Anda dibuka, dalam mode normal tulis ini:

:%!xmllint --format %

lalu tekan Enter. Semua file XML Anda akan diformat.

ingat Anda harus menginstal xmllint sebelumnya.

Cheetah Coder
sumber
0

bagi mereka satu yang menggunakan coc.nvimPlugin, Anda dapat menginstal coc-xmloleh :CocInstall coc-xml , maka pemetaan kunci format file konfigurasi Anda: nmap <silent> fm <Plug>(coc-format). Mulai sekarang, Anda tidak hanya dapat memformat file xml tetapi file lain dengan sangat mudah

lehanh
sumber