From 39dfc1554a1a352a1da6ba8c5a67a802ebf0e1cd Mon Sep 17 00:00:00 2001 From: juanmagalhaes Date: Wed, 16 Aug 2023 00:12:13 -0300 Subject: [PATCH] Better modules --- init.lua | 354 +----------------- .../bootstrap-plugin-manager.lua} | 0 lua/core/keymaps/async/language-servers.lua | 38 ++ lua/core/keymaps/async/tsserver.lua | 8 + lua/core/keymaps/diagnostics.lua | 0 lua/core/keymaps/file-search.lua | 16 + lua/core/keymaps/general.lua | 37 ++ lua/core/keymaps/init.lua | 6 + lua/core/keymaps/project-tree.lua | 4 + lua/{ => core}/plugins/init.lua | 23 +- lua/{ => core}/plugins/neo-tree.lua | 0 lua/{ => core}/plugins/nvim-ufo.lua | 0 lua/{ => core}/plugins/todo-comments.lua | 0 .../settings/init.lua} | 6 +- lua/core/setup/completion-engine.lua | 48 +++ lua/core/setup/file-search.lua | 18 + lua/core/setup/init.lua | 6 + lua/core/setup/language-servers.lua | 81 ++++ lua/core/setup/syntax-highlight.lua | 67 ++++ lua/core/utils.lua | 24 ++ lua/custom/plugins/init.lua | 5 - 21 files changed, 368 insertions(+), 373 deletions(-) rename lua/{lazy-bootstrap.lua => core/bootstrap-plugin-manager.lua} (100%) create mode 100644 lua/core/keymaps/async/language-servers.lua create mode 100644 lua/core/keymaps/async/tsserver.lua create mode 100644 lua/core/keymaps/diagnostics.lua create mode 100644 lua/core/keymaps/file-search.lua create mode 100644 lua/core/keymaps/general.lua create mode 100644 lua/core/keymaps/init.lua create mode 100644 lua/core/keymaps/project-tree.lua rename lua/{ => core}/plugins/init.lua (79%) rename lua/{ => core}/plugins/neo-tree.lua (100%) rename lua/{ => core}/plugins/nvim-ufo.lua (100%) rename lua/{ => core}/plugins/todo-comments.lua (100%) rename lua/{editor-settings.lua => core/settings/init.lua} (90%) create mode 100644 lua/core/setup/completion-engine.lua create mode 100644 lua/core/setup/file-search.lua create mode 100644 lua/core/setup/init.lua create mode 100644 lua/core/setup/language-servers.lua create mode 100644 lua/core/setup/syntax-highlight.lua create mode 100644 lua/core/utils.lua delete mode 100644 lua/custom/plugins/init.lua diff --git a/init.lua b/init.lua index 90de62df..2aa02e96 100644 --- a/init.lua +++ b/init.lua @@ -1,355 +1,13 @@ -- Lua quick doc reference https://learnxinyminutes.com/docs/lua/ --- Set as the leader key --- See `:help mapleader` --- NOTE: Must happen before plugins are required (otherwise wrong leader will be used) -vim.g.mapleader = ' ' -vim.g.maplocalleader = ' ' +require "core.settings" --- Bootsraping plugin manager -require "lazy-bootstrap" +-- Bootsrap plugin manager +require "core.bootstrap-plugin-manager" --- Declare and setup plugins -require "plugins" - -require "editor-settings" - --- [[ Basic Keymaps ]] - --- Keymaps for better default experience --- See `:help vim.keymap.set()` -vim.keymap.set({ 'n', 'v' }, '', '', { silent = true }) - --- Remap for dealing with word wrap -vim.keymap.set('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true }) -vim.keymap.set('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true }) - --- Stop yanking on paste -vim.keymap.set('x', 'p', 'P') - --- [[ Highlight on yank ]] --- See `:help vim.highlight.on_yank()` -local highlight_group = vim.api.nvim_create_augroup('YankHighlight', { clear = true }) -vim.api.nvim_create_autocmd('TextYankPost', { - callback = function() - vim.highlight.on_yank() - end, - group = highlight_group, - pattern = '*', -}) - --- Esc functionality -vim.keymap.set("n", "", function() - -- Clear terminal notification below - vim.notify("") - -- Removes highlight search - vim.cmd.noh() - - vim.cmd(':silent! Neotree cancel') -end, { silent = true }) - --- Split resize -vim.keymap.set('n', '', ':res +1', { desc = 'Resize split' }) -vim.keymap.set('n', '', ':res -1', { desc = 'Resize split' }) -vim.keymap.set('n', '', ':vertical res -1', { desc = 'Resize split vertically' }) -vim.keymap.set('n', '', ':vertical res +1', { desc = 'Resize split vertically' }) - --- Neotree mappings - -vim.keymap.set('n', '', ':Neotree toggle', { desc = 'File tree' }) -vim.keymap.set('n', 'nf', ':Neotree filesystem reveal', { desc = 'Reveal in file tree' }) - --- [[ Configure Telescope ]] --- See `:help telescope` and `:help telescope.setup()` -require('telescope').setup { - defaults = { - mappings = { - i = { - [''] = false, - [''] = false, - }, - }, - }, -} - --- Enable telescope fzf native, if installed -pcall(require('telescope').load_extension, 'fzf') - --- See `:help telescope.builtin` - --- vim.keymap.set('n', '?', require('telescope.builtin').oldfiles, { desc = '[?] Find recently opened files' }) - -local function fuzzyFindFiles() - require('telescope.builtin').grep_string({ - path_display = { 'smart' }, - only_sort_text = true, - word_match = "-w", - search = '', - }) -end - -vim.keymap.set('n', '', require('telescope.builtin').git_files, { desc = 'Search [G]it [F]iles' }) -vim.keymap.set('n', 'K', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' }) -vim.keymap.set('n', '', fuzzyFindFiles, { desc = '[S]earch by [G]rep' }) -vim.keymap.set('n', '', require('telescope.builtin').live_grep, { desc = '[S]earch Live Exact Match' }) -vim.keymap.set('n', 'sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' }) -vim.keymap.set('n', 'sf', require('telescope.builtin').find_files, { desc = '[S]earch [F]iles' }) -vim.keymap.set('n', 'sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' }) - --- Neotree - --- local nvim_tree = require("nvim-tree") - --- vim.keymap.set('n', '', nvim_tree.toggle, { desc = '(nvim-tree) File tree' }) - --- [[ Configure Treesitter ]] --- See `:help nvim-treesitter` -require('nvim-treesitter.configs').setup { - -- Add languages to be installed here that you want installed for treesitter - ensure_installed = { 'c', 'cpp', 'go', 'lua', 'python', 'rust', 'tsx', 'typescript', 'javascript', 'vimdoc', 'vim' }, - - -- Autoinstall languages that are not installed. Defaults to false (but you can change for yourself!) - auto_install = false, - - highlight = { enable = true }, - indent = { enable = true }, - incremental_selection = { - enable = true, - keymaps = { - init_selection = '', - node_incremental = '', - scope_incremental = '', - node_decremental = '', - }, - }, - textobjects = { - select = { - enable = true, - lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim - keymaps = { - -- You can use the capture groups defined in textobjects.scm - ['aa'] = '@parameter.outer', - ['ia'] = '@parameter.inner', - ['af'] = '@function.outer', - ['if'] = '@function.inner', - ['ac'] = '@class.outer', - ['ic'] = '@class.inner', - }, - }, - move = { - enable = true, - set_jumps = true, -- whether to set jumps in the jumplist - goto_next_start = { - [']m'] = '@function.outer', - [']]'] = '@class.outer', - }, - goto_next_end = { - [']M'] = '@function.outer', - [']['] = '@class.outer', - }, - goto_previous_start = { - ['[m'] = '@function.outer', - ['[['] = '@class.outer', - }, - goto_previous_end = { - ['[M'] = '@function.outer', - ['[]'] = '@class.outer', - }, - }, - swap = { - enable = true, - swap_next = { - ['a'] = '@parameter.inner', - }, - swap_previous = { - ['A'] = '@parameter.inner', - }, - }, - }, -} - --- Diagnostic keymaps -vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Go to previous diagnostic message' }) -vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Go to next diagnostic message' }) -vim.keymap.set('n', 'e', vim.diagnostic.open_float, { desc = 'Open floating diagnostic message' }) -vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = 'Open diagnostics list' }) - --- Tsserver run organize imports command -local function organize_imports() - local params = { - command = "_typescript.organizeImports", - arguments = { vim.api.nvim_buf_get_name(0) }, - title = "" - } - vim.lsp.buf.execute_command(params) -end - --- [[ Configure LSP ]] --- This function gets run when an LSP connects to a particular buffer. -local on_attach = function(_, bufnr) - -- NOTE: Remember that lua is a real programming language, and as such it is possible - -- to define small helper and utility functions so you don't have to repeat yourself - -- many times. - -- - -- In this case, we create a function that lets us more easily define mappings specific - -- for LSP related items. It sets the mode, buffer and description for us each time. - local nmap = function(keys, func, desc) - if desc then - desc = 'LSP: ' .. desc - end - - vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc }) - end - - nmap('rn', vim.lsp.buf.rename, '[R]e[n]ame') - nmap('ca', vim.lsp.buf.code_action, '[C]ode [A]ction') - - nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition') - nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences') - nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation') - nmap('D', vim.lsp.buf.type_definition, 'Type [D]efinition') - nmap('ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') - nmap('ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') - - -- See `:help K` for why this keymap - nmap('M', vim.lsp.buf.hover, 'Hover Documentation') - nmap('', vim.lsp.buf.signature_help, 'Signature Documentation') - - -- Lesser used LSP functionality - nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') - nmap('wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder') - nmap('wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder') - nmap('wl', function() - print(vim.inspect(vim.lsp.buf.list_workspace_folders())) - end, '[W]orkspace [L]ist Folders') - - - -- tsserver organize imports - nmap('oi', organize_imports, 'OrganizeImports') - - -- nvim-ufo mappings - nmap("zR", require("ufo").openAllFolds, "Open All Folds") - nmap("zM", require("ufo").closeAllFolds, "Close All Folds") - nmap("zj", function() - local winid = require("ufo").peekFoldedLinesUnderCursor() - if not winid then - vim.lsp.buf.hover() - end - end, "Peek At Current Fold") - - -- Create a command `:Format` local to the LSP buffer - vim.api.nvim_buf_create_user_command(bufnr, 'Format', function() - vim.lsp.buf.format() - end, { desc = 'Format current buffer with LSP' }) -end - --- Enable the following language servers --- Feel free to add/remove any LSPs that you want here. They will automatically be installed. --- --- Add any additional override configuration in the following tables. They will be passed to --- the `settings` field of the server config. You must look up that documentation yourself. -local servers = { - -- clangd = {}, - -- gopls = {}, - -- pyright = {}, - -- rust_analyzer = {}, - tsserver = {}, - - lua_ls = { - Lua = { - workspace = { checkThirdParty = false }, - telemetry = { enable = false }, - }, - }, -} - --- Setup neovim lua configuration -require('neodev').setup() - --- nvim-cmp supports additional completion capabilities, so broadcast that to servers -local capabilities = vim.lsp.protocol.make_client_capabilities() -capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) - --- Ensure the servers above are installed -local mason_lspconfig = require 'mason-lspconfig' - -mason_lspconfig.setup { - ensure_installed = vim.tbl_keys(servers), -} - -mason_lspconfig.setup_handlers { - function(server_name) - require('lspconfig')[server_name].setup { - capabilities = capabilities, - on_attach = on_attach, - settings = servers[server_name], - } - end, -} - -require('lspconfig').tsserver.setup { - on_attach = on_attach, - capabilities = capabilities, - init_options = { - preferences = { - disableSuggestions = true - } - }, - commands = { - OrganizeImports = { - organize_imports, - description = "Organize Imports" - } - } -} - --- [[ Configure nvim-cmp ]] --- See `:help cmp` -local cmp = require 'cmp' -local luasnip = require 'luasnip' -require('luasnip.loaders.from_vscode').lazy_load() -luasnip.config.setup {} - -cmp.setup { - snippet = { - expand = function(args) - luasnip.lsp_expand(args.body) - end, - }, - mapping = cmp.mapping.preset.insert { - [''] = cmp.mapping.select_next_item(), - [''] = cmp.mapping.select_prev_item(), - [''] = cmp.mapping.scroll_docs(-4), - [''] = cmp.mapping.scroll_docs(4), - [''] = cmp.mapping.complete {}, - [''] = cmp.mapping.confirm { - behavior = cmp.ConfirmBehavior.Replace, - select = true, - }, - [''] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_next_item() - elseif luasnip.expand_or_locally_jumpable() then - luasnip.expand_or_jump() - else - fallback() - end - end, { 'i', 's' }), - [''] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_prev_item() - elseif luasnip.locally_jumpable(-1) then - luasnip.jump(-1) - else - fallback() - end - end, { 'i', 's' }), - }, - sources = { - { name = 'nvim_lsp' }, - { name = 'luasnip' }, - }, -} +require "core.plugins" +require "core.keymaps" +require "core.setup" -- The line beneath this is called `modeline`. See `:help modeline` -- vim: ts=2 sts=2 sw=2 et diff --git a/lua/lazy-bootstrap.lua b/lua/core/bootstrap-plugin-manager.lua similarity index 100% rename from lua/lazy-bootstrap.lua rename to lua/core/bootstrap-plugin-manager.lua diff --git a/lua/core/keymaps/async/language-servers.lua b/lua/core/keymaps/async/language-servers.lua new file mode 100644 index 00000000..134b3de6 --- /dev/null +++ b/lua/core/keymaps/async/language-servers.lua @@ -0,0 +1,38 @@ +return function(buffer) + local nmap = require("core.utils").createNmap({ + buffer = buffer, + desc = 'LSP: ', + }) + + nmap('rn', vim.lsp.buf.rename, '[R]e[n]ame') + nmap('ca', vim.lsp.buf.code_action, '[C]ode [A]ction') + + nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition') + nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences') + nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation') + nmap('D', vim.lsp.buf.type_definition, 'Type [D]efinition') + nmap('ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') + nmap('ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') + + -- See `:help K` for why this keymap + nmap('M', vim.lsp.buf.hover, 'Hover Documentation') + nmap('', vim.lsp.buf.signature_help, 'Signature Documentation') + + -- Lesser used LSP functionality + nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') + nmap('wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder') + nmap('wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder') + nmap('wl', function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, '[W]orkspace [L]ist Folders') + + -- nvim-ufo mappings + nmap("zR", require("ufo").openAllFolds, "Open All Folds") + nmap("zM", require("ufo").closeAllFolds, "Close All Folds") + nmap("zj", function() + local winid = require("ufo").peekFoldedLinesUnderCursor() + if not winid then + vim.lsp.buf.hover() + end + end, "Peek At Current Fold") +end diff --git a/lua/core/keymaps/async/tsserver.lua b/lua/core/keymaps/async/tsserver.lua new file mode 100644 index 00000000..9e267049 --- /dev/null +++ b/lua/core/keymaps/async/tsserver.lua @@ -0,0 +1,8 @@ +return function(buffer, cmds) + local nmap = require("core.utils").createNmap({ + buffer = buffer, + desc = 'LSP: ', + }) + + nmap('oi', cmds.organize_imports, 'OrganizeImports') +end diff --git a/lua/core/keymaps/diagnostics.lua b/lua/core/keymaps/diagnostics.lua new file mode 100644 index 00000000..e69de29b diff --git a/lua/core/keymaps/file-search.lua b/lua/core/keymaps/file-search.lua new file mode 100644 index 00000000..6b4ceeb7 --- /dev/null +++ b/lua/core/keymaps/file-search.lua @@ -0,0 +1,16 @@ +local function fuzzyFindFiles() + require('telescope.builtin').grep_string({ + path_display = { 'smart' }, + only_sort_text = true, + word_match = "-w", + search = '', + }) +end + +vim.keymap.set('n', '', require('telescope.builtin').git_files, { desc = 'Search [G]it [F]iles' }) +vim.keymap.set('n', 'K', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' }) +vim.keymap.set('n', '', fuzzyFindFiles, { desc = '[S]earch by [G]rep' }) +vim.keymap.set('n', '', require('telescope.builtin').live_grep, { desc = '[S]earch Live Exact Match' }) +vim.keymap.set('n', 'sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' }) +vim.keymap.set('n', 'sf', require('telescope.builtin').find_files, { desc = '[S]earch [F]iles' }) +vim.keymap.set('n', 'sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' }) diff --git a/lua/core/keymaps/general.lua b/lua/core/keymaps/general.lua new file mode 100644 index 00000000..7f060618 --- /dev/null +++ b/lua/core/keymaps/general.lua @@ -0,0 +1,37 @@ +-- [[ General Keymaps ]] + +vim.keymap.set({ 'n', 'v' }, '', '', { silent = true }) + +-- Remap for dealing with word wrap +vim.keymap.set('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true }) +vim.keymap.set('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true }) + +-- Stop yanking on paste +vim.keymap.set('x', 'p', 'P') + +-- [[ Highlight on yank ]] +-- See `:help vim.highlight.on_yank()` +local highlight_group = vim.api.nvim_create_augroup('YankHighlight', { clear = true }) +vim.api.nvim_create_autocmd('TextYankPost', { + callback = function() + vim.highlight.on_yank() + end, + group = highlight_group, + pattern = '*', +}) + +-- Esc functionality +vim.keymap.set("n", "", function() + -- Clear terminal notification below + vim.notify("") + -- Removes highlight search + vim.cmd.noh() + + vim.cmd(':silent! Neotree cancel') +end, { silent = true }) + +-- Split resize +vim.keymap.set('n', '', ':res +1', { desc = 'Resize split' }) +vim.keymap.set('n', '', ':res -1', { desc = 'Resize split' }) +vim.keymap.set('n', '', ':vertical res -1', { desc = 'Resize split vertically' }) +vim.keymap.set('n', '', ':vertical res +1', { desc = 'Resize split vertically' }) diff --git a/lua/core/keymaps/init.lua b/lua/core/keymaps/init.lua new file mode 100644 index 00000000..2f3e516c --- /dev/null +++ b/lua/core/keymaps/init.lua @@ -0,0 +1,6 @@ +local import = require('core.utils').createImporter("core.keymaps") + +import('general') +import('project-tree') +import('file-search') +import('diagnostics') diff --git a/lua/core/keymaps/project-tree.lua b/lua/core/keymaps/project-tree.lua new file mode 100644 index 00000000..27484d16 --- /dev/null +++ b/lua/core/keymaps/project-tree.lua @@ -0,0 +1,4 @@ +-- Neotree mappings + +vim.keymap.set('n', '', ':Neotree toggle', { desc = 'File tree' }) +vim.keymap.set('n', 'nf', ':Neotree filesystem reveal', { desc = 'Reveal in file tree' }) diff --git a/lua/plugins/init.lua b/lua/core/plugins/init.lua similarity index 79% rename from lua/plugins/init.lua rename to lua/core/plugins/init.lua index 93476f9c..b5aa71aa 100644 --- a/lua/plugins/init.lua +++ b/lua/core/plugins/init.lua @@ -1,8 +1,5 @@ --- Here is where you install your plugins. --- You can configure plugins using the `config` key. --- --- You can also configure plugins after the setup call, --- as they will be available in your neovim runtime. +-- Plugin declarations + local plugins = { -- :Git/:G 'tpope/vim-fugitive', @@ -23,7 +20,6 @@ local plugins = { 'williamboman/mason-lspconfig.nvim', -- Useful status updates for LSP - -- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})` { 'j-hui/fidget.nvim', tag = 'legacy', @@ -131,22 +127,13 @@ local plugins = { -- require plugins with more complex config - require 'plugins.todo-comments', + require 'core.plugins.todo-comments', - require 'plugins.neo-tree', + require 'core.plugins.neo-tree', - require 'plugins.nvim-ufo', + require 'core.plugins.nvim-ufo', require 'kickstart.plugins.autoformat', - - -- require 'kickstart.plugins.debug', - - -- NOTE: The import below automatically adds your own plugins, configuration, etc from `lua/custom/plugins/*.lua` - -- You can use this folder to prevent any conflicts with this init.lua if you're interested in keeping - -- up-to-date with whatever is in the kickstart repo. - -- - -- For additional information see: https://github.com/folke/lazy.nvim#-structuring-your-plugins - { import = 'custom.plugins' }, } local pluginOptions = {} diff --git a/lua/plugins/neo-tree.lua b/lua/core/plugins/neo-tree.lua similarity index 100% rename from lua/plugins/neo-tree.lua rename to lua/core/plugins/neo-tree.lua diff --git a/lua/plugins/nvim-ufo.lua b/lua/core/plugins/nvim-ufo.lua similarity index 100% rename from lua/plugins/nvim-ufo.lua rename to lua/core/plugins/nvim-ufo.lua diff --git a/lua/plugins/todo-comments.lua b/lua/core/plugins/todo-comments.lua similarity index 100% rename from lua/plugins/todo-comments.lua rename to lua/core/plugins/todo-comments.lua diff --git a/lua/editor-settings.lua b/lua/core/settings/init.lua similarity index 90% rename from lua/editor-settings.lua rename to lua/core/settings/init.lua index 04b935b2..7c9f8c4c 100644 --- a/lua/editor-settings.lua +++ b/lua/core/settings/init.lua @@ -1,6 +1,8 @@ -- [[ Setting options ]] --- See `:help vim.o` --- NOTE: You can change these options as you wish! + +-- Sets as the key +vim.g.mapleader = ' ' +vim.g.maplocalleader = ' ' -- Disale Swap Files vim.opt.swapfile = false diff --git a/lua/core/setup/completion-engine.lua b/lua/core/setup/completion-engine.lua new file mode 100644 index 00000000..58d97381 --- /dev/null +++ b/lua/core/setup/completion-engine.lua @@ -0,0 +1,48 @@ +-- [[ Configure nvim-cmp ]] + +-- See `:help cmp` +local cmp = require 'cmp' +local luasnip = require 'luasnip' +require('luasnip.loaders.from_vscode').lazy_load() +luasnip.config.setup {} + +cmp.setup { + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) + end, + }, + mapping = cmp.mapping.preset.insert { + [''] = cmp.mapping.select_next_item(), + [''] = cmp.mapping.select_prev_item(), + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete {}, + [''] = cmp.mapping.confirm { + behavior = cmp.ConfirmBehavior.Replace, + select = true, + }, + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expand_or_locally_jumpable() then + luasnip.expand_or_jump() + else + fallback() + end + end, { 'i', 's' }), + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.locally_jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, { 'i', 's' }), + }, + sources = { + { name = 'nvim_lsp' }, + { name = 'luasnip' }, + }, +} diff --git a/lua/core/setup/file-search.lua b/lua/core/setup/file-search.lua new file mode 100644 index 00000000..5f5667e6 --- /dev/null +++ b/lua/core/setup/file-search.lua @@ -0,0 +1,18 @@ +-- [[ Configure Telescope ]] + +-- See `:help telescope` and `:help telescope.setup()` +require('telescope').setup { + defaults = { + mappings = { + i = { + [''] = false, + [''] = false, + }, + }, + }, +} + +-- Enable telescope fzf native, if installed +pcall(require('telescope').load_extension, 'fzf') + +-- See `:help telescope.builtin` diff --git a/lua/core/setup/init.lua b/lua/core/setup/init.lua new file mode 100644 index 00000000..69da5ad2 --- /dev/null +++ b/lua/core/setup/init.lua @@ -0,0 +1,6 @@ +local import = require('core.utils').createImporter("core.setup") + +import('file-search') +import('syntax-highlight') +import('language-servers') +import('completion-engine') diff --git a/lua/core/setup/language-servers.lua b/lua/core/setup/language-servers.lua new file mode 100644 index 00000000..7a82b67a --- /dev/null +++ b/lua/core/setup/language-servers.lua @@ -0,0 +1,81 @@ +local servers = { + -- clangd = {}, + -- gopls = {}, + -- pyright = {}, + -- rust_analyzer = {}, + tsserver = {}, + + lua_ls = { + Lua = { + workspace = { checkThirdParty = false }, + telemetry = { enable = false }, + }, + }, +} + +-- Setup neovim lua configuration +require('neodev').setup() + +-- nvim-cmp supports additional completion capabilities, +-- so broadcast that to servers +local capabilities = vim.lsp.protocol.make_client_capabilities() +capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) + +-- Ensure the servers above are installed +local mason_lspconfig = require 'mason-lspconfig' + +mason_lspconfig.setup { + ensure_installed = vim.tbl_keys(servers), +} + +local lspKeymaps = require('core.keymaps.async.language-servers') + +local on_attach = function(_, bufnr) + lspKeymaps(bufnr) +end + +mason_lspconfig.setup_handlers { + function(server_name) + require('lspconfig')[server_name].setup { + capabilities = capabilities, + on_attach = on_attach, + settings = servers[server_name], + } + end, +} + +-- Tsserver run organize imports command +local function organize_imports() + local params = { + command = "_typescript.organizeImports", + arguments = { vim.api.nvim_buf_get_name(0) }, + title = "" + } + vim.lsp.buf.execute_command(params) +end + +local tsserverKeymaps = require('core.keymaps.async.tsserver') + +local tsserver_on_attach = function(_, bufnr) + lspKeymaps(bufnr) + + tsserverKeymaps(bufnr, { + organize_imports = organize_imports + }) +end + +require('lspconfig').tsserver.setup { + on_attach = tsserver_on_attach, + capabilities = capabilities, + init_options = { + preferences = { + disableSuggestions = true + } + }, + commands = { + OrganizeImports = { + organize_imports, + description = "Organize Imports" + } + } +} diff --git a/lua/core/setup/syntax-highlight.lua b/lua/core/setup/syntax-highlight.lua new file mode 100644 index 00000000..9ddc8756 --- /dev/null +++ b/lua/core/setup/syntax-highlight.lua @@ -0,0 +1,67 @@ +-- [[ Configure Treesitter ]] + +-- See `:help nvim-treesitter` +require('nvim-treesitter.configs').setup { + -- Add languages to be installed here that you want installed for treesitter + ensure_installed = { 'c', 'cpp', 'go', 'lua', 'python', 'rust', 'tsx', 'typescript', 'javascript', 'vimdoc', 'vim' }, + + -- Autoinstall languages that are not installed. + -- Defaults to false (but you can change for yourself!) + auto_install = false, + + highlight = { enable = true }, + indent = { enable = true }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = '', + node_incremental = '', + scope_incremental = '', + node_decremental = '', + }, + }, + textobjects = { + select = { + enable = true, + lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim + keymaps = { + -- You can use the capture groups defined in textobjects.scm + ['aa'] = '@parameter.outer', + ['ia'] = '@parameter.inner', + ['af'] = '@function.outer', + ['if'] = '@function.inner', + ['ac'] = '@class.outer', + ['ic'] = '@class.inner', + }, + }, + move = { + enable = true, + set_jumps = true, -- whether to set jumps in the jumplist + goto_next_start = { + [']m'] = '@function.outer', + [']]'] = '@class.outer', + }, + goto_next_end = { + [']M'] = '@function.outer', + [']['] = '@class.outer', + }, + goto_previous_start = { + ['[m'] = '@function.outer', + ['[['] = '@class.outer', + }, + goto_previous_end = { + ['[M'] = '@function.outer', + ['[]'] = '@class.outer', + }, + }, + swap = { + enable = true, + swap_next = { + ['a'] = '@parameter.inner', + }, + swap_previous = { + ['A'] = '@parameter.inner', + }, + }, + }, +} diff --git a/lua/core/utils.lua b/lua/core/utils.lua new file mode 100644 index 00000000..75bc281f --- /dev/null +++ b/lua/core/utils.lua @@ -0,0 +1,24 @@ +local createImporter = function(path) + return function(module) + require(path .. "." .. module) + end +end + +local createNmap = function(opts) + return function(keys, func, _desc) + if opts.desc then + _desc = opts.desc .. _desc + end + + local newOpts = { desc = _desc } + + for k, v in pairs(newOpts) do opts[k] = v end + + vim.keymap.set('n', keys, func, newOpts) + end +end + +return { + createImporter = createImporter, + createNmap = createNmap, +} diff --git a/lua/custom/plugins/init.lua b/lua/custom/plugins/init.lua deleted file mode 100644 index be0eb9d8..00000000 --- a/lua/custom/plugins/init.lua +++ /dev/null @@ -1,5 +0,0 @@ --- You can add your own plugins here or in other files in this directory! --- I promise not to create any merge conflicts in this directory :) --- --- See the kickstart.nvim README for more information -return {}