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.