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 が生成するテンプレートに沿って埋めるだけみたいなところもありますが、誰かの役に立てば幸いです。