📑

nvim-lspでtsconfig.jsonとかの補完をする方法(JSON schema)

1 min read

neovimのbuilt-in lspの話です。lspconfigが入ってるのが前提です。

基本的にはjsonlsの設定で

require("lspconfig")["jsonls"].setup({
    filetypes = {"json", "jsonc"},
    settings = {
        json = {
            schemas = {
                {fileMatch = {"package.json"}, url = "https://json.schemastore.org/package.json"},
                {fileMatch = {"tsconfig*.json"}, url = "https://json.schemastore.org/tsconfig.json"},
            }
        }
    },
})

みたいな感じでつらつらとschemaを探して書いていけばできます。
しかしこれを一々書くのはとても面倒臭いです。そこで上のコードのURLにもあるschemastoreというサイトを使います。
このサイトの

https://www.schemastore.org/api/json/catalog.json
にはまさに上の設定通りのschemaのカタログが用意されており、これを使えたら便利だと思いませんか?
ただ、jsonをパースしてとかやるのも面倒臭いのでTypescriptToLuaというツールを使います。
https://typescripttolua.github.io
ここのplaygroundに先程のカタログのjsonをTypescriptのオブジェクトとして貼り付けると、なんとluaのコードで出力してくれます。あとはそのコードをコピペしてくるだけです。

変換したものを一応gistに用意しておきました。

https://gist.github.com/nazo6/abd12b74d1862e50939049602110c159

このファイルを適当なところに置いて

local catalog_data = require("schema-catalog")
local schemas = catalog_data.schemas

require("lspconfig")["jsonls"].setup({
    filetypes = {"json", "jsonc"},
    settings = {
        json = {
            schemas = schemas
        }
    },
})

みたいな感じにすればこれでほぼ全てのナントカconfigみたいなJSONファイルが補完できるようになります。ドキュメントもあります。

ちなみに自分は普段からTypescriptToLuaを使ってneovimのconfigを書いてるのでそれでこの方法に気づきました。TypesciprtToLuaをローカルにインストールすればjsonファイルをそのまま変換することもできて便利です。