





http://www.delorie.com/gnu/docs/emacs/emacs_277.html
После выбора региона, который нужно исправить. (Чтобы выбрать весь буфер, используйте C-x h)
C-M-q
Reindent all the lines within one parenthetical grouping(indent-sexp).
C-M-\
Reindent all lines in the region (indent-region).
У меня это не работает - в приведенном выше примере C-M-q ничего не делает, а C-M- \ дает совершенно неправильный отступ.
Также у меня не работает в режиме nxml. index-sexp и indent-region сделают отступ для кода, в котором уже есть разрывы строк, в этом примере некоторые из них отсутствуют.
C-X h <ESC> x область отступа
Аккуратный может делать то, что вы хотите, но кажется, только для всего буфера (и результат - XHTML)
M-x tidy-buffer
По умолчанию, когда вы посещаете файл .html в Emacs (22 или 23), он помещает вас в html-mode. Вероятно, это не то, что вам нужно. Вы, вероятно, захотите nxml-mode, что очень наворочено. nxml-mode, похоже, поставляется только с Emacs 23, хотя вы можете загрузить его для более ранних версий emacs из веб-сайт nXML. Также существует пакет Debian и Ubuntu под названием nxml-mode. Вы можете ввести nxml-mode с помощью:
M-x nxml-mode
Вы можете просмотреть документацию по режиму nxml с помощью:
C-h i g (nxml-mode) RET
При этом вам, вероятно, придется использовать что-то вроде Аккуратный, чтобы переформатировать ваш пример xhtml. nxml-mode доставит вас от
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml">
<head></head>
<body>
<table>
<tr>
<td>blah</td></tr></table>
</body>
к
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml">
<head></head>
<body>
<table>
<tr>
<td>blah</td></tr></table>
</body>
</html>
но я не вижу более общего средства для переноса строк в определенные теги xml, как вы хотите. Обратите внимание, что C-j вставит новую строку с правильным отступом, так что вы можете сделать быстрый макрос или взломать defun, который будет обрабатывать ваши таблицы.
После того, как я вхожу в nxml-режим, я использую C-x h для выбора всей области, затем M-x «indent-region». Вы получите HTML с правильным отступом. Спасибо nxml-mode!
nxml-mode не имеет правильного отступа для фрагментов html, вероятно, потому, что у них нет doctype. html-режим работает нормально, когда вы получаете разрывы строк, как предлагает @nevcx ниже
Вы можете заменить регулярное выражение
M-x replace-regexp
\(</[^>]+>\)
C-q-j
Сделайте отступ для всего буфера
C-x h
M-x indent-region
Вы можете выполнить sgml-pretty-print, а затем indent-for-tab в том же регионе / буфере, если вы находитесь в режиме html или nxml.
sgml-pretty-print добавляет новые строки в нужные места, а indent-for-tab добавляет приятные отступы. Вместе они приводят к правильно отформатированному html / xml.
Отличный ответ. Просто не забудьте временно переключиться в sgml-режим для запуска sgml-pretty-print. Затем вернитесь в nxml-режим.
sgml-pretty-print работал у меня из HTML wode без переключения режимов, спасибо!
Единственный ответ, который действительно работает. Я имею в виду даже недействительный XML (т.е. только часть HTML-файла).
Я сам написал функцию для этого для xml, которая хорошо работает в nxml-режиме. должен хорошо работать и для html:
(defun jta-reformat-xml ()
"Reformats xml to make it readable (respects current selection)."
(interactive)
(save-excursion
(let ((beg (point-min))
(end (point-max)))
(if (and mark-active transient-mark-mode)
(progn
(setq beg (min (point) (mark)))
(setq end (max (point) (mark))))
(widen))
(setq end (copy-marker end t))
(goto-char beg)
(while (re-search-forward ">\s-*<" end t)
(replace-match ">\n<" t t))
(goto-char beg)
(indent-region beg end nil))))
Спасибо. Я хотел этого годами!
На самом деле это самое простое и лучшее решение. Я буду часто этим пользоваться! Спасибо!!!
работает для меня. тоже кажется наименее сложным решением. очень много
Вы можете передать регион в xmllint (если он у вас есть), используя:
M-|
Shell command on region: xmllint --format -
Результат окажется в новом буфере.
Я делаю это с помощью XML, и это работает, хотя я считаю, что xmllint нужны некоторые другие параметры для работы с HTML или другим неидеальным XML. nxml-mode сообщит вам, правильно ли у вас сформирован документ.
А с аргументом префикса shell-command-on-region заменяет исходную область выводом команды оболочки. то есть: C-u M-|
Спасибо, phils, я знал, что эта функция есть, но не мог вспомнить, как ее вызвать!
Самый простой способ сделать это - через командную строку.
tidy -i -m <<file_name>>Обратите внимание, что опция -m заменяет только что приведенный в порядок файл старым. Если вы этого не хотите, вы можете ввести tidy -i -o <<tidied_file_name>> <<untidied_file_name>>
-i предназначен для отступов. В качестве альтернативы вы можете создать файл .tidyrc с такими настройками, как
indent: auto
indent-spaces: 2
wrap: 72
markup: yes
output-xml: no
input-xml: no
show-warnings: yes
numeric-entities: yes
quote-marks: yes
quote-nbsp: yes
quote-ampersand: no
break-before-br: no
uppercase-tags: no
uppercase-attributes: no
Таким образом, все, что вам нужно сделать, это ввести tidy -o <<tidied_file_name>> <<untidied_file_name>>.
Для получения дополнительной информации просто введите man tidy в командной строке.
Афайу, это называется из оболочки. Я думаю, ему нужно решение внутри emacs.
Это довольно старый вопрос, но меня не очень обрадовали различные ответы. Простой способ изменить отступ в HTML-файле, учитывая, что вы используете относительно новую версию emacs (я использую 24.4.1), заключается в следующем:
C-x h (примечание: если вы хотите увидеть, что помечается, добавьте (setq transient-mark-mode t) в свой файл .emacs)M-x indent-regionЧто хорошо в этом методе, так это то, что он не требует никаких плагинов (предложение Конвея), он не требует замены регулярного выражения (предложение nevcx) и не требует переключения режимов (предложение jfm3). Предложение Джея в правильном направлении - в общем, выполнение C-M-q приведет к отступу в соответствии с правилами режима - например, C-M-q, по моему опыту, работает в js-mode и в нескольких других режимах. Но ни html-mode, ни nxml-mode, похоже, не реализуют C-M-q.
Отличный ответ. Две строчки. Все дела проделаны на отлично!
Последующий вопрос, ваше решение не будет отступать от javascript в html. У вас есть какое-нибудь простое и быстрое решение для этого? Спасибо.
Это работает, если разрывы строк уже находятся в нужных местах. sgml-pretty-print помогает в этом (но, на мой взгляд, все еще не лучший выбор).
В emacs 25, который я сейчас создаю из исходного кода, при условии, что вы находитесь в режиме HTML, используйте
Ctrl-x
h
чтобы выбрать все, а затем нажмите Tab.
Это намного проще в новых версиях emacs. Это ситуация с прокруткой вниз.