Plik XML z wcięciami Vima

101

Uczę się Vima, ale myślałem, że to proste zadanie, ale nie mogę go uruchomić. Mam przeglądarkę SO, ale rozwiązania nie działają dla mnie.

Próbuję poprawnie wciąć plik (xml). Polecenie, którego używam, to:

gg=G 

lub ggVG = (sam sobie to wymyśliłem, prawdopodobnie robi coś innego;))

Mój plik .vimrc to:

syntax on 
filetype plugin indent on 
set nu 
Haagenti
źródło
Jaki jest oryginalny, wynik i oczekiwany wynik?
Ingo Karkat
Jaki jest wynik działania :set ft? indentexpr?Czy to czyta filetype=xml indentexpr=XmlIndentGet(v:lnum,1)?!
Ingo Karkat
filetype = xml indentexpr = XmlIndentGet (v: lnum, 1). Tak
Haagenti
1
Lubię dodać tylko trochę do tej mapy i zrobić to m'ggVG='', co po prostu zapisuje linię, na której się znajdujesz i wraca do niej po ponownym nacięciu pliku.
Hovis Biddle,

Odpowiedzi:

193

Podoba mi się odpowiedź Berei. Jednak myślę, że poniższe elementy są nieco bardziej elastyczne, ponieważ nie musisz zmieniać vimrcpliku. Dodatkowo łatwiej jest sformatować wybrane fragmenty pliku XML (coś, co często robię).

Najpierw zaznacz XML, który chcesz sformatować.

Następnie w trybie normalnym wpisz ! xmllint --format -

Twój wiersz poleceń na dole będzie wyglądał następująco:

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

Następnie naciśnij Enter.

Wyjaśnienie techniczne

Wybrany tekst jest wysyłany do xmllintpolecenia, następnie --format„ed”, a wyniki xmllintsą umieszczane na wybranym tekście w programie vim. Na -końcu polecenia służy do odbioru standardowego wejścia - w tym przypadku jest to zaznaczony tekst, do którego przesyła vim xmllint.

Jesse Hogan
źródło
6
To oczywiście działa tylko wtedy, gdy masz zainstalowane i dodane do ścieżki zewnętrzne narzędzie xmllint.
Polymorphix
66
uproszczenie polecenia :%!xmllint --format -, %oznacza cały zakres tego pliku xml.
hakunami
1
Dlaczego wszyscy oczekują, że istnieje narzędzie xmllint? W Ubuntu 15.04 nie ma, a apt-get również nie może go znaleźć.
erikbwork
8
@ erikb85 Użyj apt-cache search, nie apt-get, podczas wyszukiwania pakietów i zawartości pakietów. libxml2-utilszawiera brakujące narzędzie.
ParanoiaPuppy
@hakunami Chciałbym móc zagłosować 1000 razy za uproszczenie tego procesu
niken
69

Użyj zewnętrznego programu, aby wciąć xmlpliki. W tym przypadku wybrałem xmllint, więc ustaw polecenie na equalprgopcję:

:set equalprg=xmllint\ --format\ -

Teraz możesz wykonać

gg=G

aby umożliwić xmllintformatowanie xmlplików.

Aby uzyskać to za każdym razem, gdy używasz , użyj, autocommandaby go ustawić.

autocommand z komentarza poniżej

au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null
Birei
źródło
Nie jestem pewien, dlaczego to działa, więc początkujący, ale to
rozgryzę
8
Możesz użyć następującego pliku w swoim .vimrc, aby włączyć go podczas edycji plików xml - au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null. Źródło - ku1ik.com/2011/09/08/…
studgeek
1
Dziękuję Ci! Bardzo sfrustrowani dużymi plikami XML i vimem, w Sublime bardzo szybko reindentują (5000-10000 linii i dane base64), ale w Vimie reindują kilka minut. To rozwiązanie rozwiązuje problem z dużymi plikami XML. Znowu jestem zadowolony z Vima.
Sonique
jeśli jesteś na ubuntu, musisz zainstalować libxml2-utilspakiet aby dostać xmllint
hoffmanc
33

Prostym rozwiązaniem, które mi się podoba, które nie wymaga żadnego narzędzia innej firmy, jest wstawienie nowej linii przed każdym otwierającym tagiem „<...>”. Następnie możesz użyć standardowego automatycznego wcięcia w Vimie. W skrócie:

  1. %s/</\r</g
  2. gg=G do automatycznego wcięcia
