Clojureで始めるTree-sitter
東京Emacs勉強会オクトーバーフェスティバル2024の登壇資料です。
自己紹介 - Conao3
attrorg: :width 300
-
転職しました!
- 広島 → 目黒
- Pythonista → Clojurian
- せっかく上京してきたので遊んでくれる人募集してます!
- 具体的にはVim-jpの #event-ramen で「ラーメン行きたい」と呟くと召喚できます!
-
趣味
- EmacsLisp
- Author: leaf, seml-mode, org-generate, keg,,,
- Co-maintainer: ddskk, cask,,,
-
興味
- Lisp, Type, Compiler, GraphQL
アジェンダ
Emacs meets tree-sitter
Emacs 29でtree-sitterサポートがビルトインになった。
tree-sitterの登場により、エディタそれぞれでハイライトの実装をしなくてよい。 ある種、ハイライト分野のLSP。
速い!!
なお、tree-sitter.elはtreesit.elとしてビルトインされたので、ネット上の情報を調べるのはこの知識があると調べやすい。
tree-sitterパーサの作り方
tree-sitter/creating-parser が丁寧に書いてある。
tree-sitter-cliのインストール
まず対象の言語を決めて、 tree-sitter-cli
を入れる。
tree-sitter init
initする。
grammar.jsが文法ファイル。生成時点はこのような内容。
tree-sitter generate
文法ファイルからパーサを生成する。
Cで書かれたパーサが生成される。
tree-sitter parse
使ってみる。
このような結果が表示される
tree-sitter test
テストランナーが付属している。
test/corpus/basic.txt
を以下の内容で用意する。
実行
結果
実際のところ、テストを実行するためには事前にパーサを生成しておく必要があるので、連続で実行するようにしておくと良い。
Clojureの文法ファイル
Clojureをパースするために書いたのはこちら。
簡略化されているが、それでもこれくらいのものはパースできるようになっている。
tree-sitterパーサをEmacsから使う
設定
こんな感じで書く。
使い方
このメジャーモードを実行する。具体的には以下の内容を記述した適当なcljファイルを開く。
そうするとこのような感じで出力され、自動的にtree-sitterパーサのclone及びコンパイル、インストールが行われる。便利。
Emacsがtree-sitterパーサによってどのように理解しているかは M-x treesit-explore-mode
を見ると分かりやすい。
treesit-major-mode-setup
treesit-major-mode-setup
が便利関数。 ドキュメントを要約するとこんなことをするらしい。
これらの変数を treesit-major-mode-setup
の前に設定しておくと、関連する設定をいい感じにやってくれて便利
コードハイライト
これを追加する。
インデント
これを追加する
thing-at-point
treesit-defun-type-regexp
or defun
is defined in treesit-thing-settings
-> set up beginning-of-defun-function
and end-of-defun-function
.
わかりませんでした!!
treesit-defun-name-function
わかりませんでした!! そもそも add-log-current-defun
って何?
バッファの中で重要そうな行を抽出する機能。 これを追加する。詳細は要調査。
Outline minor mode
treesit-simple-imenu-settings
を設定していれば outline-minor-mode
で使えるようになるらしい。
M-x outline-minor-mode
, M-x outline-cycle
コメント
M-;
でコメント追加するやつ。 これを追加する。
まとめ
- tree-sitter (treesit) により、エディタに依存したそれぞれのパーサを作るのではなく、「言語のパーサ」として異なるエディタのユーザーが共同で作りあげられるようになった。
- tree-sitterパーサを作るのは (簡単には) 簡単に作れるので、やってみると便利
- そのtree-sitterパーサに依存したメジャーモードを作るのも簡単
- ぜひやってみてください
告知
Clojure学んでみたい。。?本を書きました!! 11/2 (来週日曜日) 池袋です。 「技術書典17 clojure」で検索してみてください。
Clojureの標準モジュールであるclojure.coreを網羅的に解説しました。ぜひお手に取ってみてください!