redpen-paragraph.el の紹介

マニュアルを書く機会があったので redpen-paragrah.el という Emacs Lisp パッケージを作ってみた.これによって Emacs から RedPen をいい感じに使うことができる.この elisp は作ってから1年位使っていて,せっかくなので今回の記事を起こした.

RedPen の紹介

RedPen より引用.

RedPen はプログラマや記者が規約にしたがって文書 (マニュアルやソフトウェアドキュメント) を記述するのをサポートします。
RedPen は自然言語で記述された入力文書のチェックを自動化します。

RedPen には入力文書のフォーマットがいくつかあって,Markdown や AsciiDoc , LaTex 等サポートされてる.Pull Request や Issue もいい感じに対応してくれる.
Issues · redpen-cc/redpen · GitHub
ArchLinux ユーザは AUR (en) - redpen を使っておくと systemd から使えるので良かったらどうぞ.

クイックスタートガイド

どこかのキーに redpen-paragraph を割り当てて任意の文章上で起動.C-u 付きで起動すればファイル単位を校正できる.

  (define-key global-map (kbd "C-c C-r") 'redpen-paragraph)

redpen-paragraph.el をなぜ作ったか?

Emacs で org-mode に対して校正したかったから.それと RedPen は org-mode に対応していなかったから.org-mode のフォーマットは *基本的には* 複雑なものじゃない.
org-mode の 正規表現をコピペすればそこそこ実用的なものは作れると思う.だけど細かい変更に追従できる気がしない.それならファイルの部分ごと,文章単位で校正できれば org-mode 以外にも使えるんじゃないだろうか? (例: ソースコードのコメント)

以上の理由から redpen-paragraph.el を作った.

なにができる?

文章単位での校正

M-x redpen-paragraph でカーソル上にある文章を redpen-server に投げて,返ってきた結果を compilation-mode で表示する.エラーがあれば,その項目を選んで文書中の該当箇所に飛べる.ただし毎回 M-x から呼ぶのは億劫なので,任意のキーに割り当てて使うことを想定している.

org-mode での校正

文章中の非表示文字を無視して,表示文字に対して校正する.redpen-paragraph-alist をカスタマイズすることでメジャーモードごとに挙動を変更できる.

ファイル単位での校正

キー割り当てをして C-u を付けて呼ぶと一時的にファイル単位で校正する.常にファイル単位で校正したい場合は .emacs.el に以下の記述をする.

  (defvar redpen-paragraph-force-reading-whole t)

常にファイル単位で校正したい場合は flycheck も検討するといいと思う.

入力言語の判定

RedPen は英語と日本語に対応している.入力文章が ASCII 範囲内の文字とそれ以外の範囲の文字が混ざってる場合,それぞれの文字数の比に応じて RedPen の使用言語を切り替える.

注意点

デモ用途 redpen-server

elisp のインストール直後で利用できる redpen-server は自分が Heroku にデモ用途として設置している.セキュリティや応答性,サービスの継続性を気にする場合は各自でサーバを立てること.

Emacs の日本語カウント

Emacs は日本語の1文字を2文字分として解釈する.なのでエラー場所を表示するときに,日本語のある場所への正確な移動ができない.この挙動を変える設定はどこにあるんだろう…

切り替えフラグあった!!

If non-nil, column numbers in error messages are screen columns.
Otherwise they are interpreted as character positions, with
each character occupying one column.
(setq compilation-error-screen-columns nil)