Может в Emacs повторно отступ большой кусок HTML-кода для меня?
при редактировании HTML в emacs, есть ли способ автоматически довольно форматировать blob разметки, изменяя что-то вроде этого:
<table>
<tr>
<td>blah</td></tr></table>
...в это:
<table>
<tr>
<td>
blah
</td>
</tr>
</table>
10 ответов:
по умолчанию, когда вы заходите на
.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что будете делать таблицы.
можно сделать
sgml-pretty-printа тоindent-for-tabв том же регионе/буфере, если вы находитесь в html-режиме или nxml-режиме.
sgml-pretty-printдобавляет новые строки в нужных местах иindent-for-tabдобавляет хороший отступ. Вместе они приводят к правильному форматированию html / xml.
http://www.delorie.com/gnu/docs/emacs/emacs_277.html
после выбора региона, который вы хотите исправить. (Для выбора всего буфера используйте C-x h)
C-M-q
Переиндентировать все строки в пределах одной скобочной группировки (отступ-sexp).
C-M -\
Переиндентировать все линии в регионе (отступ-регион).
Я сам написал функцию, чтобы сделать это для 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))))
вы можете сделать заменить регулярное выражение
M-x replace-regexp \(</[^>]+>\) C-q-jотступ всего буфера
C-x h M-x indent-region
порядок может делать то, что вы хотите, но только для всего буфера кажется (и результат XHTML)
M-x tidy-buffer
этот вопрос довольно старый, но я не был очень доволен различными ответами. Простой способ повторного отступа HTML-файла, учитывая, что вы используете относительно новую версию emacs (я запускаю 24.4.1), заключается в следующем:
- откройте файл в emacs
- отметьте весь файл с
C-x h(Примечание: Если вы хотите увидеть, что помечается, добавьте(setq transient-mark-mode t)на.emacsfile)- выполнить
M-x indent-regionчто приятно об этом методе заключается в том, что он не требует никаких плагинов (предложение Конвея), он не требует замены regexp (предложение nevcx), а также не требует переключения режимов (предложение jfm3). Предложение Джея находится в правильном направлении-в общем, выполнение
C-M-qбудет отступ в соответствии с правилами режима - например,C-M-qработает, по моему опыту, вjs-modeи в некоторых других режимах. Но ниhtml-mode, ниnxml-modeне похоже, чтобы реализоватьC-M-q.
вы можете передать область в xmllint (если она у вас есть) с помощью:
M-| Shell command on region: xmllint --format -результат будет в конечном итоге в новый буфер.
Я делаю это с XML, и это работает, хотя я считаю, что xmllint нужны некоторые другие параметры для работы с HTML или другими неидеальными XML. nxml-режим покажет вам, если у вас есть хорошо сформированный документ.
в emacs 25, который я в настоящее время строю из исходного кода, предполагая, что вы находитесь в режиме HTML, используйте
Ctrl - x
hвыбрать все, а затем нажмите клавишу Tab.
самый простой способ сделать это через командную строку.
- убедитесь, что вы аккуратно установили
- тип
tidy -i -m <<file_name>>отметим, что
-mопция заменяет новый очищенный файл на старый. Если вы не хотите этого, вы можете ввестиtidy -i -o <<tidied_file_name>> <<untidied_file_name>>The
-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в командной строке.