tag - ¿Puede emacs volver a indentificar una gran cantidad de HTML para mí?
title label html (10)
De forma predeterminada, cuando visita un archivo .html
en Emacs (22 o 23), lo pondrá en html-mode
. Probablemente eso no es lo que quieres. Probablemente quieras nxml-mode
, que es nxml-mode
elegante. nxml-mode
parece que solo viene con Emacs 23, aunque puedes descargarlo para versiones anteriores de emacs desde el sitio web nXML . También hay un paquete de Debian y Ubuntu llamado nxml-mode
. Puede ingresar nxml-mode
con:
M-x nxml-mode
Puede ver la documentación del modo nxml con:
C-h i g (nxml-mode) RET
Dicho todo esto, probablemente tendrá que usar algo como Tidy para volver a formatear su ejemplo xhtml. nxml-mode
te sacará de
<!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>
a
<!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>
pero no veo una facilidad más general para hacer saltos de línea en ciertas etiquetas xml como desee. Tenga en cuenta que Cj
insertará una nueva línea con la sangría adecuada, por lo que puede hacer una macro rápida o piratear un defun
que hará sus tablas.
Al editar HTML en emacs, ¿hay alguna manera de formatear de forma bonita una burbuja de marcado, cambiando algo como esto?
<table>
<tr>
<td>blah</td></tr></table>
...dentro de esto:
<table>
<tr>
<td>
blah
</td>
</tr>
</table>
En emacs 25, que estoy construyendo actualmente desde la fuente, suponiendo que esté en modo HTML, use
Ctrl - x
marido
para seleccionar todo, y luego presione Tab .
Escribí una función para hacer esto para xml, que funciona bien en nxml-mode. debería funcionar bastante bien para html también:
(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))))
Esta pregunta es bastante antigua, pero no estaba muy contento con las diversas respuestas. Una forma sencilla de volver a aplicar sangría a un archivo HTML, dado que está ejecutando una versión relativamente nueva de emacs (estoy ejecutando 24.4.1) es:
- abra el archivo en emacs
- marque el archivo completo con
Cx h
(nota: si desea ver lo que se está marcando, agregue(setq transient-mark-mode t)
a su archivo.emacs
) - ejecutar
Mx indent-region
Lo bueno de este método es que no requiere ningún complemento (sugerencia de Conway), no requiere una regexp de reemplazo (sugerencia de nevcx), ni requiere cambiar de modo (sugerencia de jfm3). La sugerencia de Jay va en la dirección correcta: en general, la ejecución de CMq
acuerdo con las reglas de un modo; por ejemplo, CMq
funciona, en mi experiencia, en js-mode
y en muchos otros modos. Pero ni html-mode
ni nxml-mode
parecen implementar CMq
.
La forma más fácil de hacerlo es a través de la línea de comando.
- Asegúrate de tener ordenado
- escribe
tidy -i -m <<file_name>>
Tenga en cuenta que la opción -m
reemplaza el archivo recién ordenado con el anterior. Si no quiere eso, puede escribir tidy -i -o <<tidied_file_name>> <<untidied_file_name>>
El -i
es para sangría. Alternativamente, puede crear un archivo .tidyrc
que tenga configuraciones tales como
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
De esta forma, todo lo que tiene que hacer es escribir tidy -o <<tidied_file_name>> <<untidied_file_name>>
.
Para más, simplemente escriba man tidy
en la línea de comando.
Puede canalizar una región a xmllint (si la tiene) usando:
M-|
Shell command on region: xmllint --format -
El resultado terminará en un nuevo buffer.
Hago esto con XML, y funciona, aunque creo que xmllint necesita ciertas otras opciones para trabajar con HTML u otro XML no perfecto. nxml-mode le dirá si tiene un documento bien formado.
Puede hacer sgml-pretty-print
y luego indent-for-tab
en la misma región / buffer, siempre que esté en modo html o nxml-mode.
sgml-pretty-print
agrega nuevas líneas a los lugares adecuados y indent-for-tab
agrega una buena sangría. Juntos conducen a html / xml correctamente formateado.
Puedes hacer una regexp de reemplazo
M-x replace-regexp
/(</[^>]+>/)
/1C-q-j
Aplicar sangría a todo el buffer
C-x h
M-x indent-region
Tidy puede hacer lo que quieras, pero parece que solo para todo el buffer (y el resultado es XHTML)
M-x tidy-buffer
http://www.delorie.com/gnu/docs/emacs/emacs_277.html
Después de seleccionar la región que desea corregir. (Para seleccionar el buffer completo use Cx h)
CMq
Reindee todas las líneas dentro de una agrupación entre paréntesis (sangría-sexp).
CM-/
Reinderte todas las líneas en la región (región de sangrado).