🚀

Neovim で SATySFi の編集環境を簡単に設定する

2023/12/17に公開

概要

SATySFi は gfngfn 氏が開発されている比較的新しい組版言語で、この分野のデファクトとも言える TeX と比べて型付き言語であることを特徴としています。
型が付いていることで複雑な組版処理に対しても比較的適切なエラーを出力できるようになり、開発者にとっても利用者にとっても体験が良くなります。

この SATySFi という言語について、編集環境を良くするために language servertree-sitter parser がつくられています (どちらも monaqa 氏が開発されています)。
これらを利用することで執筆の最中にシンタックスハイライトやエラー診断による恩恵を受けることができます。

しかし、これらの language server や tree-sitter parser は標準的なプラグインでは設定が提供されていないため、使い始めるためにやや込み入った知識や追加の設定が必要になることが難点です。今回はこの課題を解消するため、設定情報をプラグインとしてまとめることで簡単にこれらの機能を導入できるようにしました。

目標

Neovim 上で SATySFi の編集環境を手軽に設定できるようになること

説明しないこと

Language server protocol や tree-sitter 自体の説明はこの記事では行いません。参考記事をいくつか挙げますのでそちらをご参照ください。

つくったもの

Language server および tree-sitter の設定をまとめたものとして次のプラグインを用意しました。
このプラグインを用いることで、nvim-lspconfignvim-treesitter の標準的なインターフェースで satysfi の language server や tree-sitter parser を扱えるようになります。

https://github.com/sankantsu/satysfi.nvim

またsatysfi-language-server のインストールも、 neovim でよく使われる language server 系のパッケージマネージャである mason.nvim 経由で行えると便利だろうということで、次のレジストリを用意しました。

https://github.com/sankantsu/satysfi-mason-registry

こちらは手元にソースをもってくる必要はありませんが、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 の紹介記事です。

https://zenn.dev/monaqa/articles/2021-12-10-satysfi-language-server

LSP 自体について基礎的な部分についてはこちらの記事を以前書きました。

https://zenn.dev/vim_jp/articles/40b2c348386f88

LSP の一般的な設定方法についてはこちらなどをご参照ください。

https://zenn.dev/nazo6/articles/c2f16b07798bab

Treesitter まわりについては以下の2記事を挙げておきます。

https://zenn.dev/monaqa/articles/2021-12-22-vim-nvim-treesitter-highlight
https://zenn.dev/duglaser/articles/c02d6a937a48df

追記: (Neovim ではない) Vim 向けの設定について

Vim 向けには以下のプラグインがあります (Neovim でも使えます)。こちらは syntax highlight を tree-sitter ではなく vim の正規表現ベースの機能で実現しています。Vim では tree-sitter サポートがないのでこちらを利用すると良いでしょう。

https://github.com/qnighy/satysfi.vim

GitHubで編集を提案

Discussion