如何在Neovim LSP的tsserver.setup中配置compilerOptions?
解决Neovim tsserver全局compilerOptions配置与root_dir冲突问题
你的核心问题在于:tsserver会根据root_dir优先查找项目本地的tsconfig.json,当你强制root_dir为项目目录时,它会忽略你在init_options里的无效配置项;而直接加载全局tsconfig又会导致root_dir变为主目录,影响LSP的项目感知能力。
以下是两种可靠的解决方案:
方案一:动态加载全局tsconfig(无本地配置时)
通过on_new_config钩子,在LSP初始化前检查项目目录是否存在本地tsconfig,不存在则指定全局tsconfig路径,同时保持root_dir为项目目录:
local util = require('lspconfig.util') lspconfig.ts_ls.setup({ root_dir = function(fname) -- 优先以.git目录作为项目根,找不到则用当前工作目录 local root = util.root_pattern('.git')(fname) return root or vim.fn.getcwd() end, on_new_config = function(config, root_dir) -- 检查项目根目录下是否有本地tsconfig local local_tsconfig = util.path.join(root_dir, 'tsconfig.json') if not vim.loop.fs_stat(local_tsconfig) then -- 初始化settings结构 config.settings = config.settings or {} config.settings.typescript = config.settings.typescript or {} config.settings.typescript.serverOptions = config.settings.typescript.serverOptions or {} -- 指定全局tsconfig路径 config.settings.typescript.serverOptions.configFile = '/your/home/dir/tsconfig.json' -- 若需支持JS项目,同步配置javascript选项 config.settings.javascript = config.settings.javascript or {} config.settings.javascript.serverOptions = config.settings.javascript.serverOptions or {} config.settings.javascript.serverOptions.configFile = '/your/home/dir/tsconfig.json' end end, })
方案二:直接在LSP配置中定义compilerOptions
如果不想维护全局tsconfig文件,可以直接在configOverrides中写入compilerOptions,同样通过钩子仅在无本地配置时生效:
local util = require('lspconfig.util') lspconfig.ts_ls.setup({ root_dir = function(fname) local root = util.root_pattern('.git')(fname) return root or vim.fn.getcwd() end, on_new_config = function(config, root_dir) local local_tsconfig = util.path.join(root_dir, 'tsconfig.json') if not vim.loop.fs_stat(local_tsconfig) then config.settings = config.settings or {} -- 配置TypeScript的compilerOptions config.settings.typescript = { serverOptions = { configOverrides = { compilerOptions = { baseUrl = "./", moduleResolution = "bundler", allowJs = true, } } } } -- 同步配置JavaScript config.settings.javascript = { serverOptions = { configOverrides = { compilerOptions = { baseUrl = "./", moduleResolution = "bundler", allowJs = true, } } } } end end, })
关键说明
- 你之前使用的
init_options.tsconfig并非ts_ls(原tsserver)的有效配置项,所以会被忽略,正确的配置位置是settings.typescript.serverOptions下的configFile或configOverrides。 - 两种方案都会优先使用项目本地的tsconfig(符合团队开发需求),仅在无本地配置时应用全局/内置的compilerOptions。
root_dir的逻辑保持不变,确保LSP始终以项目目录为根,不会影响其他LSP功能(如代码跳转、诊断范围等)。
内容的提问来源于stack exchange,提问作者Adamson Vispo
相关产品推荐
相关产品推荐

