diff --git a/lua/cosmic/core/init.lua b/lua/cosmic/core/init.lua index bc09c9f..9f7a246 100644 --- a/lua/cosmic/core/init.lua +++ b/lua/cosmic/core/init.lua @@ -1,6 +1,6 @@ local cosmic_modules = { - 'cosmic.core.pluginsInit', 'cosmic.core.editor', + 'cosmic.core.pluginsInit', 'cosmic.core.commands', 'cosmic.core.mappings', 'cosmic.lsp', diff --git a/lua/cosmic/core/user.lua b/lua/cosmic/core/user.lua index 5c66de6..2907622 100644 --- a/lua/cosmic/core/user.lua +++ b/lua/cosmic/core/user.lua @@ -18,6 +18,8 @@ local default_config = { format_on_save = true, -- true/false or table of filetypes {'.ts', '.js',} format_timeout = 3000, rename_notification = true, + -- table of callbacks pushed via plugins + on_attach_mappings = {}, -- lsp servers that should be installed ensure_installed = { 'astro', @@ -59,6 +61,10 @@ local default_config = { local u = require('cosmic.utils') local config = u.merge(default_config, user_config) +function config.lsp.add_on_attach_mapping(callback) + table.insert(config.lsp.on_attach_mappings, callback) +end + function config.lsp.can_client_format(client) -- formatting enabled by default if server=true if config.lsp.servers[client.name] == true then diff --git a/lua/cosmic/lsp/mappings.lua b/lua/cosmic/lsp/mappings.lua index 981779e..94c2a35 100644 --- a/lua/cosmic/lsp/mappings.lua +++ b/lua/cosmic/lsp/mappings.lua @@ -1,40 +1,38 @@ -local map = require('cosmic.utils').map +local u = require('cosmic.utils') local M = {} -- Mappings. function M.init(client, bufnr) - local function buf_map(mode, lhs, rhs) - map(mode, lhs, rhs, { - buffer = bufnr, - }) - end + local buf_map = u.create_buf_map({ + buffer = bufnr, + noremap = false, + }) - buf_map('n', 'gd', 'lua require("telescope.builtin").lsp_definitions()') + buf_map('n', 'gd', 'lua vim.lsp.buf.definition()') buf_map('n', 'gD', 'lua vim.lsp.buf.declaration()') - buf_map('n', 'gi', 'lua require("telescope.builtin").lsp_implementations()') - buf_map('n', 'gt', 'lua require("telescope.builtin").lsp_type_definitions()') - buf_map('n', 'gr', 'lua require("telescope.builtin").lsp_references()') - buf_map('n', 'gn', 'lua require("cosmic-ui").rename()') + buf_map('n', 'gi', 'lua vim.lsp.buf.implementation()') + buf_map('n', 'gt', 'lua vim.lsp.buf.type_definition()') + buf_map('n', 'gr', 'lua vim.lsp.buf.references()') -- diagnostics buf_map('n', '[g', 'lua vim.diagnostic.goto_prev()') buf_map('n', ']g', 'lua vim.diagnostic.goto_next()') buf_map('n', 'ge', 'lua vim.diagnostic.open_float(nil, { scope = "line", })') - buf_map('n', 'ge', 'Telescope diagnostics bufnr=0') + buf_map('n', 'ge', 'lua vim.diagnostic.open_float(nil, { scope = "buffer", })') -- hover buf_map('n', 'K', 'lua vim.lsp.buf.hover()') -- code actions - buf_map('n', 'ga', 'lua require("cosmic-ui").code_actions()') - buf_map('v', 'ga', 'lua require("cosmic-ui").range_code_actions()') + buf_map('n', 'gn', 'lua vim.lsp.buf.rename()') + buf_map('n', 'ga', 'lua vim.lsp.buf.code_actions()') + buf_map('v', 'ga', 'lua vim.lsp.buf.range_code_actions()') -- formatting buf_map('n', 'gf', 'lua vim.lsp.buf.formatting()') buf_map('v', 'gf', 'lua vim.lsp.buf.range_formatting()') -- lsp workspace - buf_map('n', 'wd', 'Telescope diagnostics') buf_map('n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()') buf_map('n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()') buf_map( @@ -42,13 +40,6 @@ function M.init(client, bufnr) 'wl', 'lua require("cosmic.utils.logger"):log(vim.inspect(vim.lsp.buf.list_workspace_folders()))' ) - - if client.name == 'tsserver' then - -- typescript helpers - buf_map('n', 'gr', ':TSLspRenameFile') - buf_map('n', 'go', ':TSLspOrganize') - buf_map('n', 'gi', ':TSLspImportAll') - end end return M diff --git a/lua/cosmic/lsp/providers/defaults.lua b/lua/cosmic/lsp/providers/defaults.lua index c90a8f8..eaf956f 100644 --- a/lua/cosmic/lsp/providers/defaults.lua +++ b/lua/cosmic/lsp/providers/defaults.lua @@ -38,7 +38,13 @@ function M.on_attach(client, bufnr) end end + -- set up default mappings require('cosmic.lsp.mappings').init(client, bufnr) + + -- set up any additional mappings/overrides from user config + for _, callback in pairs(user_config.lsp.on_attach_mappings) do + callback(client, bufnr) + end end M.capabilities = capabilities diff --git a/lua/cosmic/plugins/cosmic-ui/init.lua b/lua/cosmic/plugins/cosmic-ui/init.lua index 37b7b19..91c66cb 100644 --- a/lua/cosmic/plugins/cosmic-ui/init.lua +++ b/lua/cosmic/plugins/cosmic-ui/init.lua @@ -13,6 +13,17 @@ return { config = function() require('cosmic-ui').setup(u.merge(defaults, user_config.plugins.cosmic_ui or {})) end, + init = function() + user_config.lsp.add_on_attach_mapping(function(client, bufnr) + local buf_map = u.create_buf_map({ + buffer = bufnr, + }) + + buf_map('n', 'gn', 'lua require("cosmic-ui").rename()') + buf_map('n', 'ga', 'lua require("cosmic-ui").code_actions()') + buf_map('v', 'ga', 'lua require("cosmic-ui").range_code_actions()') + end) + end, event = 'VeryLazy', enabled = not vim.tbl_contains(user_config.disable_builtin_plugins, 'cosmic-ui'), } diff --git a/lua/cosmic/plugins/nvim-lsp-ts-utils/init.lua b/lua/cosmic/plugins/nvim-lsp-ts-utils/init.lua index 1c8e17e..c225f4a 100644 --- a/lua/cosmic/plugins/nvim-lsp-ts-utils/init.lua +++ b/lua/cosmic/plugins/nvim-lsp-ts-utils/init.lua @@ -1,6 +1,20 @@ local user_config = require('cosmic.core.user') +local u = require('cosmic.utils') return { 'jose-elias-alvarez/nvim-lsp-ts-utils', + init = function() + user_config.lsp.add_on_attach_mapping(function(client, bufnr) + if client.name == 'tsserver' then + local buf_map = u.create_buf_map({ + buffer = bufnr, + }) + -- typescript helpers + buf_map('n', 'gr', ':TSLspRenameFile') + buf_map('n', 'go', ':TSLspOrganize') + buf_map('n', 'gi', ':TSLspImportAll') + end + end) + end, enabled = not vim.tbl_contains(user_config.disable_builtin_plugins, 'nvim-lsp-ts-utils'), } diff --git a/lua/cosmic/plugins/telescope/init.lua b/lua/cosmic/plugins/telescope/init.lua index 0a0b529..8bcca30 100644 --- a/lua/cosmic/plugins/telescope/init.lua +++ b/lua/cosmic/plugins/telescope/init.lua @@ -13,7 +13,24 @@ return { require('cosmic.plugins.telescope.config') end, init = function() + -- normal mappings require('cosmic.plugins.telescope.mappings').init() + + user_config.lsp.add_on_attach_mapping(function(client, bufnr) + local map = require('cosmic.utils').map + local function buf_map(mode, lhs, rhs) + map(mode, lhs, rhs, { + buffer = bufnr, + }) + end + + buf_map('n', 'gd', 'Telescope lsp_definitions') + buf_map('n', 'gi', 'Telescope lsp_implementations') + buf_map('n', 'gt', 'Telescope lsp_type_definitions') + buf_map('n', 'gr', 'Telescope lsp_references') + buf_map('n', 'ge', 'Telescope diagnostics bufnr=0') + buf_map('n', 'wd', 'Telescope diagnostics') + end) end, cmd = { 'Telescope' }, keys = { diff --git a/lua/cosmic/utils/init.lua b/lua/cosmic/utils/init.lua index 11e9211..894acb9 100644 --- a/lua/cosmic/utils/init.lua +++ b/lua/cosmic/utils/init.lua @@ -8,6 +8,12 @@ function M.map(mode, lhs, rhs, opts) vim.keymap.set(mode, lhs, rhs, M.merge(defaults, opts or {})) end +function M.create_buf_map(opts) + return function(mode, lhs, rhs) + M.map(mode, lhs, rhs, opts or {}) + end +end + function M.merge_list(tbl1, tbl2) for _, v in ipairs(tbl2) do table.insert(tbl1, v)