You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:57:40