Як виправити відступ файлу HTML у VI?


130

Як виправити відступ його величезних HTML-файлів, який був зіпсований?

Я спробував звичайну "gg=Gкоманду , яку я використовую для виправлення відступів кодових файлів. Однак, схоже, це не працює правильно у файлах HTML. Він просто видалив усе форматування.

Я також спробував налаштувати :filetype = xml, щоб побачити, чи допоможе це обдумати його, думаючи, що це XML-файл, але він все ще не зробив цього.

Відповіді:


91

З filetype indent onмоїми .vimrc, Vim відступає HTML-файли досить добре.

Простий приклад з shiftwidth2:

<html>
  <body>
    <p>
    text
    </p>
  </body>
</html>

15
Скопіюйте вставте HTML цієї сторінки питань у файл html. Відкрийте за допомогою VIM, введіть "set smartindent", потім "gg = G", і це не виправить відступ файлу.
mmcdole

15
Це працює для мене. set ft = html <cr> set si <cr> gg = G <cr>. Форматує цю сторінку досить добре.
Дон Реба

5
+1 перевірив, що "ввімкнення / вимкнення відступу файлетипу" вмикає або вимикає магію.
Вім Коен

4
Так, після встановлення розумного відступу файли = html та ідентифікатор файлів на ньому працювали для мене.
mmcdole

22
З сайту chovy.com/web-development/fix-indentation-and-tabs-in-vim я встановив, що мені потрібно перезавантажити файл за допомогою: e після відступу файлу.
Марк Стобер

189

Є кілька речей, які всі повинні бути на місці. Просто підсумуйте їх у одному місці:

Встановіть наступний варіант:

:filetype indent on
:set filetype=html           # abbrev -  :set ft=html
:set smartindent             # abbrev -  :set si

Потім або перемістіть курсор у верхню частину файлу та відступіть до кінця: gg =G
Або виберіть потрібний текст для відступу та натисніть, =щоб відступити його.


@tyrel, дякую, але для мене це не працює .. Це вміст файлу: pastebin.com/gagia8W2 . Файл викликається home.html. У мене немає проблем із відступом файлів .php. Ось у вас є мій .vimrc: pastebin.com/FAJ0MCA9
ziiweb

1
Чи є спосіб я встановити це у .vimrc? Я не хочу говорити про це кожного разу, коли я відкриваю HTML-файл, який є його HTML-файлом. Дякую за gg, =, ярлик G. Дійсно зручно.
zakishaheen

1
Зверніть увагу , що в vim 7.4за замовчуванням параметри відступів будуть терпіти невдачу на цьому прикладі, як html, bodyі pне відступлять за замовчуванням. Дивіться цю відповідь .
Cory Klein

2
smartindentне потрібно. Крім того, він налаштований на C і C ++, я вважаю за краще використовувати більш загальне autoindentзамість цього.
Кос

Він чудово працює з vim7.4. @tylerl чи є спосіб зробити цю конфігурацію постійною для html-файлів у 7.4?
xaph

62

Основна проблема використання інтелектуального відступу полягає в тому, що якщо XML (або HTML) сидить на одному рядку, оскільки він може закінчитися поверненням із запиту на згортання, то gg=Gне вийде цього. Натомість я щойно пережив хороший відступ, використовуючи охайний прямий виклик з VI:

:!tidy -mi -xml -wrap 0 %

Це, в основному, говорить VI зателефонувати, щоб очистити XML-файл, не обертаючи рядки, щоб вони прилаштовувались до ширини 68 символів за замовчуванням. Я обробив великий 29МБ XML-файл, і це зайняло 5 або 6 секунд. Я думаю, що для файлу HTML командою має бути:

:!tidy -mi -html -wrap 0 %

Як згадується в коментарях, tidyце основний інструмент, який ви можете знайти у багатьох базових системах Linux / MacOS. Ось сторінка проекту на випадок, якщо ви хочете, щоб у вас був, але не слід: HTML Tidy .


1
Я не вірю, що html потрібен, оскільки він за замовчуванням html
lsiebert

4
Домовився з вами @Isieber. Однак, мабуть, це полегшує розуміння логіки, а деякі люди навіть можуть вважати їх доброю практикою.
oscaroscar

2
FYI, охайні задухи, якщо HTML включає SVG (наприклад, діаграми тощо).
Алекс Квінн

1
Так, якщо код HTML знаходиться в одному рядку, команда vim indent не працюватиме!
wisbucky

Що в словнику охайне, окрім слова? Це не повна відповідь без посилання на проект.
Бруно Броноський

49

Як пояснюється tylerl вище, встановіть наступне:

:filetype indent on
:set filetype=html
:set smartindent

Тим НЕ менше, зверніть увагу , що в Vim 7.4 HTML - теги html, head, body, і деякі інші НЕ відступу за замовчуванням. Це має сенс, оскільки майже весь вміст у файлі HTML підпадає під ці теги. Якщо ви дійсно хочете, ви можете отримати ці теги з відступом так:

:let g:html_indent_inctags = "html,body,head,tbody" 

Додаткову інформацію див. У розділі " Відступ HTML не працює у складеному Vim 7.4, будь-які ідеї? " Та " альтернативний скрипт відступу html ".


це переможець у моїй книзі! Використання Vim 7.4 в Windows, і це працює фантастично! : D
Майкл J

12

