Emacs
Markdown
EmacsDay 10

自己流Markdown modeの使い方

自己流ですが EmacsMarkdown modeの使い方を紹介します。

初期設定

Markdownはgfm-mode(GitHub Flavored Markdown)を使ってます。

(package-install 'markdown-mode)
(autoload 'markdown-mode "markdown-mode"
   "Major mode for editing Markdown files" t)
(add-to-list 'auto-mode-alist '("\\.markdown\\'" . markdown-mode))
(add-to-list 'auto-mode-alist '("\\.md\\'" . gfm-mode))

メモ、プロット時

書いてる時によく使うショートカットは以下の通りです。

キー 動作
TAB 見出しやツリーの折り畳み
C-c C-s h 見出しの追加
C-c C-n 次の見出しに移動
C-c C-p 前の見出しに移動
C-c ← → 見出しレベルの上げ下げ
C-c ↑ ↓ 見出しの移動
M-Enter リストの追加
C-c C-d TODOの追加(トグル)
C-c ' コードブロックでmode編集

Markdown modeに限った話ではないですが、下記のショートカットも併用してよく使います。

キー 動作
C-x n s 見出し範囲での限定表示
C-x n n 指定範囲のみ限定表示
C-x n w 限定表示の解除
C-c C-s ? ショートカットヘルプ

仕上がり確認

バッファ内でそこそこ整形表示してくれるので確認しつつ、たまにブラウザで表示させます。

キー 動作
C-c C-x ENTER バッファ内で整形表示
C-c C-c p ブラウザで表示

変換コマンドはGithubのMarkdown APIを使ってます。

(setq markdown-command "jq --slurp --raw-input '{\"text\": \"\\(.)\", \"mode\": \"gfm\"}' | curl -sS --data @- https://api.github.com/markdown")

プレゼン時

下記の設定で、バッファをスライド表示にしてます。emojifyで絵文字 :smiley: も表示できます。

(require 'page-ext)
(add-hook 'markdown-mode-hook
          '(lambda ()
             (setq page-delimiter "^## ")
             (define-key markdown-mode-map (kbd "M-p") 'previous-page)
             (define-key markdown-mode-map (kbd "M-n") 'next-page)
            ))
キー 動作
M-n 次のスライド
M-p 前のスライド
C-x n w スライド表示の解除
C-c C-x TAB 画像の表示

メモはコメント(<!-- -->)でいれて、表示上はhide-comntで消します。

PDFで出力

Emacsを使わないプレゼンでは、 資料はブラウザからPDF出力します。github-markdown-cssを読み込んでページ設定してるので、それっぽい表示にはなります。

(eval-after-load "markdown-mode"
  '(defalias 'markdown-add-xhtml-header-and-footer 'my/markdown-add-html5-header-and-footer))
(defun my/markdown-add-html5-header-and-footer (title)
    "Wrap XHTML header and footer with given TITLE around current buffer."
    (goto-char (point-min))
    (insert "<!doctype html>\n"
        "<html lang=\"ja\">\n"
        "<head>\n  <title>")
    (insert title)
    (insert "</title>\n")
    (insert "  <meta charset=\"utf-8\">\n")
    (insert "  <link href=\"https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/2.8.0/github-markdown.min.css\" rel=\"stylesheet\">\n")
    (insert "  <style>body { zoom: 150%; } body > h1:not(:first-child) { border: 0; page-break-before: always; } h2{ page-break-before: always; }</style>\n")
    (insert "  <style>\n")
    (insert "  @media screen { div.footer { display: none; } }\n")
    (insert "  @media print { @page { size: legal landscape; margin-top: 0; margin-bottom: 6mm; } h1 { padding-top: 50mm; } h2 { padding-top: 0 } div.footer { position: fixed; right: 0; bottom: 0; } }\n")
    (insert "  </style>\n")
    (insert "</head>\n"
        "<body class=\"markdown-body\">\n")
    (goto-char (point-max))
    (insert "\n"
            "<div class=\"footer\"><img src=\"https://user-images.githubusercontent.com/13231263/31114194-d9656554-a857-11e7-8a87-245bf60475be.png\" style=\"width: 80px\"></div>"
            "</body>\n" "</html>\n"))

下記の出力サンプルは Polymer Japan Meetup #0 で挑戦したLT「Web Componentsを公開しよう!」をPDFにしてキャプチャしたものです。

Polymer-lt

以上、ご参考になればです!


:christmas_tree: Emacs Advent Calendar 2017
:arrow_right: 11日目 selected.el で「選択して右クリック」的な概念を @takaxp