Name every augroup vim_lsp_settings_<file name> so that names are
namespaced to this plugin and unique per file. This also fixes
lsp_install_yaml being shared by aws-lsp-yaml.vim and
yaml-language-server.vim, and lsp_install_json by json-languageserver.vim
and vscode-json-language-server.vim, where the second au! wiped the
first file's autocmds. The empty clearing group in rust-analyzer.vim is
renamed with a _commands suffix instead of being merged into the main
group, since clearing that would also remove its lsp_buffer_enabled
autocmd.
The augroup/au! wrapper was needed when registration was done with
':autocmd User lsp_setup', to avoid stacking duplicate autocmds on
re-source. Now that registration is a plain function call, augroup has
no effect on it. Drop the wrapper where it only enclosed the
registration, and keep augroups only around real autocmds, moving the
registration call out in front of them (the original order, call then
autocmd, is preserved).
The LspRegisterServer user command was introduced to hide the
version-dependent ':autocmd User lsp_setup ++once' boilerplate (#7),
but registration has been immediate since loading became lazy per
filetype. A user command's argument is evaluated in the script context
where the command was defined, so settings files could not use
script-local helpers. Calling the function directly evaluates the
argument in each settings file's own context, which allows the global
Vim_lsp_settings_* helper functions to become script-local. The
LspRegisterServer command itself is kept for backward compatibility.
Add lsp_settings#filetype_servers(), lsp_settings#server_info() and
lsp_settings#server_command(). server_info() sources the settings file
in capture mode so that LspRegisterServer hands back the server
information instead of registering it to vim-lsp.
Replaces releases/latest/download/... with releases/download/$version/...
for 19 installers (38 files) so each script has an extractable version=
or set VERSION= line that update-installer-versions.sh can rewrite.
Drive-by fixes folded in:
- install-markdown-oxide.cmd pointed at atusy/markdown-oxide (404). Repointed
to Feel-ix-343/markdown-oxide upstream which does publish a Windows binary.
- install-systemd-lsp.{sh,cmd} had v2025.07.10 hardcoded mid-URL; pinned to
current latest v2026.04.21.
- install-typos-lsp.{sh,cmd} dropped the curl-redirect-to-learn-the-version
dance in favor of a pinned tag.
- install-omnisharp-lsp.{sh,cmd}: the script's local 'version' (dotnet --version
output) was renamed to 'dotnet_version' so the pinned release version can
coexist without shadowing.
biome and oxlint are left unchanged: biome's tag (@biomejs/biome@X.Y.Z) needs
URL encoding, and oxc-project/oxc publishes parallel apps_v*/crates_v* streams
where releases/latest is ambiguous. Both would need ad-hoc handling.
The old script looped through LLVM 9-15 trying clang+llvm-X-pc-linux-gnu.tar.xz
asset names that no longer exist. Replaced with a pinned version variable
($version=22.1.6) and the modern LLVM-{version}-Linux-{ARCH}.tar.xz /
LLVM-{version}-macOS-ARM64.tar.xz asset names. Now also recognized by
update-installer-versions.sh.
The requires warning (e.g. "cl-lsp requires ros") was shown when
opening a file even if the server was not explicitly requested.
Now the warning is only shown when a server name is explicitly
specified (e.g. :LspInstallServer cl-lsp).
Replace inline has('win32') + substitute(path, '/', '\', 'g') pattern
with a single helper function. Keep paths as '/' internally in
servers_dir() and global_settings_dir() to avoid mixed separators
when concatenating, and normalize only at external boundaries.
- s:is_server_disabled() for disabled check
- s:is_server_filtered_by_default() for default filetype check
- s:has_missing_requires() for requirements check
- s:installer_path() for installer script path construction
Reduces duplication across s:vim_lsp_installer(),
s:vim_lsp_load_or_suggest(), and lsp_settings#complete_install().