YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

Sphinxで文章を書く際のEmacs環境設定 2012.12版

はじめに

こんにちは、Python界の情弱です。このエントリはSphinx Advent Calendar 2012の2日目のエントリです。1日目の@r_rudiより受け取りました。完全に使い回しのネタ+αとなってますがご容赦下さい。

最近はVimだとかSublime Text 2だとか、若者のEmacs離れが進んでおりますが、みなさんはいかがお過ごしでしょうか。SphinxはreStructured Textでドキュメントを記述しますが、Emacsを使うと結構色々と便利だよ、という事をお知らせしたく、この文章を書いています。

rst.el

rst.elの導入

Docutilsが配ってます。Emacs用の拡張しか置いてないです。

どうだ、Vimmer、参ったか!Sublime Text 2の人も参れ!(白目)
以前似たような記事を書いたのですが、多方面より「キーアサインが変わってる!」との報告を受けましたので再度まとめます。

;;;; rst.el
;; Emacs起動時にrst.elを読み込み
(require 'rst)
;; 拡張子の*.rst, *.restのファイルをrst-modeで開く
(setq auto-mode-alist
      (append '(("\\.rst$" . rst-mode)
		("\\.rest$" . rst-mode)) auto-mode-alist))
;; 背景が黒い場合はこうしないと見出しが見づらい
(setq frame-background-mode 'dark)
;; 全部スペースでインデントしましょう
(add-hook 'rst-mode-hook '(lambda() (setq indent-tabs-mode nil)))
ショートカット

ショートカットはこちら。

ショートカット 内容 覚え方
C-=, C-- C-= 自動見出しレベル設定(C-- C-=で逆順) =で線を引く
(リージョン設定後)C-c C-c 選択範囲をコメントアウトする comment
(リージョン設定後)C-c C-r tab, C-c C-l tab インデントレベルを深くする/浅くする right, leftにインデント
(リージョン設定後)C-c C-r C-l 行ブロックを設定する --
(リージョン設定後)C-c C-l C-e, C-c C-l C-b すべての行を数字リスト/箇条書きにできる C-c C-lがリスト操作。最後はenumeration, bulletの頭文字。
C-c C-t C-t 現在書いているreST内の見出し(toc; table of contents)を表示 toc treeの頭文字
(リージョン設定後)C-x r t リージョン中の各行頭へ指定文字列挿入 region text

見出しを表示のオプションは大きなreSTファイルを書いているときはとても便利です。

autoinsertでテンプレートを利用

今日日のEmacsでは新規ファイルを作成する際にテンプレートを挿入できるautoinsertが標準で利用できます。これで毎度書く文字コードの設定を回避できて大変良いです。

;;;; autoinsert
(require 'autoinsert)

(setq user-id-string "ymotongpoo")
(setq user-full-name "Yoshifumi YAMAGUCHI")
(setq user-mail-address "ymotongpoo AT gmail.com")

;; テンプレートのディレクトリ
(setq auto-insert-directory "~/.emacs.d/template")

;; 各ファイルによってテンプレートを切り替える
(setq auto-insert-alist
      (nconc '(
               ("\\.rst$" . ["template.rst" my-template])
               ) auto-insert-alist))
(require 'cl)

(defvar template-replacements-alists
  '(("%file%"             . (lambda () (file-name-nondirectory (buffer-file-name))))
    ("%file-without-ext%" . (lambda () (file-name-sans-extension (file-name-nondirectory (buffer-file-name)))))
    ("%date%" . (lambda() (current-time-string)))
    ("%mail%" . (lambda () (identity user-mail-address)))
    ("%name%" . (lambda () (identity user-full-name)))
    ("%id%" . (lambda () (identity user-id-string)))
))

(defun my-template ()
  (time-stamp)
  (mapc #'(lambda(c)
            (progn
              (goto-char (point-min))
              (replace-string (car c) (funcall (cdr c)) nil)))
        template-replacements-alists)
  (goto-char (point-max))
  (message "done."))
(add-hook 'find-file-not-found-hooks 'auto-insert)

で、.emacs.d/templateにテンプレートを置いておく。

  • .emacs.d/template/template.rst
.. -*- coding: utf-8 -*-
   Date: %date%
   Author: %id% (%name%, %mail%)

.. _%file-without-ext%:

これで毎度書くコードが減って大変いいですね。

watchdogによる自動ビルド

watchコマンドでビルドしてもいいんですが、Pythonユーザなのでwatchdogでビルドします。

watchmedo shell-command --patterns="*.rst" --recursive --command='make html' source

おわりに

ところでこれからHTML5が標準になるので、そろそろSphinxXHTML 1.0ではなくデフォルトはHTML5で記述してもらえるようにしてほしいなと思ったりしている今日この頃です。
明日は世界(@tk0miya)です。世界、お願いします。