Emacs Markdown Mode

markdown-mode is a major mode for editing Markdown-formatted text files in GNU Emacs. markdown-mode is free software, licensed under the GNU GPL.

The latest stable version is markdown-mode 1.8.1, released on August 15, 2011:

markdown-mode is also available in several package managers, including:

The latest development version can be downloaded directly (markdown-mode.el) or it can be obtained from the (browsable and clonable) Git repository at http://jblevins.org/git/markdown-mode.git. The entire repository, including the full project history, can be cloned via the Git protocol by running

git clone git://jblevins.org/git/markdown-mode.git

Dependencies

markdown-mode requires easymenu, a standard package since GNU Emacs 19 and XEmacs 19, which provides a uniform interface for creating menus in GNU Emacs and XEmacs.

Installation

Make sure to place markdown-mode.el somewhere in the load-path and add the following lines to your .emacs file to associate markdown-mode with .text files:

(autoload 'markdown-mode "markdown-mode.el"
   "Major mode for editing Markdown files" t)
(setq auto-mode-alist
   (cons '("\\.text" . markdown-mode) auto-mode-alist))

There is no consensus on an official file extension so change .text to .mdwn, .md, .mdt, or whatever you call your markdown files.

Customization

Although no configuration is necessary there are a few things that can be customized. The M-x customize-mode command provides an interface to all of the possible customizations:

  • markdown-command - the command used to run Markdown (default: markdown). This variable may be customized to pass command-line options to your Markdown processor of choice, but this command must accept input from stdin. If it does not, a simple wrapper script can be used to write stdin to a file and then pass that file to your Markdown interpreter. Ideally, this command will produce an XHTML fragment around which markdown-mode will wrap a header and footer (which can be further customized). However, it attempts to detect whether the command produces standalone XHTML output (via markdown-xhtml-standalone-regexp), in which case no header and footer content will be added.

  • markdown-command-needs-filename - set to non-nil if markdown-command does not accept input from stdin (default: nil). Instead, it will be passed a filename as the final command-line option. As a result, you will only be able to run Markdown from buffers which are visiting a file.

  • markdown-hr-string - string to use when inserting horizontal rules (default: * * * * *).

  • markdown-bold-underscore - set to a non-nil value to use two underscores for bold instead of two asterisks (default: nil).

  • markdown-italic-underscore - set to a non-nil value to use underscores for italic instead of asterisks (default: nil).

  • markdown-indent-function - the function to use for automatic indentation (default: markdown-indent-line).

  • markdown-indent-on-enter - set to a non-nil value to automatically indent new lines when the enter key is pressed (default: t)

  • markdown-follow-wiki-link-on-enter - set to a non-nil value to automatically open a linked document in a new buffer if the cursor is an wiki link (default: t)

  • markdown-uri-types - a list of protocols for URIs that markdown-mode should highlight.

  • markdown-enable-math - syntax highlighting for LaTeX fragments (default: nil).

  • markdown-css-path - CSS file to link to in XHTML output.

  • markdown-xhtml-header-content - additional content to include in the XHTML <head> block.

  • markdown-xhtml-standalone-regexp - a regular expression which indicates whether the output of markdown-command is standalone XHTML (default: ^\\(\<\?xml\\|\<!DOCTYPE\\|\<html\\)). If this is not matched, we assume this output is a fragment and add our own header and footer.

Additionally, the faces used for syntax highlighting can be modified to your liking by issuing M-x customize-group RET markdown-faces or by using the “Markdown Faces” link at the bottom of the mode customization screen.

Usage

Keybindings are grouped by prefixes based on their function. For example, commands dealing with headers begin with C-c C-t. The primary commands in each group will are described below. You can obtain a list of all keybindings by pressing C-c C-h.

  • Anchors: C-c C-a

    C-c C-a l inserts inline links of the form [text](url). If there is an active region, text in the region is used for the link text. C-c C-a w acts similarly for wiki links of the form [[WikiLink]].

  • Commands: C-c C-c

    C-c C-c m will run Markdown on the current buffer and preview the output in another buffer while C-c C-c p runs Markdown on the current buffer and previews the output in a browser. C-c C-c e will run Markdown on the current buffer and save the result in the file basename.html, where basename is the name of the Markdown file with the extension removed. This file will be overwritten without notice. Press C-c C-c v to view the exported file in a browser.

    C-c C-c c will check for undefined references. If there are any, a small buffer will open with a list of undefined references and the line numbers on which they appear. In Emacs 22 and greater, selecting a reference from this list and pressing RET will insert an empty reference definition at the end of the buffer. Similarly, selecting the line number will jump to the corresponding line.

  • Images: C-c C-i

    C-c C-i i inserts an image, using the active region (if any) as the alt text.

  • Physical styles: C-c C-p

    These commands all act on text in the active region, if any, and insert empty markup fragments otherwise. C-c C-p b makes the selected text bold, C-c C-p f formats the region as fixed-width text, and C-c C-p i is used for italic text.

  • Logical styles: C-c C-s

    These commands all act on text in the active region, if any, and insert empty markup fragments otherwise. Logical styles include blockquote (C-c C-s b), preformatted (C-c C-s p), code (C-c C-s c), emphasis (C-c C-s e), and strong (C-c C-s s).

  • Headers: C-c C-t

    All header commands use text in the active region, if any, as the header text. To insert an atx or hash style level-n header, press C-c C-t n where n is between 1 and 6. For a top-level setext or underline style header press C-c C-t t (mnemonic: title) and for a second-level underline-style header press C-c C-t s (mnemonic: section).

  • Other elements:

    C-c - inserts a horizontal rule.

  • Wiki-Link Navigation:

    Use M-p and M-n to quickly jump to the previous and next wiki links, respectively.

  • Outline Navigation:

    Navigation between headings is possible using outline-mode. Use C-M-n and C-M-p to move between the next and previous visible headings. Similarly, C-M-f and C-M-b move to the next and previous visible headings at the same level as the one at the point. Finally, C-M-u will move up to a lower-level (more inclusive) visible heading.

Many of the commands described above behave differently depending on whether Transient Mark mode is enabled or not. When it makes sense, if Transient Mark mode is on and a region is active, the command applies to the text in the region (e.g., C-c C-p b makes the region bold). For users who prefer to work outside of Transient Mark mode, in Emacs 22 it can be enabled temporarily by pressing C-SPC C-SPC.

When applicable, commands that specifically act on the region even outside of Transient Mark mode have the same keybinding as the with the exception of an additional C- prefix. For example, markdown-insert-blockquote is bound to C-c C-s b and only acts on the region in Transient Mark mode while markdown-blockquote-region is bound to C-c C-s C-b and always applies to the region (when nonempty).

markdown-mode attempts to be flexible in how it handles indentation. When you press TAB repeatedly, the point will cycle through several possible indentation levels corresponding to things you might have in mind when you press RET at the end of a line or TAB. For example, you may want to start a new list item, continue a list item with hanging indentation, indent for a nested pre block, and so on.

markdown-mode supports outline-minor-mode as well as org-mode-style visibility cycling for atx- or hash-style headers. There are two types of visibility cycling: Pressing S-TAB cycles globally between the table of contents view (headers only), outline view (top-level headers only), and the full document view. Pressing TAB while the point is at a header will cycle through levels of visibility for the subtree: completely folded, visible children, and fully visible. Note that mixing hash and underline style headers will give undesired results.

Extensions

Besides supporting the basic Markdown syntax, markdown-mode also includes syntax highlighting for [[Wiki Links]] by default. Wiki links may be followed automatically by hitting the enter key when your curser is on a wiki link or by hitting C-c C-f. The autofollowing on enter key may be controlled with the markdown-follow-wiki-link-on-enter customization. Use M-p and M-n to quickly jump to the previous and next wiki links, respectively. Aliased or piped wiki links of the form [[PageName|link text]] are also supported.

SmartyPants support is possible by customizing markdown-command. If you install SmartyPants.pl at, say, /usr/local/bin/smartypants, then you can set markdown-command to "markdown | smartypants". You can do this either by using M-x customize-group markdown or by placing the following in your .emacs file:

(defun markdown-custom ()
  "markdown-mode-hook"
  (setq markdown-command "markdown | smartypants"))
(add-hook 'markdown-mode-hook '(lambda() (markdown-custom)))

Experimental syntax highlighting for mathematical expressions written in LaTeX (only expressions denoted by $..$, $$..$$, or \[..\]) can be enabled by setting markdown-enable-math to a non-nil value, either via customize or by placing (setq markdown-enable-itex t) in .emacs, and restarting Emacs.

A GitHub Flavored Markdown mode, gfm-mode, is also available. The GitHub implementation of differs slightly from standard Markdown. Most importantly, newlines are significant and trigger hard line breaks. As such, gfm-mode turns off auto-fill-mode and turns on longlines-mode.

Acknowledgments

markdown-mode has benefited greatly from the efforts of the following people:

  • Cyril Brulebois for Debian packaging.
  • Conal Elliott for a font-lock regexp patch.
  • Edward O’Connor for a font-lock regexp fix and GitHub Flavored Markdown mode (gfm-mode).
  • Greg Bognar for menus and running markdown with an active region.
  • Daniel Burrows for filing Debian bug #456592.
  • Peter S. Galbraith for maintaining emacs-goodies-el.
  • Dmitry Dzhus for reference checking functions.
  • Bryan Kyle for indentation code.
  • Ben Voui for font-lock face customizations.
  • Ankit Solanki for longlines.el compatibility and custom CSS.
  • Hilko Bengen for proper XHTML output.
  • Jose A. Ortega Ruiz for Emacs 23 fixes.
  • Alec Resnick for bug reports.
  • Joost Kremers for bug reports regarding indentation.
  • Peter Williams for fill-paragraph enhancements.
  • George Ogata for fixing several byte-compilation warnings.
  • Eric Merritt for wiki link features.
  • Philippe Ivaldi for XHTML preview customizations and XHTML export.
  • Jeremiah Dodds for supporting Markdown processors which do not accept input from stdin.
  • Werner Dittmann for bug reports regarding the cl dependency and auto-fill-mode and indentation.

Bugs

Although markdown-mode is developed and tested primarily using GNU Emacs 24, compatibility with earlier Emacsen is also a priority.

If you find any bugs in markdown-mode, please construct a test case or a patch and email me at jrblevin@sdf.org.

History

markdown-mode was written and is maintained by Jason Blevins. The first version was released on May 24, 2007.


  1. The theme used in the screenshot is color-theme-twilight.