Как убрать отступы HTML-файла в VI?

130

Как мне исправить отступы его огромных html-файлов, которые были испорчены?

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

Я также попытался установить :filetype = xml, чтобы увидеть, поможет ли обман его, думая, что это XML-файл, но он все равно не сделал этого.

mmcdole
источник

Ответы:

91

С filetype indent onвнутри моего .vimrc, Вим отступы HTML файлы довольно красиво.

Простой пример с shiftwidth2:

<html>
  <body>
    <p>
    text
    </p>
  </body>
</html>
moinudin
источник
15
Скопируйте и вставьте HTML-код этой страницы вопросов в HTML-файл. Откройте с помощью VIM, введите «set smartindent», затем «gg = G», и это не исправит отступ файла.
mmcdole
15
Меня устраивает. установить ft = html <cr> установить si <cr> gg = G <cr>. Хорошо форматирует эту страницу.
Дон Реба
5
+1 подтвердил, что "отступ типа файла вкл / выкл" включает или выключает магию.
Вим Коенен
4
Да, после установки интеллектуального отступа, filetype = 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
либо выделите нужный текст для отступа и нажмите, =чтобы сделать отступ.

tylerl
источник
@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) находится в одной строке, так как он может вернуться из запроса curl, тогда gg=Gэто не поможет. Вместо этого я только что испытал хороший отступ с использованием tidy, вызываемого напрямую из VI:

:!tidy -mi -xml -wrap 0 %

По сути, это указывает VI вызвать tidy для очистки XML-файла, не оборачивая строки, чтобы они соответствовали стандартным строкам шириной в 68 символов. Я обработал большой XML-файл размером 29 МБ, и это заняло 5 или 6 секунд. Я предполагаю, что для файла HTML команда должна быть:

:!tidy -mi -html -wrap 0 %

Как упоминалось в комментариях, tidyэто основной инструмент, который вы можете найти во многих базовых системах Linux / MacOS. Вот страница проекта, если вы хотите, чтобы она у вас была, но нет: HTML Tidy .

oscaroscar
источник
1
Я не верю, что html нужен, поскольку по умолчанию используется html
lsiebert
4
Согласен с вами @Isieber. Однако, я думаю, это упрощает понимание логики и может даже считаться хорошей практикой некоторыми людьми.
oscaroscar 06
2
К вашему сведению, аккуратные удушья, если HTML включает SVG (например, диаграммы и т. Д.).
Alex Quinn
1
Да, если html-код находится в одной строке, команда vim indent работать не будет!
wisbucky
Что такое приборка, кроме слова в словаре? Это не полный ответ без ссылки на проект.
Бруно Броноски
49

Как поясняет Тайлерл выше, установите следующее:

: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
Майкл Дж.
12

Это мое решение, которое отлично подходит для открытия «уродливого» HTML с хорошо разнесенными интервалами:

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

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

adam_0
источник
Отличное решение! Я изменил его на :%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()

Прекрасно справляется со своей работой!

SimonW
источник
3
ха-ха, зачем вам использовать node + js для очистки html в vim, в котором эта возможность встроена дольше, чем существует node ... у меня
непостижимо
4

Вы пробовали использовать скрипт отступов HTML на сайте Vim?

JaredPar
источник
+1, я этого не видел. Было бы неплохо, если бы мне не нужно было запускать скрипт, но похоже, что это может быть единственный выход.
mmcdole
Этот скрипт устарел, и более новая версия поставляется с vim (например /usr/share/vim/vim74/indent/html.vim). «4 июля 2014 г .: Vim 7.4.356 или более поздняя версия включает потомок этого скрипта (официальный скрипт теперь поддерживается Брэмом и включает в себя огромные изменения)»
Висбаки
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.

Лемур
источник
2

Вы можете автоматически интегрировать tidy и html-beautify , установив плагин vim-autoformat . После этого вы можете запустить любой установленный форматтер одним нажатием клавиши.

Чил тен Бринке
источник
0

Я попробовал обычную команду «gg = G», которую я использую для исправления отступов файлов кода. Однако, похоже, это не работает с файлами HTML. Он просто удалил все форматирование.

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

Чтобы проверить, включен / загружен плагин indent, запустите :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настройки, они не актуальны для этого.

wisbucky
источник
0

Ни один из ответов у меня не сработал, потому что весь мой HTML был в одной строке.

Обычно вам нужно сначала разорвать каждую строку с помощью следующей команды, которая заменяет ><те же символы, но с разрывом строки посередине.

:%s/></>\r</g

Тогда команда

gg=G

сделает файл отступом.

Томас Г.
источник