Neovim で SATySFi の編集環境を簡単に設定する
概要
SATySFi は gfngfn 氏が開発されている比較的新しい組版言語で、この分野のデファクトとも言える TeX と比べて型付き言語であることを特徴としています。
型が付いていることで複雑な組版処理に対しても比較的適切なエラーを出力できるようになり、開発者にとっても利用者にとっても体験が良くなります。
この SATySFi という言語について、編集環境を良くするために language server や tree-sitter parser がつくられています (どちらも monaqa 氏が開発されています)。
これらを利用することで執筆の最中にシンタックスハイライトやエラー診断による恩恵を受けることができます。
しかし、これらの language server や tree-sitter parser は標準的なプラグインでは設定が提供されていないため、使い始めるためにやや込み入った知識や追加の設定が必要になることが難点です。今回はこの課題を解消するため、設定情報をプラグインとしてまとめることで簡単にこれらの機能を導入できるようにしました。
目標
Neovim 上で SATySFi の編集環境を手軽に設定できるようになること
説明しないこと
Language server protocol や tree-sitter 自体の説明はこの記事では行いません。参考記事をいくつか挙げますのでそちらをご参照ください。
つくったもの
Language server および tree-sitter の設定をまとめたものとして次のプラグインを用意しました。
このプラグインを用いることで、nvim-lspconfig
や nvim-treesitter
の標準的なインターフェースで satysfi の language server や tree-sitter parser を扱えるようになります。
またsatysfi-language-server
のインストールも、 neovim でよく使われる language server 系のパッケージマネージャである mason.nvim
経由で行えると便利だろうということで、次のレジストリを用意しました。
こちらは手元にソースをもってくる必要はありませんが、mason.nvim
の設定でレジストリとして追加することで satysfi-language-parser
のインストールが行えるようになります。
設定方法
インストール方法については使用しているプラグインマネージャに合わせて置きかえてください。ここでは lazy.nvim
を例にします。
最低限の設定なら以下で十分です。
require("lazy").setup({
"neovim/nvim-lspconfig",
{ "nvim-treesitter/nvim-treesitter", build = ":TSUpdate"},
"sankantsu/satysfi.nvim",
})
require("satysfi-nvim").setup()
require("lspconfig").satysfi_ls.setup {}
この時点で、以下は達成されます。
-
satysfi-language-server
が (PATH が通っている場所に) インストール済みであれば、SATySFi のファイル (*.saty
等) 編集時に自動で立ちあがるようになる。 -
:TSInstall satysfi
で SATySFi の tree-sitter parser がインストールできる。
mason.nvim
経由で satysfi-language-parser
をインストールしたい場合は次を設定してください。
require("lazy").setup({
-- (略)
"williamboman/mason.nvim",
})
require("mason").setup {
registries = {
"github:sankantsu/satysfi-mason-registry",
"github:mason-org/mason-registry",
},
}
このようにレジストリを追加することで :Mason
で表示される一覧などに satysfi-language-server
が出てくるようになります。
さらに設定に mason-lspconfig
を用いている場合であれば、ensure_installed
や automatic server setup の機能と連携できます。
以上をもとに全体をまとめた設定の一例を示しますのでご参考にどうぞ。
設定例のまとめ
-- プラグインのインストール (使っているプラグインマネージャごとに変更)
require("lazy").setup({
"neovim/nvim-lspconfig",
{ "nvim-treesitter/nvim-treesitter", build = ":TSUpdate"},
"williamboman/mason.nvim",
"williamboman/mason-lspconfig.nvim",
"sankantsu/satysfi.nvim",
})
-- satysfi 用の lspconfig および tree-sitter の設定を登録
require("satysfi-nvim").setup()
-- mason の satysfi-language-server 用のレジストリを追加
require("mason").setup {
registries = {
"github:sankantsu/satysfi-mason-registry",
"github:mason-org/mason-registry",
},
}
-- satysfi-language-server が必ずインストールされるようにする。
require('mason-lspconfig').setup {
ensure_installed = { "satysfi_ls", },
}
-- language server の自動セットアップ (satysfi_ls も勝手に setup される)
require('mason-lspconfig').setup_handlers({ function(server)
require('lspconfig')[server].setup {}
end })
-- treesitter
-- tree-sitter-satysfi を必ず install + syntax highlight を有効化
require("nvim-treesitter.configs").setup {
ensure_installed = {
"satysfi",
},
highlight = {
enable = true,
},
}
おわりに
本記事では Neovim 上で SATySFi の執筆環境を簡単に整えるためのプラグインの紹介と設定方法の説明をしました。これをきっかけに SATySFi がもっと手軽に使えるようになって利用が広がると良いなと思います!
参考記事
monaqa さんによる satysfi-language-parser
の紹介記事です。
LSP 自体について基礎的な部分についてはこちらの記事を以前書きました。
LSP の一般的な設定方法についてはこちらなどをご参照ください。
Treesitter まわりについては以下の2記事を挙げておきます。
追記: (Neovim ではない) Vim 向けの設定について
Vim 向けには以下のプラグインがあります (Neovim でも使えます)。こちらは syntax highlight を tree-sitter ではなく vim の正規表現ベースの機能で実現しています。Vim では tree-sitter サポートがないのでこちらを利用すると良いでしょう。
Discussion