Может ли emacs изменить отступ для большого кода HTML?

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

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

... в это:

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

Это намного проще в новых версиях emacs. Это ситуация с прокруткой вниз.

Aaron Hall 21.09.2016 20:16
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
70
1
29 946
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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- \ дает совершенно неправильный отступ.

raldi 26.09.2008 05:06

Также у меня не работает в режиме nxml. index-sexp и indent-region сделают отступ для кода, в котором уже есть разрывы строк, в этом примере некоторые из них отсутствуют.

Justin Tanner 26.09.2008 07:30

C-X h <ESC> x область отступа

Richard Gomes 28.07.2016 04:42

Аккуратный может делать то, что вы хотите, но кажется, только для всего буфера (и результат - 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!

zhanxw 23.02.2013 22:00

nxml-mode не имеет правильного отступа для фрагментов html, вероятно, потому, что у них нет doctype. html-режим работает нормально, когда вы получаете разрывы строк, как предлагает @nevcx ниже

boatcoder 14.12.2013 23:43

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

 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-режим.

cayhorstmann 22.01.2012 02:35

sgml-pretty-print работал у меня из HTML wode без переключения режимов, спасибо!

dolzenko 20.12.2013 14:23

Единственный ответ, который действительно работает. Я имею в виду даже недействительный XML (т.е. только часть HTML-файла).

Misha Tavkhelidze 11.11.2015 14:47

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

Спасибо. Я хотел этого годами!

Christian Madsen 30.12.2012 22:54

На самом деле это самое простое и лучшее решение. Я буду часто этим пользоваться! Спасибо!!!

BenjaminBallard 03.09.2015 16:18

работает для меня. тоже кажется наименее сложным решением. очень много

cammil 25.03.2016 12:40

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

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

Результат окажется в новом буфере.

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

А с аргументом префикса shell-command-on-region заменяет исходную область выводом команды оболочки. то есть: C-u M-|

phils 16.09.2011 03:15

Спасибо, phils, я знал, что эта функция есть, но не мог вспомнить, как ее вызвать!

Geoff 20.09.2011 01:06

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

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

Nikana Reklawyks 20.10.2012 04:06

Это довольно старый вопрос, но меня не очень обрадовали различные ответы. Простой способ изменить отступ в 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.

Отличный ответ. Две строчки. Все дела проделаны на отлично!

Tony 06.01.2015 19:26

Последующий вопрос, ваше решение не будет отступать от javascript в html. У вас есть какое-нибудь простое и быстрое решение для этого? Спасибо.

Tony 06.01.2015 19:30

Это работает, если разрывы строк уже находятся в нужных местах. sgml-pretty-print помогает в этом (но, на мой взгляд, все еще не лучший выбор).

pnj 27.01.2015 16:51

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

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

Другие вопросы по теме