Це моє рішення, яке чудово працює для відкриття "потворного" HTML-коду на чітко розташованому:

vim fileIn.html -c "set sw=2 | %s/>/>\r/ | execute 'normal gg=G' | set nohlsearch | g/^\\s*\$/d"
  • swКоманда , тому що моє по замовчуванням 4, яка є занадто високим для HTML.
  • Наступна частина додає новий рядок (Вім думає, що це повернення каретки, зітхання) після кожного елемента ( >).
  • Потім повторно відріжте весь файл за допомогою =.
  • Потім неясне світло >(оскільки я маю set hlsearchв своєму vimrc).
  • Потім видаліть усі порожні / пробіли, що містять пробіли (див. " Вимкнути порожні рядки ", щоб отримати додаткові відомості, також це подвійний шлях, оскільки він знаходиться в оболонці).

Ви навіть можете додати | wq! fileOut.htmlйого до кінця, якщо ви взагалі не хочете вводити Vim, а просто очистити файл.


Охайне рішення! Я змінив його на :%s/>\s*/>\r/g(додав gглобальну заміну та \s*викреслив пробіли). Я також додав, :%s/</\r</gщоб додати новий рядок перед відкритою дужкою. Інакше теги на зразок <td>foo</td>будуть розділені як <td>і foo</td>.
wisbucky

Справедливо кажучи, у мене за замовчуванням увімкнена глобальна заміна, тому це не в моєму рішенні.
adam_0

7

Я використовую цей сценарій: https://github.com/maksimr/vim-jsbeautify

У вищенаведеному посиланні ви маєте всю інформацію:

  1. Встановити
  2. Налаштування (копія з першого прикладу)
  3. Біжи :call HtmlBeautify()

Робота красиво!


3
ха-ха, чому б ви хотіли використовувати node + js для очищення html у vim, який мав цю здатність вбудований довше, ніж вузол навіть існує ...
кидається в очі

4

Ви спробували використати скрипт відступу HTML на сайті Vim?


+1, я цього не бачив. Було б добре, якби мені не потрібно було запускати сценарій, але, схоже, це може бути єдиний спосіб.
mmcdole

Цей сценарій тепер застарілий, і новіша версія поставляється з vim (наприклад /usr/share/vim/vim74/indent/html.vim). "2014 липня 2014: Vim 7.4.356 або пізнішої версії включає нащадка цього сценарію (офіційний сценарій тепер підтримується Бремом і включає масові зміни)"
wisbucky

4

Ось вагоме рішення, яке отримує відступ, а також весь симпатичний друк HTML, про який не обов’язково хочете піклуватися під час редагування.

Спочатку скачайте Tidy . Переконайтеся, що ви додали двійковий файл у свій шлях, щоб ви могли зателефонувати йому з будь-якого місця.

Далі створіть файл конфігурації, що описує ваш улюблений аромат HTML. Документація не дуже підходить для Tidy, але ось огляд та список усіх варіантів . Ось мій конфігураційний файл:

bare: yes
break-before-br: no
clean: yes
drop-proprietary-attributes: yes
fix-uri: yes
indent-spaces: 4
indent: yes
logical-emphasis: yes
markup: yes
output-xhtml: yes
quiet: yes
quote-marks: yes
replace-color: yes
tab-size: 4
uppercase-tags: no
vertical-space: yes
word-2000: yes
wrap: 0

Збережіть це як tidyrc_html.txtу своїй ftpluginпапці (під vimfiles).

Ще один файл: додати (або створити) наступний рядок html.vim, також у ftplugin:

map <leader>tidy :%! tidy -config ~/vimfiles/ftplugin/tidyrc_html.txt <CR>

Для його використання просто відкрийте файл HTML і введіть /tidy. (Це /є <leader>ключовим.)

Ось так! Не швидке рішення, будь-якими способами, але тепер ви трохи краще обладнані для редагування цих величезних, заплутаних HTML-файлів.



0

Я спробував звичайну команду "gg = G", яку я використовую для виправлення відступів файлів коду. Однак, схоже, це не працює правильно у файлах HTML. Він просто видалив усе форматування.

Якщо автоматичний формат / відступ vim gg=Gздається "зламаним" (наприклад, відступ зліва в кожному рядку), швидше за все, плагін відступу не вмикається / завантажується. Це дійсно повинно давати повідомлення про помилку, а не просто робити відступ, але в іншому випадку користувачі просто вважають, що функція автоформатування / відступу є жахливою, але насправді це дуже добре.

Щоб перевірити, чи увімкнено / завантажено плагін відступу, запустіть :scriptnames. Подивіться, чи .../indent/html.vimє в списку. Якщо ні, то це означає, що плагін не завантажений. У цьому випадку додайте цей рядок до ~/.vimrc:

filetype plugin indent on

Тепер, якщо ви відкриєте файл і запустите :scriptnames, ви повинні побачити .../indent/html.vim. Потім запустіть gg=G, який повинен зробити правильний автоформат / відступ зараз. (Хоча це не буде додавати нові рядки, тому якщо весь код HTML знаходиться в одному рядку, він не буде відступним).

Примітка: якщо ви працюєте :filetype plugin indent onв командному рядку vim замість ~/.vimrc, потрібно повторно відкрити файл :e.

Крім того, вам не потрібно турбуватися autoindentі про smartindentналаштування, вони для цього не відповідають.

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