Vim girintisi xml dosyası


101

Vim öğreniyorum ama bunun basit bir iş olduğunu düşündüm ama işe yarayamıyorum. SO tarayıcım var ama çözümler benim için çalışmıyor.

Bir dosyanın (xml) girintisini doğru bir şekilde yapmaya çalışıyorum. Kullandığım komut:

gg=G 

veya ggVG = (bunu kendim yaptım, muhtemelen farklı bir şey yapar;))

.Vimrc’im:

syntax on 
filetype plugin indent on 
set nu 

Orijinal, sonuç ve beklenen çıktı nedir?
Ingo Karkat

:set ft? indentexpr?Okuyor mu çıktısı nedir filetype=xml indentexpr=XmlIndentGet(v:lnum,1)?
Ingo Karkat

filetype = xml indentexpr = XmlIndentGet (v: lnum, 1). Yup
Haagenti


1
Bu haritaya biraz daha eklemek ve yapmaktan m'ggVG=''hoşlanıyorum, bu basitçe bulunduğunuz satırı kaydeder ve dosyayı yeniden yerleştirdikten sonra ona geri döner.
Hovis Biddle

Yanıtlar:


196

Berei'nin cevabını beğendim. Ancak, vimrcdosyanızı değiştirmek zorunda kalmadığınız için aşağıdakilerin biraz daha esnek olduğunu düşünüyorum . Ayrıca, XML dosyasının belirli bölümlerini biçimlendirmek daha kolaydır (çok yaptığım bir şey).

İlk olarak, biçimlendirmek istediğiniz XML'yi vurgulayın.

Ardından, normal modda yazın ! xmllint --format -

En alttaki komut satırınız şöyle görünecek:

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

Ardından enter tuşuna basın.

Teknik Açıklama

Seçilen metin xmllintkomuta gönderilir , ardından gönderilir --formatve sonuçları xmllintvim'de seçtiğiniz metnin üzerine yerleştirilir. -Bu durumda, vim gönderdiği seçilen metin, - komutun sonunda standart giriş alınması içindir xmllint.


6
Bu elbette yalnızca xmllint harici aracınız yüklüyse ve yolunuza eklenmişse çalışır.
Polymorphix

67
komutu basitleştirmek için, :%!xmllint --format -, %bu xml dosyasının tümünün içeriğini ifade eder.
hakunami

1
Neden herkes bir xmllint aracının olmasını bekliyor? Ubuntu 15.04'te yok ve apt-get de bulamıyor.
erikbwork

8
@ erikb85 Kullanım apt-cache searchdeğil apt-get, paketler ve paket içerikleri ararken. libxml2-utilseksik aracı içerir.
ParanoiaPuppy

@hakunami keşke bu süreci basitleştirmek için size 1000 kez
olumlu oy verebilseydim

69

xmlDosyalarınızı girintilemek için harici bir program kullanın . Bu durumda seçtiğim xmllintiçin komutu şu equalprgseçeneğe ayarlayın:

:set equalprg=xmllint\ --format\ -

Şimdi çalıştırabilirsiniz

gg=G

izin xmllintsizin biçimlendirmek xmldosyaları.

Her kullandığınızda onu elde etmek için , autocommandayarlamak için bir kullanın.

autocommand aşağıdaki yorumdan

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

Bunun neden yeni başlayanlar için işe yaradığından emin değilim ama bunu çözeceğim;) Teşekkürler şimdi çalışıyor;)
Haagenti

8
Xml dosyalarını düzenlerken etkinleştirmek için .vimrc dosyanızda aşağıdakileri kullanabilirsiniz - au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null. Kaynak - ku1ik.com/2011/09/08/…
studgeek

1
Teşekkür ederim! Büyük XML dosyaları ve vim ile çok hüsrana uğramış, Sublime'da çok hızlı bir şekilde geri dönüyorlar (5000-10000 satır ve base64 verileri), ancak Vim'de birkaç dakika geri dönüyorlar. Bu çözüm, büyük XML dosyalarındaki sorunu çözer. Yine Vim ile mutluyum.
Sonique

libxml2-utils
ubuntu'daysanız,

33

Herhangi bir üçüncü taraf aracı gerektirmeyen sevdiğim basit bir çözüm, her açılış etiketinin '<...>' önüne bir yeni satır eklemektir. Daha sonra standart vim otomatik girintisini kullanabilirsiniz. Kısacası:

  1. %s/</\r</g
  2. gg=G otomatik girinti yapmak

Büyük bir xml dosyasıyla denedim ve işlenmesi çok uzun sürüyor.
Luc M

Teşekkür ederim. Bu yeterince kolaydır ve işi harici araçlara ihtiyaç duymadan yapar.
hava saldırısı

6
%s/></>\r</gHer metin öğesinin aynı satırda kalmasını tercih ederim .
Nicola Musatti

2
@NicolaMusatti Veya etiketler arasında bazen boşluklar varsa,%s/> *</>\r</g
Arthur Tacca

12

Kısa cevap: matchit.vim'i açın . Varsayılan olarak etkinleştiren vim-sensiblepackadd matchit ürününüze ekleme yapabilir .vimrcveya kullanabilirsiniz .

