Neovim按文件扩展名控制LSP服务,优化代码动作列表
解决方案
一、按文件扩展名精准关联LSP/Null-ls源
不管是LSP服务还是null-ls的诊断、修复源,都可以通过文件类型(扩展名对应的ft)指定加载范围,从根源避免跨类型干扰:
1. LSP服务按需加载
在lspconfig配置中,针对不同文件类型单独设置启动规则:
local lspconfig = require('lspconfig') -- 仅在.js/.jsx/.ts/.tsx文件中启动tsserver lspconfig.tsserver.setup({ filetypes = { "javascript", "javascriptreact", "typescript", "typescriptreact" }, -- 其他自定义配置... }) -- 仅在样式文件中启动stylelint_lsp lspconfig.stylelint_lsp.setup({ filetypes = { "css", "scss", "sass", "less" }, -- 其他自定义配置... })
这样stylelint的LSP就只会在样式文件内运行,不会出现在JSX的代码动作列表里。
2. Null-ls源按需注册
给null-ls的每个源添加condition条件,限制其生效的文件扩展名:
local null_ls = require('null-ls') local utils = require('null-ls.utils') null_ls.setup({ sources = { -- ESLint仅在JS/TS/JSX/TSX文件生效 null_ls.builtins.diagnostics.eslint_d.with({ condition = function() return utils.is_file_in_extensions({ "js", "jsx", "ts", "tsx" }) end }), -- Stylelint仅在样式文件生效 null_ls.builtins.diagnostics.stylelint.with({ condition = function() return utils.is_file_in_extensions({ "css", "scss", "sass" }) end }), -- ESLint修复动作仅在JS/TS/JSX/TSX生效 null_ls.builtins.code_actions.eslint_d.with({ condition = function() return utils.is_file_in_extensions({ "js", "jsx", "ts", "tsx" }) end }) } })
二、解决JSX中useState导入动作不出现的问题
这个问题大多和tsserver的自动导入配置或触发时机有关,试试以下操作:
- 开启tsserver的自动导入提示:
在tsserver的setup配置中添加:
settings = { javascript = { suggest = { autoImports = true } }, typescript = { suggest = { autoImports = true } } }
- 确保光标定位在未导入的
useState标识符上再触发代码动作——tsserver的自动导入动作只会针对未定义的符号生效。 - 暂时禁用其他代码补全类插件(如cmp、LuaSnip),排查是否存在插件冲突。
三、额外优化:手动过滤无关代码动作
如果仍有漏网的无关动作,可以在LSP的on_attach函数中添加过滤逻辑:
local function on_attach(client, bufnr) -- 重写代码动作处理器,过滤指定内容 vim.lsp.handlers['textDocument/codeAction'] = function(err, result, ctx, config) if not result then return end -- 过滤掉标题包含stylelint的动作 local filtered_actions = vim.tbl_filter(function(action) return not string.find(action.title, "stylelint") end, result) -- 调用原处理器返回过滤后的结果 vim.lsp.handlers['textDocument/codeAction'](err, filtered_actions, ctx, config) end end
将这个on_attach函数传入各个LSP的setup配置即可生效。
内容的提问来源于stack exchange,提问作者mr_scrpt
相关产品推荐
相关产品推荐

