Может ли emacs сделать для меня большой отступ HTML? - PullRequest
65 голосов
/ 26 сентября 2008

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

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

... в это:

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

Ответы [ 10 ]

93 голосов
/ 06 июня 2011

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

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

28 голосов
/ 28 сентября 2008

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

13 голосов
/ 26 сентября 2008

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

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

C-М-д

Перепишите все строки в пределах одной группы в скобках (indent-sexp).

C-M - \

Перепишите все строки в регионе (indent-region).

10 голосов
/ 06 июня 2011

Я сам написал функцию для этого для 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))))
8 голосов
/ 10 ноября 2010

Вы можете сделать регулярное выражение замены

 M-x replace-regexp

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

 \1C-q-j

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

 C-x h
 M-x indent-region
7 голосов
/ 28 ноября 2014

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

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

6 голосов
/ 26 сентября 2008

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

M-x tidy-buffer
4 голосов
/ 12 сентября 2016

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

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

4 голосов
/ 15 сентября 2011

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

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

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

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

0 голосов
/ 13 июня 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...