Uzun cevap: Vim'de XML'i otomatik olarak girintilemek için Vim wiki'de tartışılan xmllint yaklaşımı dahil olmak üzere birçok strateji denedim . Sorun xmllint(ve bu şekilde diğer dış CLI araçlarıyla aynı yaklaşım xmlformatve tidyde) hepsi boş yeni satır dışarı sıkma ısrar olmasıdır. Tek istediğiniz boş satırları, yorumları ve / veya diğer kasıtlı biçimlendirmeleri kaldırmadan XML'inizi girintilemekse, o zaman xmllinten iyi seçenek bu değildir.

Matchit.vim betiği etkin olduğu sürece, Vim'in eşittir (=) komutunun zaten XML'i desteklediği ortaya çıktı . Bunu etkinleştirmenin süper kolay bir yolu, tpope'un vim- duyarlılığını benimsemektir . Bir diğeri de packadd matchitsizin .vimrc. Daha sonra, XML biçimlendirmesi kutudan çıkar çıkmaz "çalışır".


1
Daha kesin olmak gerekirse, matchit.vimgerçek çözüm gibi görünüyor . vimrcBu satırı ekleyerek kendi sayfanızda etkinleştirebilirsiniz :packadd matchit
Christian Rondeau

1
Teşekkürler Christian; Matchit.vim'in sorunu çözen şey olduğunu açıklığa kavuşturmak için yanıtı güncelledim.
ctrueden

Olumlu oy verildi çünkü bu benim için en iyisi oldu. Çok basit ve (en azından benim için) işi yapar Ancak, ben kısa cevaba Christian'ın öneri (packadd matchit) ekleyerek öneririm
işareti

1
@tohuwawohu Komutu kullanın =. Dosyanın en üstündeyseniz yazabilirsiniz =G. Alternatif olarak, ile dosyanın en üstüne gidebilir, ile 1Ggörsel çizgi seçme moduna girebilir V, ardından Gher şeyi seçerek dosyanın altına gitmek için yazabilirsiniz . Ve sonra =tüm dosyanın girintisini artırmak için tuşuna basın . Benzer şekilde, bir dosyanın yalnızca bir bölümünü girintilemek istiyorsanız, yalnızca o bölümü seçin ve düğmesine basın =.
ctrueden

1
@tohuwawohu "Satır sonu olmadan" dediğini fark ettim. =Komut zaten mevcut değilse (veya kaldırmak) satır başı eklemek olmaz. Yalnızca baştaki girintiyi etkiler. Bu nedenle matchit.vim, hepsi tek bir satıra sıkıştırılmış güzel yazdırılan XML için bir çözüm değildir. Bunun için kullanın xmllintveya benzeri.
ctrueden

11

~ / .Vimrc doğru bir şekilde kurulduktan sonra bunu başarmak kolaydır.

Aşağıdaki seçenekleri ~ / .vimrc içinde ayarlayın:

filetype indent on
set smartindent

Bu, imleci dosyanın en üstüne taşımanıza ve sonuna kadar girintilemenizi sağlar: gg = G

İstediğiniz metni görsel modda seçebilir ve girintilemek için = tuşuna basabilirsiniz.


2
Sanırım onun .vimrcyerine olacak .bashrc.
Birei

1
Hata. Kesinlikle. Bunu düzelttim. Teşekkür ederim.
jarederaj

Bu, her etiket bir satırda olduğunda işe yarar. XML'de boşluklar veya son satırlar yoksa, bu hiçbir şey yapmaz.
José Ramón

İşaretleme geçerli olduğu sürece benim için her zaman işe yaradı.
jarederaj

İşaretlemeniz farklı satırlarda değilse (tutarlı bir şekilde?), Bunu şu şekilde hafifçe değiştirebilirsiniz:% s / </ \ r </ g ve sonra:% s / \ n \ n / \ r /
jarederaj

4

VIM'de, aşağıdaki komutu kullanarak (sabit sekmeleri kullanarak) tüm dosyayı otomatik olarak girintiliyorum:

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

^IEğer aracılığıyla üretmek tek bir karakter olduğu: CTRL+ v, CTRL+i


1

Ben de aynı sorunu yaşadım. Hattın olduğu ortaya çıktı

set viewdir=~\.vim\views\

bende .vimrcsoruna neden oldu. Sadece sahip olmadığından emin ol.


1

Jesse Hogan'ın cevabı güzel, ama daha basit cevabı tercih ederim:

Siz vim'deyken ve XML dosyanız açıkken, normal modda şunu yazın:

:%!xmllint --format %

ardından Enter tuşuna basın. XML dosyanızın tamamı biçimlendirilecektir.

daha önce xmllint yüklemiş olmanız gerektiğini unutmayın .


0

kullandığı bu biri için coc.nvimeklenti, yükleyin coc-xmltarafından :CocInstall coc-xml daha sonra yapılandırma dosyasında biçim anahtarını haritalama,: nmap <silent> fm <Plug>(coc-format). Artık sadece xml dosyasını değil, diğer dosyaları da çok kolay bir şekilde biçimlendirebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.