Markdown Modeと久々に向き合う

こんにちは！ Emacs Advent Calendarです！ メリークリスマス！

Advent Calendarの季節なのでみなさんも20個くらい記事を書く羽目になっているのではないかと思うのですが、私も最近いろいろあって執筆環境を整えてモチベを高めようという気になってきました。

EmacsでMarkdownを書くなら[Markdown Mode]を使うのが定石ですが、長年何も考えずに使ってきてMarkdown ModeのMarkdown Modeらしい使いかたをしてこなかったので長い12月の最初に向き合ってみようかと思いました。

https://github.com/jrblevin/markdown-mode

## Markdown Modeのインストール

Markdown ModeはEmacsに標準では付属していませんが、`M-x package-install markdown-mode`とかで入ります。Emacs 28以降では[NonGNU ELPA]が最初から設定されているので、特別な設定は何もしなくても入ります。

:::note warn
それ以前のEmacs向けにはREADMEを読んで `package-archives` の追加をしてください。
いままで`"melpa"`/`"melpa-stable"`/`"nongnu"`のどれかを追加していて非標準のパッケージがインストールできていれば追加の設定は必要ありません。
:::

## Markdown Modeの設定

設定項目はREADMEやドキュメントにいっぱい書いてあります。

:::note
みなさんもう既にEmacs 29を使ってると思うので`setopt`で設定すると便利です。
これはカスタム変数を設定するための機能で、`custom-set-variables`と同等のものですが、`setq`と似た使いかたができるようになったものです。
:::

以下の設定は[leaf.el](https://github.com/conao3/leaf.el)が使える環境向けに書かれています。
leafについては[2020年代のEmacs入門](https://emacs-jp.github.io/tips/emacs-in-2020)などもご参照ください。

``` emacs-lisp
(leaf markdown-mode :ensure t
  :mode ("\\.md\\'" . gfm-mode)
  :config
  (setopt markdown-command '("pandoc" "--from=markdown" "--to=html5"))
  (setopt markdown-fontify-code-blocks-natively t)
  (setopt markdown-header-scaling t)
  (setopt markdown-indent-on-enter 'indent-and-new-item)
  (leaf-key "<S-tab>" #'markdown-shifttab markdown-mode-map))
```

leafを使わずに古いEmacs向けの同等の設定も比較してみましょう。

``` emacs-lisp
(add-to-list 'auto-mode-alist '("\\.md\\'" . gfm-mode))
(with-eval-after-load 'markdown-mode
  (custom-set-variables
   '(markdown-command '("pandoc" "--from=markdown" "--to=html5"))
   '(markdown-fontify-code-blocks-natively t)
   '(markdown-header-scaling t)
   '(markdown-indent-on-enter 'indent-and-new-item))
  (define-key markdown-mode-map (kbd "<S-tab>") #'markdown-shifttab))
```

 * 拡張子 `.md` のファイルに対して `markdown-mode` ではなく `gfm-mode` を使う
   * これはどちらでも機能に大きな差があるわけではないのだが、GitHub拡張向けが有効になる
   * 世の中のMarkdownは暗黙的にGFM(GitHub Flavored Markdown)準拠なので大きな問題は起こらない
 * **`markdown-command`**: MarkdownをHTMLに変換するコマンドを設定する
 * **`markdown-fontify-code-blocks-natively`**: コードブロックに対応する言語で色付けする
 * **`markdown-header-scaling`**: 見出し部のフォントをおっきくする
   * Emacsで文字の大きさを変えるような変更は好き嫌いがあると思います
 * **`markdown-indent-on-enter`**: RETを押したときの振る舞いを制御する
   * `'indent-and-new-item` を設定すると、改行するときに「いい感じ」になる
 * **`leaf-key`**/**`define-key`**: <kbd>Shift + Tab</kbd>を押したときの動きをいい感じにする
     * もともとは本来は `(kbd "<backtab>")` として設定されているのだけれど、私が使っているmacOSのEmacsでは動作しないので明示的に設定した

あとは私は長年[Markdown で表(テーブル)を描く]の設定を使ってorg-table-mode(orgtbl)をむりやり使ってたのですが… [2017年にMarkdown Modeに実装されていた][Add support for table editing]ことをたったいま知りました。

## スクリーンショット

![スクリーンショット 2023-12-01 8.52.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4121/c2a5f602-9001-0d48-fef7-9d25b3025a23.png)

 * macOS上の[Emacs Plus](https://github.com/d12frosted/homebrew-emacs-plus) 29.1を全画面で使っています
 * カラーテーマは[modus-themes](https://github.com/protesilaos/modus-themes)に含まれる`modus-vivendi`を使っています
   * 詳細：[【Emacs入門】②バージョン28で新たにビルトインされるModus Themesを使おう](https://zenn.dev/lambdagonbei/articles/1b2bce27673078)
 * 画面の文字がある領域の幅が狭いのは[writeroom-mode](https://github.com/joostkremers/writeroom-mode)によるものです
   * 詳細：[writeroom-mode.el : 余計な装飾一切排除！物書きするときは執筆部屋にひきこもれ！！Mac iPhoneからの移植](http://emacs.rubikitch.com/writeroom-mode/)

------

というわけで、EmacsでばりばりMarkdownを弄れるようになりました。

## 俺たちの執筆道はこれからだ！

みなさまもよい年末を🎉

[Markdown Mode]: https://github.com/jrblevin/markdown-mode
[NonGNU ELPA]: https://elpa.nongnu.org/nongnu/
[Markdown で表(テーブル)を描く]: https://qiita.com/nanasess/items/c9342c06a3e28e64aeb8
    [Add support for table editing]: https://github.com/jrblevin/markdown-mode/commit/5729dc53f7462c7290fcff3c6fa5d35ecec0d8b5