KFL
źródło
Wypróbowałem to z dużym plikiem xml i bardzo długo trwa przetwarzanie.
Luc M
Dziękuję Ci. Jest to dość łatwe i działa bez użycia zewnętrznych narzędzi.
nalot
6
Wolę %s/></>\r</g, aby każdy element tekstowy pozostał w tej samej linii.
Nicola Musatti
2
@NicolaMusatti Lub jeśli między tagami są czasami spacje,%s/> *</>\r</g
Arthur Tacca,
11

Jest to łatwe do osiągnięcia po prawidłowym skonfigurowaniu ~ / .vimrc.

Ustaw następujące opcje w ~ / .vimrc:

filetype indent on
set smartindent

Pozwala to na przeniesienie kursora na górę pliku i wcięcie do końca: gg = G

Możesz także wybrać żądany tekst w trybie wizualnym i nacisnąć =, aby wciąć go.

jarederaj
źródło
2
Przypuszczam, że będzie .vimrczamiast .bashrc.
Birei
1
Ups. Dokładnie. Naprawiono to. Dziękuję Ci.
jarederaj
To zadziała, gdy każdy tag jest w linii. Jeśli XML nie ma spacji ani linii końcowych, nic by to nie dało.
José Ramón
Zawsze działało dla mnie, o ile znaczniki są ważne.
jarederaj
Jeśli twój znacznik nie znajduje się (konsekwentnie?) W odrębnych wierszach, możesz niechlujnie to zmienić za pomocą:% s / </ \ r </ g, a następnie:% s / \ n \ n / \ r /
jarederaj
11

Krótka odpowiedź: włącz matchit.vim . Możesz dodać packadd matchitdo swojego .vimrclub użyć vim-sensible , co domyślnie włącza go.

Długa odpowiedź: próbowałem wielu strategii automatycznego wcięcia XML w Vimie, w tym podejście xmllint omówione na wiki Vima . Problem xmllint(i to samo podejście z innymi zewnętrznymi narzędziami CLI, takimi jak xmlformati tidyteż) polega na tym, że wszystkie one nalegają na wyciskanie pustych nowych linii. Jeśli wszystko, czego chcesz, to wcięcie pliku XML bez usuwania pustych wierszy, komentarzy i / lub innego celowego formatowania, xmllintnie jest to najlepszy wybór.

Okazuje się, że polecenie equals (=) Vima obsługuje już XML, o ile włączony jest skrypt matchit.vim . Jednym z bardzo łatwych sposobów na włączenie tej funkcji jest przyjęcie wrażliwości na vim tpope . Innym jest dodanie packadd matchitdo twojego .vimrc. Wtedy formatowanie XML „po prostu zadziała” po wyjęciu z pudełka.

ctrueden
źródło
1
Mówiąc dokładniej, wygląda na to, że matchit.vimjest to rzeczywiste rozwiązanie. Możesz go włączyć w swoim vimrc, dodając następującą linię:packadd matchit
Christian Rondeau,
1
Dzięki, Christian; Zaktualizowałem odpowiedź, aby wyjaśnić, że matchit.vim rozwiązuje problem.
ctrueden
Głosowano za, ponieważ to działało najlepiej dla mnie. Sugerowałbym jednak dodanie sugestii Christiana (packadd matchit) do krótkiej odpowiedzi, ponieważ jest ona bardzo prosta i spełnia swoje zadanie (przynajmniej dla mnie)
zaznacz
@mark Zaktualizowałem odpowiedź, tak aby zawierała sugestię Christiana.
ctrueden
4

W VIM automatycznie wcinam cały plik (używając twardych zakładek) za pomocą następującego polecenia:

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

To ^Ipojedynczy znak, który generujesz za pomocą: CTRL+ v, CTRL+i

Chmura
źródło
1

Miałem ten sam problem. Okazało się, że linia

set viewdir=~\.vim\views\

w moim .vimrcspowodował problem. Tylko upewnij się, że go nie masz.

Borysa Brodskiego
źródło
1

Odpowiedź Jessego Hogana jest dobra, ale ja wolę prostszą odpowiedź:

Kiedy jesteś w vimie i twój plik XML jest otwarty, w normalnym trybie napisz to:

:%!xmllint --format %

następnie naciśnij Enter. Cały twój plik XML zostanie sformatowany.

pamiętaj, że powinieneś wcześniej zainstalować xmllint .

Cheetah Coder
źródło
0

dla tych, które są jednym z użyciem coc.nvimwtyczki, można zainstalować coc-xmlprzez :CocInstall coc-xml , a następnie mapowanie klucza formatu w pliku konfiguracyjnym: nmap <silent> fm <Plug>(coc-format). Od teraz możesz bardzo łatwo formatować nie tylko plik xml, ale także inne pliki

lehanh
źródło