aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/lsp.lua
diff options
context:
space:
mode:
authorMichal Liszcz <liszcz.michal@gmail.com>2023-03-09 15:12:56 +0100
committerGitHub <noreply@github.com>2023-03-09 06:12:56 -0800
commit9ef7297ef142354ace8b1f3f277d0eee3cfdc6d4 (patch)
tree317cfc799191e044e1fc9452ef40ca24376fcbb1 /runtime/lua/vim/lsp.lua
parentce0fddf5ae334f0c79dcd95b379999e11df1486b (diff)
downloadrneovim-9ef7297ef142354ace8b1f3f277d0eee3cfdc6d4.tar.gz
rneovim-9ef7297ef142354ace8b1f3f277d0eee3cfdc6d4.tar.bz2
rneovim-9ef7297ef142354ace8b1f3f277d0eee3cfdc6d4.zip
feat(lsp): overwrite omnifunc/tagfunc set by ftplugin #22267
Problem: Some built-in ftplugins set omnifunc/tagfunc/formatexpr which causes lsp.lua:set_defaults() to skip setup of defaults for those filetypes. For example the C++ ftplugin has: omnifunc=ccomplete#Complete Last set from /usr/share/nvim/runtime/ftplugin/c.vim line 30 so the changes done in #95c65a6b221fe6e1cf91e8322e7d7571dc511a71 will always be skipped for C++ files. Solution: Overwrite omnifunc/tagfunc/formatexpr options that were set by stock ftplugin. Fixes #21001
Diffstat (limited to 'runtime/lua/vim/lsp.lua')
-rw-r--r--runtime/lua/vim/lsp.lua32
1 files changed, 28 insertions, 4 deletions
diff --git a/runtime/lua/vim/lsp.lua b/runtime/lua/vim/lsp.lua
index 9a0b3f3100..cb77e9636f 100644
--- a/runtime/lua/vim/lsp.lua
+++ b/runtime/lua/vim/lsp.lua
@@ -1113,18 +1113,42 @@ function lsp.start_client(config)
end
---@private
+ -- Determines whether the given option can be set by `set_defaults`.
+ local function is_empty_or_default(bufnr, option)
+ if vim.bo[bufnr][option] == '' then
+ return true
+ end
+
+ local old_bufnr = vim.fn.bufnr('')
+ local last_set_from = vim.fn.gettext('\n\tLast set from ')
+ local line = vim.fn.gettext(' line ')
+
+ vim.cmd.buffer(bufnr)
+ local scriptname = vim.fn
+ .execute('verbose set ' .. option .. '?')
+ :match(last_set_from .. '(.*)' .. line .. '%d+')
+ vim.cmd.buffer(old_bufnr)
+
+ if not scriptname then
+ return false
+ end
+ local vimruntime = vim.fn.getenv('VIMRUNTIME')
+ return vim.startswith(vim.fn.expand(scriptname), vim.fn.expand(vimruntime))
+ end
+
+ ---@private
local function set_defaults(client, bufnr)
local capabilities = client.server_capabilities
- if capabilities.definitionProvider and vim.bo[bufnr].tagfunc == '' then
+ if capabilities.definitionProvider and is_empty_or_default(bufnr, 'tagfunc') then
vim.bo[bufnr].tagfunc = 'v:lua.vim.lsp.tagfunc'
end
- if capabilities.completionProvider and vim.bo[bufnr].omnifunc == '' then
+ if capabilities.completionProvider and is_empty_or_default(bufnr, 'omnifunc') then
vim.bo[bufnr].omnifunc = 'v:lua.vim.lsp.omnifunc'
end
if
capabilities.documentRangeFormattingProvider
- and vim.bo[bufnr].formatprg == ''
- and vim.bo[bufnr].formatexpr == ''
+ and is_empty_or_default(bufnr, 'formatprg')
+ and is_empty_or_default(bufnr, 'formatexpr')
then
vim.bo[bufnr].formatexpr = 'v:lua.vim.lsp.formatexpr()'
end