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


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

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

...в это:

<table>
 <tr>
  <td>
   blah
  </td>
 </tr>
</table>
10 62

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) на .emacs file)
  • выполнить 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 в командной строке.