26.12 SGML and HTML Modes

The major modes for SGML and HTML provide indentation support and commands for operating on tags.

HTML consists of two modes—one, a basic mode called html-mode is a slightly customized variant of SGML mode. The other, which is used by default for HTML files, is called mhtml-mode, and attempts to properly handle Javascript enclosed in a <script> element and CSS embedded in a <style> element.

C-c C-n

Interactively specify a special character and insert the SGML ‘&’-command for that character (sgml-name-char).

C-c C-t

Interactively specify a tag and its attributes (sgml-tag). This command asks you for a tag name and for the attribute values, then inserts both the opening tag and the closing tag, leaving point between them.

With a prefix argument n, the command puts the tag around the n words already present in the buffer after point. Whenever a region is active, it puts the tag around the region (when Transient Mark mode is off, it does this when a numeric argument of −1 is supplied.)

C-c C-a

Interactively insert attribute values for the current tag (sgml-attributes).

C-c C-f

Skip across a balanced tag group (which extends from an opening tag through its corresponding closing tag) (sgml-skip-tag-forward). A numeric argument acts as a repeat count.

C-c C-b

Skip backward across a balanced tag group (which extends from an opening tag through its corresponding closing tag) (sgml-skip-tag-backward). A numeric argument acts as a repeat count.

C-c C-d

Delete the tag at or after point, and delete the matching tag too (sgml-delete-tag). If the tag at or after point is an opening tag, delete the closing tag too; if it is a closing tag, delete the opening tag too.

C-c ? tag RET

Display a description of the meaning of tag tag (sgml-tag-help). If the argument tag is empty, describe the tag at point.

C-c /

Insert a close tag for the innermost unterminated tag (sgml-close-tag). If called within a tag or a comment, close it instead of inserting a close tag.

C-c 8

Toggle a minor mode in which Latin-1 characters insert the corresponding SGML commands that stand for them, instead of the characters themselves (sgml-name-8bit-mode).

C-c C-v

Run a shell command (which you must specify) to validate the current buffer as SGML (sgml-validate). (In HTML mode this key sequence runs a different command.)


Toggle the visibility of existing tags in the buffer. This can be used as a cheap preview (sgml-tags-invisible).

The major mode for editing XML documents is called nXML mode. This is a powerful major mode that can recognize many existing XML schemas and use them to provide completion of XML elements via M-TAB, as well as on-the-fly XML validation with error highlighting. To enable nXML mode in an existing buffer, type M-x nxml-mode, or, equivalently, M-x xml-mode. Emacs uses nXML mode for files which have the extension .xml. For XHTML files, which have the extension .xhtml, Emacs uses HTML mode by default; you can make it use nXML mode by customizing the variable auto-mode-alist (see Choosing File Modes). nXML mode is described in an Info manual, which is distributed with Emacs.

You may choose to use the less powerful SGML mode for editing XML, since XML is a strict subset of SGML. To enable SGML mode in an existing buffer, type M-x sgml-mode. On enabling SGML mode, Emacs examines the buffer to determine whether it is XML; if so, it sets the variable sgml-xml-mode to a non-nil value. This causes SGML mode’s tag insertion commands, described above, to always insert explicit closing tags as well.