XML-файл відступу


101

Я навчаюсь Віму, але я думав, що це завдання просте, але я не можу змусити його працювати. У мене є браузер SO, але рішення для мене не працюють.

Я намагаюся правильно відступити файл (xml). Я використовую команду:

gg=G 

або ggVG = (зробив це сам, мабуть, робить щось інше;))

Мій .vimrc:

syntax on 
filetype plugin indent on 
set nu 

Який вихідний результат, очікуваний результат?
— Інго Каркат

Який вихід " :set ft? indentexpr?Читання" filetype=xml indentexpr=XmlIndentGet(v:lnum,1)?!
— Інго Каркат

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


1
Мені подобається трохи додати до цієї карти і зробити її m'ggVG='', що просто зберігає лінію, на якій ви знаходитесь, і повертається до неї після повторного нагадування про файл.
— Hovis Biddle

Відповіді:


193

Мені подобається відповідь Берея. Однак, я думаю, що наступне трохи гнучкіше, оскільки вам не потрібно змінювати vimrcфайл. Плюс простіше відформатувати виділені частини XML-файлу (у мене трапляється багато чого).

Спочатку виділіть XML, який потрібно відформатувати.

Потім в звичайному режимі наберіть ! xmllint --format -

Ваш командний рядок внизу виглядатиме так:

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

Потім натисніть Enter.

Технічне пояснення

Вибраний текст надсилається xmllintкоманді, потім --format'ed, а результати xmllintрозміщуються над обраним вами текстом in vim. В -кінці команди призначений для отримання стандартного вводу, який у цьому випадку є обраним текстом, на який надсилає vim xmllint.


6
Це, звичайно, працює лише у тому випадку, якщо у вас встановлений зовнішній інструмент xmllint та доданий до вашого шляху.
— Поліморфікс

66
спростити команди :%!xmllint --format -, %означає весь обсяг цього XML - файл.
— хакунамі

1
Чому всі очікують, що існує інструмент xmllint? В Ubuntu 15.04 його немає і apt-get також не може знайти його.
— erikbwork

8
@ erikb85 Використовуйте apt-cache search, ні apt-get, під час пошуку пакетів та вмісту пакету. libxml2-utilsмістить відсутній інструмент.
— ParanoiaPuppy

@hakunami Я хотів би, щоб я міг вас запросити 1000 разів для спрощення цього процесу
— 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-10000 рядків та base64 даних), але у Vim вони нагадують кілька хвилин. Це рішення вирішує проблему з великими файлами XML. Знову я задоволений Вімом.
— Sonique

якщо ви перебуваєте на ubuntu, вам потрібно буде встановити libxml2-utilsпакунок, щоб отримати xmllint
— hoffmanc

33

Просте рішення, яке мені подобається, яке не вимагає жодного стороннього інструменту, - це вставити нову рядок перед кожним тегом "<...>". Потім ви можете використовувати стандартне автоматичне відступ vim. Коротко:

  1. %s/</\r</g
  2. gg=G для автоматичного відступу

Я спробував це з великим XML-файлом, і обробляти його потрібно дуже довго.
— Люк М

Дякую. Це досить просто і виконує цю роботу, не вимагаючи зовнішніх інструментів.
— авіаудар

6
Я вважаю за краще %s/></>\r</g, щоб кожен елемент тексту залишався в одному рядку.
— Нікола Мусатті

2
@NicolaMusatti Або якщо між тегами іноді є пробіли,%s/> *</>\r</g
— Артур Такка

11

Це легко досягти, коли ~ / .vimrc налаштовано належним чином.

Встановіть такі параметри в ~ / .vimrc:

filetype indent on
set smartindent

Це дозволяє перемістити курсор у верхню частину файлу і відступити до кінця: gg = G

Ви також можете обрати потрібний текст у візуальному режимі та натиснути = відступити його.


2
Я припускаю, що це буде .vimrcзамість .bashrc.
— Бірей

1
Уопс. Саме так. Виправлено це. Дякую.
— jarederaj

Це буде працювати, коли кожен тег знаходиться в рядку. Якщо у XML немає пробілів та кінцевих рядків, це взагалі нічого не зробить.
— Хосе Рамон

Це завжди працювало для мене, поки розмітка дійсна.
— jarederaj

Якщо ваша розмітка відсутня (постійно?) На різних лініях, ви можете необачно змінити це за допомогою:% s / </ \ r </ g, а потім:% s / \ n \ n / \ r /
— jarederaj

11

Коротка відповідь: Увімкніть matchit.vim . Ви можете додати packadd matchitдо свого .vimrcабо використовувати vim-sensible , що дозволяє за замовчуванням.

Довга відповідь: я випробував багато стратегій автоматичного відступу XML у Vim, включаючи підхід xmllint, обговорюваний на Вікі-Vim . Проблема з xmllint(і той же підхід , з допомогою інших інструментів зовнішньої консолі , такі як xmlformatі tidy, теж), що всі вони наполягають на видавлюючи порожні символи нового рядка. Якщо все, що вам потрібно, це відступити XML, не видаляючи порожні рядки, коментарі та / або інше навмисне форматування, тоді xmllintце не найкращий вибір.

Виявляється, команда Vim equals (=) вже підтримує XML, доки ввімкнено скрипт matchit.vim . Один із найпростіших способів увімкнути це - прийняття вин -чутливого tpope . Інше - додати packadd matchitдо свого .vimrc. Тоді форматування XML буде "просто працювати" поза коробкою.


1
Якщо бути точнішим, схоже, matchit.vimце власне рішення. Ви можете ввімкнути це у своєму vimrc, додавши цей рядок:packadd matchit
— Крістіан Рондо

1
Дякую Крістіану; Я оновив відповідь, щоб уточнити, що matchit.vim - це те, що вирішує проблему.
— ctrueden

Оновлено, бо це найкраще працювало для мене. Однак я б запропонував додати пропозицію Крістіана (packadd matchit) до короткої відповіді, оскільки це дуже просто і виконує роботу (принаймні для мене)
— відмітьте

@mark Я оновив відповідь, щоб включити пропозицію Крістіана.
— ctrueden

4

У VIM я автоматично відрізаю весь файл (використовуючи жорсткі вкладки), використовуючи таку команду:

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

Це ^Iєдиний символ, який ви генеруєте за допомогою: CTRL+ v, CTRL+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-файл, але й інший файл

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.