Emacs で Satyristes を書くための諸々を作った話

はじめに

この記事は SATySFi Advent Calendar 2023 21日目の記事です。20日目も22日目もまだ誰もいません。

今年もアドベントカレンダーの時期がやってきました。たまーに SATySFi で文書を書く MasWag です。9日目の記事 にもちょっと書いた通り、最近はスライドを書く以外の用途で SATySFi をほとんど使っていません。

さて、 SATySFi には Satyrographos Package Index にあるようにそれなりの個数のパッケージがありますが、 LaTeX などと比べると既存のパッケージがまだかなり少ないため、パッケージを自作する場面もあると思います。OCamlに似た構文・意味論のため、通常の関数型プログラミングと近い感じで比較的お手軽にパッケージを作れる、ということもあるかもしれません (少なくとも LaTeX よりは)。SATySFi v0.1.0では新しいパッケージマネージャが追加されるらしいですが、今のところ OCaml のパッケージマネージャである OPAM の上に乗っかる形で作られている、Satyrographos がパッケージマネージャとして使われています。

Satyrographos のためのパッケージを自作する際には、OPAM の設定ファイルである .opam ファイルと Satyrographos 独自の設定ファイルである Satyristes というファイルを作成する必要があります。 Satyristes では S式 によって設定を記述するため、Emacsで Satyristes を編集する際には汎用のLisp用のメジャーモードである lisp-mode でも大体何とかなりますが、 Satyristes のキーワードのハイライトや補完などをやってもらいたいような気もします。ということで、この記事では Emacs で Satyristes を編集するための諸々を作った話を書きます (Emacsのメジャーモードを一回くらい作ってみたい気になったので、lisp-modeを拡張するだけでお手軽に作れる Satyristes を選んだ、というのは秘密)。

こういうものができます

今回作ってみた satyristes-mode などは GitHub 上で公開しています。README.mdにも書いてありますが、本体の satyristes-mode によるsyntax highlightなどと、 company-mode によるキーワードの補完と、 ElDoc によるキーワードの説明が提供されています。flycheckやflymakeによるsyntax checkingもあると便利かもしれないですが、 ちょっと大変そうだったので 今回はやっていません。

こういう設定で動きます

GitHub 上の README.md にも設定の例を書いていますが、use-packageの設定などを含んだ完全な init.el の例は以下のようになります。ここでは諸々の Emacs Lisp は ~/.emacs.d/site-lisp に置かれていると仮定した設定になっています。

(require 'use-package)
(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
(use-package satyristes-mode
  :ensure nil  ; The mode is not on MELPA
  :load-path "~/.emacs.d/site-lisp")  ; Specify the path to satyristes-mode.el

(use-package company-satyristes
  :ensure nil
  :init
  (use-package company
    :ensure t
    :config
    (global-company-mode))
  :config
  (add-to-list 'company-backends 'company-satyristes))

(use-package eldoc-satyristes
  :ensure nil
  :after (eldoc satyristes-mode))

諸々のファイルについて

諸々のファイルについても少しだけ説明を書きます。

satyristes-mode.el

今回のメインとなるメジャーモードである satyristes-mode を提供しているファイルになります。基本的にはsyntax highlightのためのキーワードを設定しているだけで、ほぼ lisp-mode と同様です。ここでは Satyristes で使われるキーワードとその説明からなる alist である satyristes--keywords-alist を定義しており、これが satyristes-mode でのキーワードの指定以外でも色々な場所で再利用されています。 satyristes--keywords-alist にある説明は Satyrographos の README.md のもの を拝借しています。また、 Satyristes というファイル名のファイルと satyristes-mode を対応付ける設定もしているので、利用者が特に設定することなく satyristes-mode が使われるようになります。

company-satyristes.el

Satyristes のための company のバックエンドを提供しているファイルになります。色々ありますが、基本的には適当な場合分けに応じて satyristes--keywords-alist を色々加工して、必要な情報を返しているだけです。

eldoc-satyristes.el

Satyristes のための eldoc のバックエンドを提供しているファイルになります。これも適当に satyristes--keywords-alist を引いてドキュメントの部分を返しているだけです。 satyristes-mode が使われている際には自動での eldoc のバックエンドが使われるような hook を設定しているので、~satyristes-mode~ の設定と同様に利用者が特に設定することなく eldoc が使えるようになります。

いかがだったでしょうか

今回はざっと Emacs で Satyristes を書くための環境を作ってみました。正直 Satyristes を書く機会はそこまで頻繁にはないですし Satyrographos が生成するテンプレートに沿って埋めるだけみたいなところもありますが、誰かの役に立てば幸いです。