初めての
major-mode

東京Emacs勉強会 端午の節句

@igjit

@igjit

major-mode作ったことある人?

最近、初めてmajor-modeを作りました。

https://igjit.github.io/posts/2019/04/emacs-lisp-for-copl/

そのときに参考になったものや、得られた知見を共有します。

もっと良いやり方あったら教えてください。

発端

関数型言語MLの一種Objective Camlを題材としてプログラミング言語の意味論,型システム,プログラミング言語の基礎概念,これらの概念間の数学的な関連を学ぶ.オンライン演習システムを用いて,「証明」を解答とする演習問題の正誤をWeb上で自動判定することもできる.

内容詳細

オンライン演習システムで

回答があっているか確認

エディタの補助が欲しい

  • シンタックスハイライト
  • インデント

編集して送信、を繰り返すの面倒

なんとかしよう

http://www.wilfred.me.uk/blog/2015/03/19/adding-a-new-language-to-emacs/

を参考にしながら

  • major-mode
  • Flycheck拡張

を実装

major-mode

igjit/copl-mode

  • シンタックスハイライト
  • インデント (雑)

define-derived-mode で派生モードを作る

syohex/emacs-hcl-mode などを参考にしながら実装

こういう複数行コメントの対応

(* 複数行の
 * コメント *)

インデント

自前でインデント量を計算

or

SMIEを使うべき

(時間が無かったので実装を諦めました)

Flycheck拡張

igjit/flycheck-copl

書いてる最中にエラーがわかる

仕組み

著者の五十嵐先生が公開しているcopl-toolsをdockerで動かす

igjit/docker-copl-tools

構文チェッカーの標準出力を

$ echo 'Z plus Z is Z ?' | docker run --rm -i copl-tools checker -game Nat

line 1, character 14 -- line 1, character 15
Incomplete derivation

Flycheckでparseするだけ

詳細はDeveloper’s Guide

簡単なのでみんなもFlycheck拡張作ろう:

できる Flycheck拡張 (shell scriptでチェッカーを実装する)

最近作ったやつ:

Rの型チェッカー

結果

Emacsで快適に演習問題を解けるようになった!

問題たくさん解いた。(57 / 431 位)

extensible, customizable

https://www.gnu.org/software/emacs/

Happy hacking!