Emacs で小説家になろう

小説家になろう」という小説ホスティングサイトがある。

このサイトでは Wiki のような複雑な記法はないが、ルビと画像挿入と改行制御とについて専用の記法が用意されている。 (実際には改行制御はほとんど使われていないようだが。)

さて、問題はルビ記法だ。 括弧を記法に使う性質から、単に括弧書きをするつもりがうっかりルビ記法になっていたり、逆にルビ記法にするつもりがなっていなかったりということがうんざりするほど頻繁にあり、エディタの方で支援する必要があるのではないかと思った。

そこで、 Emacs 用にルビ記法を強調する narou-mode を定義してみた。

(defface ruby-notation
  '((t (:background "dark slate blue" :foreground "white")))
  "Used for displaying ruby-notation.")

(defface environment-dependent
  '((t (:background "red" :foreground "white")))
  "Used for displaying environment-dependent letter.")

(defvar narou-mode-font-lock-keywords
  `(("\\(\\(\\(|\\||\\)[^||《]\\{11,\\}\\(?:|\\||\\)?\\|[一-龠々]\\{11,\\}\\)\\)《[^》!]+》" . 'default)
    ("\\(\\(|\\||\\)\\{2,11\\}\\|\\(\\(|\\||\\)[^||《]\\{1,10\\}\\(?:|\\||\\)?\\|[一-龠々]\\{1,10\\}\\)\\)《[^》!]+》" . 'ruby-notation)
    ("\\(?:\\(?:\\(?:|\\||\\)[^||((]\\{11,\\}\\(?:|\\||\\)?\\)\\|[一-龠々]\\{11,\\}\\)\\(?:(\\|(\\)[ぁ-ゖァ-ヴ・ー]+\\(?:)\\|)\\)" . 'default)
    ("\\(?:\\(?:\\(?:|\\||\\)[^||((]\\{1,10\\}\\(?:|\\||\\)?\\)\\|[一-龠々]\\{1,10\\}\\)\\(?:(\\|(\\)[ぁ-ゖァ-ヴ・ー]+\\(?:)\\|)\\)" . 'ruby-notation)    
    ("[^\u0000-\uFFFF]" . 'environment-dependent)
    ))

(defun insert-ruby-notation ()
  (interactive)
  (insert "|《》")
  (backward-char 2))

(define-derived-mode narou-mode text-mode "narou"
  "Major mode for editing text of narou format."
  (setq-local font-lock-defaults '(narou-mode-font-lock-keywords nil nil))
  (local-set-key [(C c) (C r)] 'insert-ruby-notation))

このモードを使うとルビ記法になっている部分を色で示してくれる。 ルビ記法として認識されるのかどうか微妙な書き方についても「小説家になろう」のサイトの挙動を観察して反映したつもりだ。

ついでに使えない文字は赤で示すのと、ルビ記法を挿入するコマンドも入れてある。

実際に使った場合のスクリーンショットが以下だ。

Document ID: eaf80218571bbb148f0c8d76fd3411c8