lsp/presets/vue-language-server: init

This commit is contained in:
Snoweuph 2026-04-19 01:23:10 +02:00
commit 4b2c7381a0
No known key found for this signature in database
GPG key ID: BEFC41DA223CEC55
4 changed files with 88 additions and 1 deletions

View file

@ -69,6 +69,7 @@
./vscode-css-language-server.nix
./vscode-json-language-server.nix
./vtsls.nix
./vue-language-server.nix
./wgsl-analyzer.nix
./yaml-language-server.nix
./zls.nix

View file

@ -0,0 +1,82 @@
{
config,
lib,
pkgs,
...
}: let
inherit (lib.meta) getExe;
inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption;
inherit (lib.generators) mkLuaInline;
cfg = config.vim.lsp.presets.vue-language-server;
in {
options.vim.lsp.presets.vue-language-server = {
enable = mkEnableOption ''
the Vue.js Language Server.
This LSP doesn't work standalone and requires either
{option}`vim.lsp.presets.vtsls.enable`
or
{option}`vim.lsp.presets.typescript-language-server.enable`
to work as expected.
Default `filetypes = ${lib.generators.toPretty {} []}`. \
Use {option}`vim.lsp.servers.vue-language-server` for customization
'';
};
config = mkIf cfg.enable {
vim.lsp.servers.vue-language-server = {
enable = true;
cmd = [(getExe pkgs.vue-language-server) "--stdio"];
root_markers = [".git" "tsconfig.json" "package.json"];
on_init =
mkLuaInline
# This LSP doesn't work standalone and requires a TypeScripts LSP to work.
# It can work with `typescript-language-server`, but it is not great, thus we prefer `vtsls`
''
function(client)
retries = 0
local function typescriptHandler(_, result, context)
local function getLSP(name)
return vim.lsp.get_clients({ bufnr = context.bufnr, name = name})[1]
end
local typescipt_lsp = getLSP('vtsls') or getLSP('typescript-language-server')
if not typescipt_lsp then
if retries <= 10 then
retries = retries + 1
vim.defer_fn(function()
typescriptHandler(_, result, context)
end, 100)
else
vim.notify(
'Could not find `vtsls`, `typescript-language-server`, or `typescript-go` lsp, required by `vue-language-server`.',
vim.log.levels.ERROR
)
end
return
end
local param = unpack(result)
local id, command, payload = unpack(param)
typescipt_lsp:exec_cmd({
title = 'vue-language-server-forwarded',
command = 'typescript.tsserverRequest',
arguments = {
command,
payload,
},
}, { bufnr = context.bufnr }, function(_, r)
local response_data = { { id, r and r.body } }
client:notify('tsserver/response', response_data)
end)
end
client.handlers['tsserver/request'] = typescriptHandler
end
'';
};
};
}