diff --git a/lua/custom/keymaps.lua b/lua/custom/keymaps.lua index 46a8e101..d24be166 100644 --- a/lua/custom/keymaps.lua +++ b/lua/custom/keymaps.lua @@ -20,6 +20,7 @@ vim.keymap.set('n', '', '', { desc = 'Move focus to the lower win vim.keymap.set('n', '', '', { desc = 'Move focus to the upper window' }) -- Add any other general-purpose keymaps you want here +vim.keymap.set('n', ' -- Standard practice for Lua modules that don't need to return complex data return {} diff --git a/lua/custom/plugins/debug.lua b/lua/custom/plugins/debug.lua index 941cc268..0a121dd7 100644 --- a/lua/custom/plugins/debug.lua +++ b/lua/custom/plugins/debug.lua @@ -74,7 +74,8 @@ return { type = 'lldb', request = 'launch', program = function() - return require('custom.utils').pick_executable(vim.fn.getcwd() .. '/build') + local target = require('custom.target'):get_target() + return require('custom.utils').pick_executable(vim.fn.getcwd() .. / .. target) end, cwd = '${workspaceFolder}', stopOnEntry = false, diff --git a/lua/custom/plugins/lsp.lua b/lua/custom/plugins/lsp.lua index df0a4317..71ddae6c 100644 --- a/lua/custom/plugins/lsp.lua +++ b/lua/custom/plugins/lsp.lua @@ -13,8 +13,6 @@ return { 'hrsh7th/cmp-nvim-lsp', -- LSP completion source for nvim-cmp }, config = function(_, opts) - -- local query_driver = vim.fn.trim(vim.fn.system 'which clang++') - -- local resource_dir = vim.fn.trim(vim.fn.system 'clang++ --print-resource-dir') -- This config function runs AFTER the plugin and its dependencies are loaded. -- It sets up the LSP servers. @@ -23,6 +21,8 @@ return { -- Define the list of LSP servers you want to configure. -- These servers must be installed via Nix/Home Manager and be in your PATH. + local utils = require 'custom.utils' + local target = utils:get_target() local servers = { lua_ls = { -- cmd = { ... } @@ -38,12 +38,7 @@ return { }, }, clangd = { - cmd = { - 'clangd', - '--compile-commands-dir=build/debug', - '--query-driver=' .. vim.fn.trim(vim.fn.system 'which clang++'), - '--resource-dir=' .. vim.fn.trim(vim.fn.system 'clang++ --print-resource-dir'), - }, + cmd = utils.make_clangd_cmd(target), filetypes = { 'c', 'cpp', 'objc', 'objcpp', 'cuda' }, root_dir = require('lspconfig.util').root_pattern('CMakeLists.txt', '.git'), }, diff --git a/lua/custom/utils.lua b/lua/custom/utils.lua index 9c62984a..18a8aba8 100644 --- a/lua/custom/utils.lua +++ b/lua/custom/utils.lua @@ -66,4 +66,60 @@ end return { pick_executable = pick_executable, + clangd_base_cmd = { + 'clangd', + '--background-index', + '--clang-tidy', + '--header-insertion=never', + '--query-driver=' .. vim.fn.trim(vim.fn.system 'which clang++'), + '--resource-dir=' .. vim.fn.trim(vim.fn.system 'clang++ --print-resource-dir'), + }, + + make_clangd_cmd = function(self, compile_commands_dir) + local cmd = vim.deepcopy(self.clangd_base_cmd) + table.insert(cmd, '--compile-commands-dir=' .. compile_commands_dir) + return cmd + end, + + find_targets = function() + return vim.fn.systemlist 'fd -u compile_commands.json -x dirname {}' + end, + + get_target = function(self) + return vim.g.current_target_dir or 'build/debug' + end, + + set_target = function(self, dir) + vim.g.current_target_dir = dir + self:reload_clangd() + end, + + pick_target = function(self) + local targets = self.find_targets() + if vim.tbl_isempty(targets) then + vim.notify('No build targets found.', vim.log.WARN) + return + end + vim.ui.select(targets, { prompt = 'Select build target:' }, function(choice) + if choice then + self:set_target(choice) + end + end) + end, + + reload_clangd = function(self) + local lspconfig = require 'lspconfig' + local clients = vim.lsp.get_active_clients { name = 'clangd' } + + for _, cliet in ipairs(clients) do + client.stop() + end + + vim.defer_fn(function() + lspconfig.clangd.setup { + cmd = self:make_clangd_cmd(self:get_target()), + } + vim.cmd 'edit' + end, 200) + end, }