diff --git a/init.lua b/init.lua index fbe0eb34..7537f3f5 100644 --- a/init.lua +++ b/init.lua @@ -91,12 +91,13 @@ require('lazy').setup({ end, dependencies = { -- Automatically install LSPs to stdpath for neovim - { 'williamboman/mason.nvim', config = true }, + { 'williamboman/mason.nvim', config = true }, 'williamboman/mason-lspconfig.nvim', + { "WhoIsSethDaniel/mason-tool-installer.nvim" }, -- Useful status updates for LSP -- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})` - { 'j-hui/fidget.nvim', tag = 'legacy', opts = {} }, + { 'j-hui/fidget.nvim', tag = 'legacy', opts = {} }, -- Additional lua configuration, makes nvim stuff amazing! 'folke/neodev.nvim', @@ -332,7 +333,8 @@ vim.keymap.set('n', 'sd', require('telescope.builtin').diagnostics, { de -- 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', 'javascript', 'typescript', 'vimdoc', 'vim' }, + ensure_installed = { 'bicep', 'c', 'cpp', 'go', 'lua', 'python', 'rust', 'tsx', 'javascript', 'typescript', 'vimdoc', + 'vim' }, -- Autoinstall languages that are not installed. Defaults to false (but you can change for yourself!) auto_install = false, @@ -456,10 +458,11 @@ end -- -- If you want to override the default filetypes that your language server will attach to you can -- define the property 'filetypes' to the map in question. +-- URL: https://github.com/williamboman/mason-lspconfig.nvim/blob/main/doc/server-mapping.md local servers = { ansiblels = {}, azure_pipelines_ls = {}, - bashls = {}, + bashls = { auto_update = true }, bicep = {}, clangd = {}, dockerls = {}, @@ -468,7 +471,6 @@ local servers = { gopls = {}, helm_ls = {}, html = { filetypes = { 'html', 'twig', 'hbs' } }, - jedi_language_server = {}, jqls = {}, jsonls = {}, lua_ls = { @@ -478,16 +480,89 @@ local servers = { }, }, powershell_es = {}, - pylsp = {}, - pyright = {}, - ruff_lsp = {}, + pyright = { + python = { + analysis = { + autoSearchPaths = true, + diagnosticMode = "workspace", + useLibraryCodeForTypes = true + } + } + }, rust_analyzer = {}, + sourcery = { + init_options = { + --- The Sourcery token for authenticating the user. + --- This is retrieved from the Sourcery website and must be + --- provided by each user. The extension must provide a + --- configuration option for the user to provide this value. + token = io.popen("pass sourcery/token", "r"):read("l"), + + --- The extension's name and version as defined by the extension. + extension_version = 'vim.lsp', + + --- The editor's name and version as defined by the editor. + editor_version = 'vim', + }, + }, terraformls = { filetypes = { 'tf' } }, tflint = { filetypes = { 'tf' } }, tsserver = {}, yamlls = { filetypes = { 'tf' } }, } + +-- Mason tool installer +local installed, MasonToolInstaller = pcall(require, "mason-tool-installer") +if not installed then + vim.notify("Plugin 'mason-tool-installer' not installed ") + return +end + +-- Mason Tool Installer +MasonToolInstaller.setup({ + -- a list of all tools you want to ensure are installed upon + -- start; they should be the names Mason uses for each tool + ensure_installed = { + -- you can turn off/on auto_update per tool + { "ansible-language-server", auto_update = true }, + { "autopep8" }, + { "autopep8", auto_update = true }, + { "azure-pipelines-language-server", auto_update = true }, + { "bash-language-server", auto_update = true }, + { "bicep-lsp", auto_update = true }, + { "black" }, + { "black", auto_update = true }, + { "css-lsp" }, + { "delve", auto_update = true }, + { "docker_compose_language_service", auto_update = true }, + { "dockerfile-language-server", auto_update = true }, + { "editorconfig-checker" }, + { "helm-ls", auto_update = true }, + { "html-lsp" }, + { "html-lsp", auto_update = true }, + { "jason-lsp", auto_update = true }, + { "jq-lsp", auto_update = true }, + { "jsonls" }, + { "lua-language-server", auto_update = true }, + { "powershell-editor-service", auto_update = true }, + { "prettier" }, + { "pyright" }, + { "rust-analyzer" }, + { "sourcery", auto_update = true }, + { "stylua", auto_update = true }, + { "terraform-ls", auto_update = true }, + { "tflint", auto_update = true }, + { "vim-language-server", auto_update = true }, + { "yaml-language-server", auto_update = true }, + }, + + auto_update = false, + run_on_start = true, + start_delay = 3000, -- 3 second delay + debounce_hours = 5, -- at least 5 hours between attempts to install/update +}) + -- Setup neovim lua configuration require('neodev').setup() diff --git a/lua/custom/plugins/filetree.lua b/lua/custom/plugins/filetree.lua index b8f82f1e..d948f66f 100644 --- a/lua/custom/plugins/filetree.lua +++ b/lua/custom/plugins/filetree.lua @@ -1,18 +1,137 @@ --- Unless you are still migrating, remove the deprecated commands from v1.x -vim.cmd([[ let g:neo_tree_remove_legacy_commands = 1 ]]) - return { "nvim-neo-tree/neo-tree.nvim", - version = "*", - dependencies = { - "nvim-lua/plenary.nvim", - "nvim-tree/nvim-web-devicons", -- not strictly required, but recommended - "MunifTanjim/nui.nvim", - }, - config = function () - require('neo-tree').setup {} + dependencies = { "MunifTanjim/nui.nvim" }, + cmd = "Neotree", + init = function() vim.g.neo_tree_remove_legacy_commands = true end, + opts = function() + return { + auto_clean_after_session_restore = true, + close_if_last_window = true, + sources = { "filesystem", "buffers", "git_status" }, + source_selector = { + sources = { + { source = "filesystem", display_name = " 󰉓 Files " }, + { source = "git_status", display_name = " 󰊢 Git " }, + }, + }, + default_component_configs = { + icon = { + folder_empty = "!", + folder_empty_open = "!O", + }, + git_status = { + symbols = { + renamed = "󰁕", + unstaged = "💣", + }, + }, + }, + document_symbols = { + kinds = { + File = { icon = "󰈙", hl = "Tag" }, + Namespace = { icon = "󰌗", hl = "Include" }, + Package = { icon = "󰏖", hl = "Label" }, + Class = { icon = "󰌗", hl = "Include" }, + Property = { icon = "󰆧", hl = "@property" }, + Enum = { icon = "󰒻", hl = "@number" }, + Function = { icon = "󰊕", hl = "Function" }, + String = { icon = "󰀬", hl = "String" }, + Number = { icon = "󰎠", hl = "Number" }, + Array = { icon = "󰅪", hl = "Type" }, + Object = { icon = "󰅩", hl = "Type" }, + Key = { icon = "󰌋", hl = "" }, + Struct = { icon = "󰌗", hl = "Type" }, + Operator = { icon = "󰆕", hl = "Operator" }, + TypeParameter = { icon = "󰊄", hl = "Type" }, + StaticMethod = { icon = '󰠄 ', hl = 'Function' }, + }, + }, + commands = { + parent_or_close = function(state) + local node = state.tree:get_node() + if (node.type == "directory" or node:has_children()) and node:is_expanded() then + state.commands.toggle_node(state) + else + require("neo-tree.ui.renderer").focus_node(state, node:get_parent_id()) + end + end, + child_or_open = function(state) + local node = state.tree:get_node() + if node.type == "directory" or node:has_children() then + if not node:is_expanded() then -- if unexpanded, expand + state.commands.toggle_node(state) + else -- if expanded and has children, seleect the next child + require("neo-tree.ui.renderer").focus_node(state, node:get_child_ids()[1]) + end + else -- if not a directory just open it + state.commands.open(state) + end + end, + copy_selector = function(state) + local node = state.tree:get_node() + local filepath = node:get_id() + local filename = node.name + local modify = vim.fn.fnamemodify + + local results = { + e = { val = modify(filename, ":e"), msg = "Extension only" }, + f = { val = filename, msg = "Filename" }, + F = { val = modify(filename, ":r"), msg = "Filename w/o extension" }, + h = { val = modify(filepath, ":~"), msg = "Path relative to Home" }, + p = { val = modify(filepath, ":."), msg = "Path relative to CWD" }, + P = { val = filepath, msg = "Absolute path" }, + } + + local messages = { + { "\nChoose to copy to clipboard:\n", "Normal" }, + } + for i, result in pairs(results) do + if result.val and result.val ~= "" then + vim.list_extend(messages, { + { ("%s."):format(i), "Identifier" }, + { (" %s: "):format(result.msg) }, + { result.val, "String" }, + { "\n" }, + }) + end + end + vim.api.nvim_echo(messages, false, {}) + local result = results[vim.fn.getcharstr()] + if result and result.val and result.val ~= "" then + vim.fn.setreg("+", result.val) + end + end, + find_in_dir = function(state) + local node = state.tree:get_node() + local path = node:get_id() + require("telescope.builtin").find_files { + cwd = node.type == "directory" and path or vim.fn.fnamemodify(path, ":h"), + } + end, + }, + window = { + width = 30, + mappings = { + [""] = false, -- disable space until we figure out which-key disabling + ["[b"] = "prev_source", + ["]b"] = "next_source", + Y = "copy_selector", + h = "parent_or_close", + l = "child_or_open", + o = "open", + }, + }, + filesystem = { + follow_current_file = true, + hijack_netrw_behavior = "open_current", + use_libuv_file_watcher = true, + }, + event_handlers = { + { + event = "neo_tree_buffer_enter", + handler = function(_) vim.opt_local.signcolumn = "auto" end, + }, + }, + } end, } - --- The line beneath this is called `modeline`. See `:help modeline` --- vim: ts=2 sts=2 sw=2 et diff --git a/lua/kickstart/plugins/autoformat.lua b/lua/kickstart/plugins/autoformat.lua index bc56b15b..7edca774 100644 --- a/lua/kickstart/plugins/autoformat.lua +++ b/lua/kickstart/plugins/autoformat.lua @@ -72,3 +72,5 @@ return { }) end, } +-- The line beneath this is called `modeline`. See `:help modeline` +-- vim: ts=2 sts=2 sw=2 et