Может ли emacs повторно ввести большой кусок HTML для меня?

При редактировании HTML в emacs существует ли способ автоматически красиво отформатировать blob разметки, изменив что-то вроде этого:

  <table>
  <tr>
<td>blah</td></tr></table>

... в это:

<table>
 <tr>
  <td>
   blah
  </td>
 </tr>
</table>

Ответ 1

По умолчанию, когда вы посещаете файл .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

Все, что сказано, вам, вероятно, придется использовать что-то вроде Tidy, чтобы переформатировать ваш пример 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, который будет делать ваши таблицы.

Ответ 2

Вы можете сделать sgml-pretty-print, а затем indent-for-tab в том же регионе/буфере, если вы находитесь в html-режиме или в nxml-режиме.

sgml-pretty-print добавляет новые строки в нужные места, а indent-for-tab добавляет хороший отступ. Вместе они ведут к правильно отформатированному html/xml.

Ответ 3

http://www.delorie.com/gnu/docs/emacs/emacs_277.html

После выбора региона, который вы хотите исправить. (Чтобы выбрать весь буфер, используйте C-x h)

С-М-д

Повторите все строки внутри одной скобки (indent-sexp).

С-М -\

Повторите все строки в области (область отступа).

Ответ 4

Я написал функцию самостоятельно, чтобы сделать это для 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))))

Ответ 5

Вы можете выполнить замену regexp

 M-x replace-regexp

 \(</[^>]+>\)

 \1C-q-j

Отступы весь буфер

 C-x h
 M-x indent-region

Ответ 6

Tidy может делать то, что вы хотите, но только для всего буфера (и результат XHTML)

M-x tidy-buffer

Ответ 7

Вы можете передать область в xmllint (если она есть), используя:

M-|
Shell command on region: xmllint --format -

Результат будет в новом буфере.

Я делаю это с XML, и он работает, хотя я считаю, что xmllint нуждается в некоторых других параметрах для работы с HTML или другим не совершенным XML. nxml-mode сообщит вам, есть ли у вас хорошо сформированный документ.

Ответ 8

Этот вопрос довольно старый, но я не был доволен различными ответами. Простой способ перетаскивания HTML файла, учитывая, что вы используете относительно новую версию emacs (я запускаю 24.4.1):

  • открыть файл в emacs
  • отметьте весь файл C-x h (обратите внимание: если вы хотите видеть, что помечено, добавьте (setq transient-mark-mode t) в ваш .emacs файл).
  • выполнить M-x indent-region

Что приятно в этом методе, так это то, что он не требует никаких плагинов (предложение Conway), он не требует замены regexp (предложение nevcx) и не требует переключения режимов (предложение jfm3). Предложение Джей находится в правильном направлении - в общем случае выполнение C-M-q будет отступ в соответствии с правилами режима - например, C-M-q работает, по моему опыту, в js-mode и в нескольких других режимах. Но ни html-mode, ни nxml-mode, похоже, не реализуют C-M-q.

Ответ 9

В emacs 25, который я сейчас создаю из исходного кода, если вы находитесь в режиме HTML, используйте  Ctrl - x
h

чтобы выбрать все, а затем нажмите Tab.

Ответ 10

Самый простой способ сделать это - через командную строку.

  • Убедитесь, что у вас установлена ​​аккуратная
  • type 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 в командной строке.