From 196077bea9d7ef4870bb30145103674910b5a6a5 Mon Sep 17 00:00:00 2001 From: Ismo Vuorinen Date: Sat, 19 Apr 2025 04:04:26 +0300 Subject: [PATCH] feat(nvim): reworked lsp, theme, cleanup Signed-off-by: Ismo Vuorinen --- .editorconfig | 2 +- .gitignore | 1 + config/nvim/.editorconfig | 6 +- config/nvim/.stylua.toml | 2 +- config/nvim/ftdetect/env.vim | 2 + config/nvim/init.lua | 7 +- config/nvim/lua/autogroups.lua | 6 +- config/nvim/lua/keymaps.lua | 28 +- config/nvim/lua/nvm-default/init.lua | 6 +- config/nvim/lua/options.lua | 3 + config/nvim/lua/plugins/blink.lua | 24 +- config/nvim/lua/plugins/code.lua | 88 +--- config/nvim/lua/plugins/conform.lua | 66 +++ config/nvim/lua/plugins/folke.lua | 2 +- config/nvim/lua/plugins/lsp.lua | 609 ++++++++++++-------------- config/nvim/lua/plugins/neotree.lua | 4 +- config/nvim/lua/plugins/other.lua | 41 +- config/nvim/lua/plugins/telescope.lua | 67 +-- config/nvim/lua/plugins/ui.lua | 36 +- config/nvim/lua/plugins/wakatime.lua | 4 - config/nvim/syntax/env.vim | 31 ++ config/wezterm/wezterm.lua | 4 +- stylua.toml | 2 +- 23 files changed, 486 insertions(+), 555 deletions(-) create mode 100644 config/nvim/ftdetect/env.vim create mode 100644 config/nvim/lua/plugins/conform.lua delete mode 100644 config/nvim/lua/plugins/wakatime.lua create mode 100644 config/nvim/syntax/env.vim diff --git a/.editorconfig b/.editorconfig index b193834..a9bdb7b 100644 --- a/.editorconfig +++ b/.editorconfig @@ -12,7 +12,7 @@ trim_trailing_whitespace = true max_line_length = 100 [*.lua] -max_line_length = 120 +max_line_length = 90 [*.{php,fish}] indent_size = 4 diff --git a/.gitignore b/.gitignore index 733f0c5..cab5004 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ node_modules ssh/local.d/* !ssh/local.d/.gitkeep config/fish/fish_variables +**/exports.secret.fish **/exports-secret.fish config/fish/completions/asdf.fish config/vim/.netrwhist diff --git a/config/nvim/.editorconfig b/config/nvim/.editorconfig index f68c5b7..be76539 100644 --- a/config/nvim/.editorconfig +++ b/config/nvim/.editorconfig @@ -1,7 +1,7 @@ # EditorConfig is awesome: https://editorconfig.org # top-most EditorConfig file -root = true +root = false [*] end_of_line = lf @@ -18,3 +18,7 @@ trim_trailing_whitespace = false [*.json] max_line_length = off + +[*.lua] +max_line_length = 90 + diff --git a/config/nvim/.stylua.toml b/config/nvim/.stylua.toml index fac487e..db00bc5 100644 --- a/config/nvim/.stylua.toml +++ b/config/nvim/.stylua.toml @@ -1,4 +1,4 @@ -column_width = 80 +column_width = 90 line_endings = "Unix" indent_type = "Spaces" indent_width = 2 diff --git a/config/nvim/ftdetect/env.vim b/config/nvim/ftdetect/env.vim new file mode 100644 index 0000000..2c358c5 --- /dev/null +++ b/config/nvim/ftdetect/env.vim @@ -0,0 +1,2 @@ +autocmd BufRead,BufNewFile *.env set ft=env +autocmd BufRead,BufNewFile *.env.* set ft=env diff --git a/config/nvim/init.lua b/config/nvim/init.lua index ff7ee7c..3b0bf1c 100644 --- a/config/nvim/init.lua +++ b/config/nvim/init.lua @@ -28,10 +28,7 @@ end vim.opt.rtp:prepend(lazypath) -- ── Add ~/.local/bin to the PATH ──────────────────────────────────── -vim.fn.setenv( - 'PATH', - vim.fn.expand '$HOME/.local/bin' .. ':' .. vim.fn.expand '$PATH' -) +vim.fn.setenv('PATH', vim.fn.expand '$HOME/.local/bin' .. ':' .. vim.fn.expand '$PATH') require 'options' require 'autogroups' @@ -68,4 +65,4 @@ require('lazy').setup( require 'keymaps' --- vim: ts=2 sts=2 sw=2 et +-- vim: set ts=2 sts=2 sw=2 wrap et : diff --git a/config/nvim/lua/autogroups.lua b/config/nvim/lua/autogroups.lua index 1052214..85f069a 100644 --- a/config/nvim/lua/autogroups.lua +++ b/config/nvim/lua/autogroups.lua @@ -21,9 +21,7 @@ autocmd({ 'BufEnter', 'BufWinEnter', 'TabEnter' }, { callback = function() local max_line_count = vim.fn.line '$' -- Only adjust if the file is large enough to matter - if max_line_count > 99 then - vim.opt.numberwidth = #tostring(max_line_count) + 1 - end + if max_line_count > 99 then vim.opt.numberwidth = #tostring(max_line_count) + 1 end end, }) @@ -104,5 +102,3 @@ autocmd({ 'BufRead', 'BufNewFile' }, { }, command = 'set filetype=sshconfig', }) - --- vim: ts=2 sts=2 sw=2 et diff --git a/config/nvim/lua/keymaps.lua b/config/nvim/lua/keymaps.lua index 2c55730..a707359 100644 --- a/config/nvim/lua/keymaps.lua +++ b/config/nvim/lua/keymaps.lua @@ -1,5 +1,3 @@ --- vim: set ft=lua ts=2 sw=2 tw=0 et cc=130 : - require 'utils' -- ╭─────────────────────────────────────────────────────────╮ @@ -20,16 +18,8 @@ K.n('+', ':resize +10', { desc = 'H Resize +' }) K.n('=', '=', { desc = 'Equal Size Splits' }) -- ── Deal with word wrap ───────────────────────────────────────────── -K.n( - 'k', - "v:count == 0 ? 'gk' : 'k'", - { desc = 'Move up', noremap = true, expr = true } -) -K.n( - 'j', - "v:count == 0 ? 'gj' : 'j'", - { desc = 'Move down', noremap = true, expr = true } -) +K.n('k', "v:count == 0 ? 'gk' : 'k'", { desc = 'Move up', noremap = true, expr = true }) +K.n('j', "v:count == 0 ? 'gj' : 'j'", { desc = 'Move down', noremap = true, expr = true }) -- ── Text manipulation ─────────────────────────────────────────────── K.d('<', { 'n', 'v' }, 'CBllline', 'CB: Titled Line') -- unless it's a generic operation like searching or finding buffers local fuzzy_search = function() - require('telescope.builtin').find_files( - require('telescope.themes').get_dropdown { - winblend = 20, - previewer = true, - } - ) + require('telescope.builtin').find_files(require('telescope.themes').get_dropdown { + winblend = 20, + previewer = true, + }) end local lazy_plugins = function() @@ -159,9 +147,7 @@ K.nl('tn', ':Noice dismiss', 'Noice: Dismiss Notification') -- Convention is 'q' followed by the operation K.nl('qf', ':q', 'Quicker close split') K.nl('qq', function() - if vim.fn.confirm('Force save and quit?', '&Yes\n&No', 2) == 1 then - vim.cmd 'wq!' - end + if vim.fn.confirm('Force save and quit?', '&Yes\n&No', 2) == 1 then vim.cmd 'wq!' end end, 'Quit with force saving') K.nl('qw', ':wq', 'Write and quit') K.nl('qQ', function() diff --git a/config/nvim/lua/nvm-default/init.lua b/config/nvim/lua/nvm-default/init.lua index 8a4b5d5..a7d7e8b 100644 --- a/config/nvim/lua/nvm-default/init.lua +++ b/config/nvim/lua/nvm-default/init.lua @@ -77,10 +77,8 @@ function M.setup(opts) -- Set vim.g.node_host_prog and vim.g.copilot_node_command local current_nvm_version_path = string.format('%s/versions/node/%s', nvm_path, node_version) - local current_nvm_node_bin_path = - string.format('%s/bin', current_nvm_version_path) - local current_nvm_node_bin = - string.format('%s/node', current_nvm_node_bin_path) + local current_nvm_node_bin_path = string.format('%s/bin', current_nvm_version_path) + local current_nvm_node_bin = string.format('%s/node', current_nvm_node_bin_path) local neovim_node_host_bin_path = string.format('%s/neovim-node-host', current_nvm_node_bin_path) diff --git a/config/nvim/lua/options.lua b/config/nvim/lua/options.lua index d3187bb..4d9cefd 100644 --- a/config/nvim/lua/options.lua +++ b/config/nvim/lua/options.lua @@ -64,4 +64,7 @@ vim.schedule(function() o.clipboard = c end) +-- xiyaowong/transparent.nvim +vim.g.transparent_enabled = true + -- vim: ts=2 sts=2 sw=2 et diff --git a/config/nvim/lua/plugins/blink.lua b/config/nvim/lua/plugins/blink.lua index 63ee59b..4f4342e 100644 --- a/config/nvim/lua/plugins/blink.lua +++ b/config/nvim/lua/plugins/blink.lua @@ -3,7 +3,7 @@ return { -- https:/github.com/saghen/blink.cmp { 'saghen/blink.cmp', - version = '*', + version = '1.*', lazy = false, -- lazy loading handled internally dependencies = { -- Compatibility layer for using nvim-cmp sources on blink.cmp @@ -58,10 +58,10 @@ return { -- 'default' for mappings similar to built-in completion -- 'super-tab' for mappings similar to vscode (tab to accept, arrow keys to navigate) -- 'enter' for mappings similar to 'super-tab' but with 'enter' to accept - -- see the "default configuration" section below for full documentation on how to define - -- your own keymap. + -- see the "default configuration" section below for full documentation on how to + -- define your own keymap. keymap = { - preset = 'super-tab', + preset = 'default', -- Use Ctrl-x to trigger auto completion [''] = { 'show', 'show_documentation', 'hide_documentation' }, }, @@ -86,7 +86,8 @@ return { }, }, documentation = { - auto_show = true, + auto_show = false, + auto_show_delay_ms = 500, }, ghost_text = { enabled = false, @@ -97,12 +98,12 @@ return { -- elsewhere in your config, without redefining it, via `opts_extend` sources = { default = { - 'lazydev', 'lsp', - 'snippets', 'copilot', 'path', + 'snippets', 'buffer', + 'lazydev', }, providers = { copilot = { @@ -118,6 +119,15 @@ return { }, }, + -- Blink.cmp includes an optional, recommended rust fuzzy matcher, + -- which automatically downloads a prebuilt binary when enabled. + -- + -- By default, we use the Lua implementation instead, but you may enable + -- the rust implementation via `'prefer_rust_with_warning'` + -- + -- See :h blink-cmp-config-fuzzy for more information + fuzzy = { implementation = 'lua' }, + -- experimental signature help support signature = { enabled = true }, }, diff --git a/config/nvim/lua/plugins/code.lua b/config/nvim/lua/plugins/code.lua index 31f82af..f6541aa 100644 --- a/config/nvim/lua/plugins/code.lua +++ b/config/nvim/lua/plugins/code.lua @@ -1,17 +1,9 @@ return { - -- A better annotation generator. - -- Supports multiple languages and annotation conventions. - -- https://github.com/danymat/neogen - { - 'danymat/neogen', - version = '*', - opts = { enabled = true, snippet_engine = 'luasnip' }, - }, - -- Terminal manager for (neo)vim -- https://github.com/voldikss/vim-floaterm { 'voldikss/vim-floaterm', + lazy = true, cmd = { 'FloatermToggle' }, init = function() vim.g.floaterm_width = 0.8 @@ -49,34 +41,6 @@ return { end, }, - -- Cloak allows you to overlay *'s over defined patterns in defined files. - -- https://github.com/laytan/cloak.nvim - { - 'laytan/cloak.nvim', - version = '*', - opts = { - enabled = true, - cloak_character = '*', - -- The applied highlight group (colors) on the cloaking, see `:h highlight`. - highlight_group = 'Comment', - patterns = { - { - -- Match any file starting with ".env". - -- This can be a table to match multiple file patterns. - file_pattern = { - '.env*', - 'wrangler.toml', - '.dev.vars', - }, - -- Match an equals sign and any character after it. - -- This can also be a table of patterns to cloak, - -- example: cloak_pattern = { ":.+", "-.+" } for yaml files. - cloak_pattern = '=.+', - }, - }, - }, - }, - -- projectionist.vim: Granular project configuration -- https://github.com/tpope/vim-projectionist { @@ -150,21 +114,7 @@ return { { 'whatyouhide/vim-textobj-xmlattr', dependencies = { 'kana/vim-textobj-user' }, - }, - - -- Describe the regexp under the cursor - -- https://github.com/bennypowers/nvim-regexplainer - { - 'bennypowers/nvim-regexplainer', - event = 'BufEnter', - dependencies = { - 'nvim-treesitter/nvim-treesitter', - 'MunifTanjim/nui.nvim', - }, - opts = { - -- automatically show the explainer when the cursor enters a regexp - auto = true, - }, + ft = { 'html', 'xml', 'javascriptreact', 'typescriptreact', 'vue' }, }, -- Clarify and beautify your comments using boxes and lines. @@ -174,38 +124,4 @@ return { event = 'BufEnter', opts = {}, }, - - -- Plugin to improve viewing Markdown files in Neovim - -- https://github.com/MeanderingProgrammer/render-markdown.nvim - { - 'MeanderingProgrammer/render-markdown.nvim', - event = 'BufEnter', - dependencies = { - 'nvim-treesitter/nvim-treesitter', - 'nvim-tree/nvim-web-devicons', - }, - ft = 'markdown', - opts = {}, - }, - - { - 'ray-x/go.nvim', - dependencies = { -- optional packages - 'ray-x/guihua.lua', - 'neovim/nvim-lspconfig', - 'nvim-treesitter/nvim-treesitter', - }, - config = function() require('go').setup() end, - event = { 'CmdlineEnter' }, - ft = { 'go', 'gomod' }, - build = ':lua require("go.install").update_all_sync()', -- if you need to install/update all binaries - }, - - -- Mainly a PHP Language Server with more features than you can shake a stick at - -- https://github.com/phpactor/phpactor - { - 'phpactor/phpactor', - build = 'composer install --no-dev --optimize-autoloader', - ft = 'php', - }, } diff --git a/config/nvim/lua/plugins/conform.lua b/config/nvim/lua/plugins/conform.lua new file mode 100644 index 0000000..9eafb04 --- /dev/null +++ b/config/nvim/lua/plugins/conform.lua @@ -0,0 +1,66 @@ +return { + { + 'stevearc/conform.nvim', + event = 'BufWritePre', + config = function() + local conform = require 'conform' + + conform.setup { + formatters_by_ft = { + lua = { 'stylua' }, + }, + format_on_save = function(bufnr) + -- Disable autoformat for files in a certain paths + local bufname = vim.api.nvim_buf_get_name(bufnr) + if bufname:match '/dist|node_modules|vendor/' then return end + + local disable_lsp = { + c = true, + cpp = true, + } + return { + lsp_fallback = not disable_lsp[vim.bo[bufnr].filetype], + timeout_ms = 500, + } + end, + notify_on_error = true, + } + + vim.o.formatexpr = "v:lua.require'conform'.formatexpr()" + + -- Autoformat toggle keybinding + local autoformat = true + vim.g.autoformat_enabled = autoformat + + vim.api.nvim_create_user_command('ToggleFormat', function() + autoformat = not autoformat + vim.g.autoformat_enabled = autoformat + vim.notify('Autoformat on save: ' .. (autoformat and 'enabled' or 'disabled')) + end, {}) + + vim.keymap.set( + 'n', + 'tf', + ':ToggleFormat', + { desc = 'Toggle autoformat on save' } + ) + + vim.api.nvim_create_autocmd('BufWritePre', { + callback = function(args) + if autoformat then + conform.format { + bufnr = args.buf, + async = true, + lsp_format = 'fallback', + } + end + end, + }) + + -- Global statusline helper function + function _G.autoformat_status() + return vim.g.autoformat_enabled and '[ fmt:on]' or '[ fmt:off]' + end + end, + }, +} diff --git a/config/nvim/lua/plugins/folke.lua b/config/nvim/lua/plugins/folke.lua index 2a3a29f..b2afbf1 100644 --- a/config/nvim/lua/plugins/folke.lua +++ b/config/nvim/lua/plugins/folke.lua @@ -21,7 +21,7 @@ return { right = { 'fold', 'git' }, -- priority of signs on the right (high to low) folds = { open = true, -- show open fold icons - git_hl = false, -- use Git Signs hl for fold icons + git_hl = true, -- use Git Signs hl for fold icons }, git = { -- patterns to match Git signs diff --git a/config/nvim/lua/plugins/lsp.lua b/config/nvim/lua/plugins/lsp.lua index 44d6f99..f58ddda 100644 --- a/config/nvim/lua/plugins/lsp.lua +++ b/config/nvim/lua/plugins/lsp.lua @@ -4,359 +4,296 @@ require 'utils' --- LSP Servers are installed and configured by lsp-setup.nvim --- Mason formatters Conform uses to format files --- These are automatically configured by zapling/mason-conform.nvim -local lsp_servers = { - bashls = {}, - -- csharp_ls = {}, - diagnosticls = {}, - gopls = { - settings = { - gopls = { - hints = { - rangeVariableTypes = true, - parameterNames = true, - constantValues = true, - assignVariableTypes = true, - compositeLiteralFields = true, - compositeLiteralTypes = true, - functionTypeParameters = true, - }, - }, - }, - }, - html = {}, - intelephense = { - init_options = { - licenceKey = GetIntelephenseLicense(), - }, - }, - jsonls = {}, - lua_ls = { - settings = { - Lua = { - completion = { - callSnippet = 'Replace', - }, - diagnostics = { - globals = { - 'vim', - }, - disable = { - -- Ignore lua_ls noisy `missing-fields` warnings - 'missing-fields', - }, - }, - hint = { - enable = true, - arrayIndex = 'Auto', - await = true, - paramName = 'All', - paramType = true, - semicolon = 'SameLine', - setType = false, - }, - }, - }, - }, - tailwindcss = {}, - ts_ls = { - settings = { - typescript = { - inlayHints = { - includeInlayParameterNameHints = 'all', - includeInlayParameterNameHintsWhenArgumentMatchesName = false, - includeInlayFunctionParameterTypeHints = true, - includeInlayVariableTypeHints = true, - includeInlayVariableTypeHintsWhenTypeMatchesName = false, - includeInlayPropertyDeclarationTypeHints = true, - includeInlayFunctionLikeReturnTypeHints = true, - includeInlayEnumMemberValueHints = true, - }, - }, - }, - }, - vimls = {}, - volar = { - settings = { - typescript = { - inlayHints = { - enumMemberValues = { - enabled = true, - }, - functionLikeReturnTypes = { - enabled = true, - }, - propertyDeclarationTypes = { - enabled = true, - }, - parameterTypes = { - enabled = true, - suppressWhenArgumentMatchesName = true, - }, - variableTypes = { - enabled = true, - }, - }, - }, - }, - }, -} - --- Mason tools to automatically install and configure. --- These are automatically configured by WhoIsSethDaniel/mason-tool-installer.nvim -local mason_tools = { - 'actionlint', - 'ast-grep', - 'black', - 'editorconfig-checker', - 'goimports', - 'golangci-lint', - 'golines', - 'gopls', - 'gotests', - 'isort', - 'phpcbf', - 'phpmd', - 'phpstan', - 'pint', - 'prettierd', - 'revive', - 'semgrep', - 'shellcheck', - 'shfmt', - 'sonarlint-language-server', - 'staticcheck', - 'stylua', - 'trivy', - 'vint', - 'yamlfmt', -} - return { - -- `lazydev` configures Lua LSP for your Neovim config, runtime and plugins - -- used for completion, annotations and signatures of Neovim apis - -- https://github.com/folke/lazydev.nvim { - 'folke/lazydev.nvim', - ft = 'lua', - opts = { - library = { - -- Load luvit types when the `vim.uv` word is found - { path = 'luvit-meta/library', words = { 'vim%.uv' } }, - -- load assert and describe paths - { path = 'luassert/library', words = { 'assert' } }, - { path = 'busted/library', words = { 'describe' } }, - }, + 'neovim/nvim-lspconfig', + dependencies = { + { 'williamboman/mason.nvim', opts = {} }, + 'williamboman/mason-lspconfig.nvim', + 'WhoIsSethDaniel/mason-tool-installer.nvim', + + 'folke/lazydev.nvim', + 'zapling/mason-conform.nvim', + + -- Allows extra capabilities provided by blink.cmp + 'saghen/blink.cmp', }, - }, + config = function() + local lazydev = require 'lazydev' - -- Meta type definitions for the Lua platform Luvit. - -- https://github.com/Bilal2453/luvit-meta - { 'Bilal2453/luvit-meta', lazy = true }, - - -- Quickstart configs for Nvim LSP - -- https://github.com/neovim/nvim-lspconfig - { 'neovim/nvim-lspconfig' }, - - -- Portable package manager for Neovim that runs everywhere Neovim runs. - -- Easily install and manage LSP servers, DAP servers, linters, and formatters. - -- https://github.com/williamboman/mason.nvim - { - 'williamboman/mason.nvim', - version = '*', - cmd = 'Mason', - run = ':MasonUpdate', - opts = {}, - }, - - -- Extensible UI for Neovim notifications and LSP progress messages. - -- https://github.com/j-hui/fidget.nvim - { - 'j-hui/fidget.nvim', - version = '*', - opts = {}, - }, - - -- Extension to mason.nvim that makes it easier to use lspconfig with mason.nvim. - -- https://github.com/williamboman/mason-lspconfig.nvim - { 'williamboman/mason-lspconfig.nvim' }, - - -- Install and upgrade third party tools automatically - -- https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim - { - 'WhoIsSethDaniel/mason-tool-installer.nvim', - version = '*', - opts = { - auto_install = true, - auto_update = true, - ensure_installed = mason_tools, - }, - }, - - -- JSON schemas for Neovim - -- https://github.com/b0o/SchemaStore.nvim - { 'b0o/schemastore.nvim' }, - - -- Performant, batteries-included completion plugin for Neovim - -- https://github.com/saghen/blink.cmp - -- See lua/plugins/blink.lua for configs - { 'saghen/blink.cmp' }, - - -- A simple wrapper for nvim-lspconfig and mason-lspconfig - -- to easily setup LSP servers. - -- https://github.com/junnplus/lsp-setup.nvim - { - 'junnplus/lsp-setup.nvim', - opts = { - default_mappings = false, - servers = lsp_servers, - }, - config = function(_, opts) - require('lazydev').setup() - require('lsp-setup').setup(opts) - local cmp = require 'blink.cmp' - local lspconfig = require 'lspconfig' - for server, config in pairs(opts.servers) do - -- passing config.capabilities to blink.cmp merges with the capabilities in your - -- `opts[server].capabilities, if you've defined it - config.capabilities = cmp.get_lsp_capabilities(config.capabilities) - lspconfig[server].setup(config) - end - - lspconfig.lua_ls.on_init = function(client) - if client.workspace_folders then - local path = client.workspace_folders[1].name - if - vim.loop.fs_stat(path .. '/.luarc.json') - or vim.loop.fs_stat(path .. '/.luarc.jsonc') - then - return + vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('lsp-attach', { clear = true }), + callback = function(event) + local map = function(keys, func, desc, mode) + mode = mode or 'n' + vim.keymap.set( + mode, + keys, + func, + { buffer = event.buf, desc = 'LSP: ' .. desc } + ) end - end - client.config.settings.Lua = - vim.tbl_deep_extend('force', client.config.settings.Lua, { - runtime = { - -- Tell the language server which version of Lua you're using - -- (most likely LuaJIT in the case of Neovim) - version = 'LuaJIT', - }, - -- Make the server aware of Neovim runtime files - workspace = { - checkThirdParty = false, - library = { - vim.env.VIMRUNTIME, + + local tsb = require 'telescope.builtin' + + -- Rename the variable under your cursor. + -- Most Language Servers support renaming across files, etc. + map('grn', vim.lsp.buf.rename, '[R]e[n]ame') + + -- Execute a code action, usually your cursor needs to be on top of an error + -- or a suggestion from your LSP for this to activate. + map('gra', vim.lsp.buf.code_action, '[G]oto Code [A]ction', { 'n', 'x' }) + + -- Find references for the word under your cursor. + map('grr', tsb.lsp_references, '[G]oto [R]eferences') + + -- Jump to the implementation of the word under your cursor. + -- Useful when your language has ways of declaring types without + -- an actual implementation. + map('gri', tsb.lsp_implementations, '[G]oto [I]mplementation') + + -- Jump to the definition of the word under your cursor. + -- This is where a variable was first declared, or where a function is + -- defined, etc. To jump back, press . + map('grd', tsb.lsp_definitions, '[G]oto [D]efinition') + + -- WARN: This is not Goto Definition, this is Goto Declaration. + -- For example, in C this would take you to the header. + map('grD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') + + -- Fuzzy find all the symbols in your current document. + -- Symbols are things like variables, functions, types, etc. + map('gO', tsb.lsp_document_symbols, 'Open Document Symbols') + + -- Fuzzy find all the symbols in your current workspace. + -- Similar to document symbols, except searches over your entire project. + map('gW', tsb.lsp_dynamic_workspace_symbols, 'Open Workspace Symbols') + + -- Jump to the type of the word under your cursor. + -- Useful when you're not sure what type a variable is and you want to see + -- the definition of its *type*, not where it was *defined*. + map('grt', tsb.lsp_type_definitions, '[G]oto [T]ype Definition') + + -- This function resolves a difference between neovim nightly + -- (version 0.11) and stable (version 0.10) + ---@param client vim.lsp.Client + ---@param method vim.lsp.protocol.Method + ---@param bufnr? integer some lsp support methods only in specific files + ---@return boolean + local function client_supports_method(client, method, bufnr) + if vim.fn.has 'nvim-0.11' == 1 then + return client:supports_method(method, bufnr) + else + ---@diagnostic disable-next-line: param-type-mismatch + return client.supports_method(method, { bufnr = bufnr }) + end + end + + -- The following two autocommands are used to highlight references of the + -- word under your cursor when your cursor rests there for a little while. + -- See `:help CursorHold` for information about when this is executed + -- + -- When you move your cursor, the highlights will be cleared + -- (the second autocommand). + local client = vim.lsp.get_client_by_id(event.data.client_id) + if + client + and client_supports_method( + client, + vim.lsp.protocol.Methods.textDocument_documentHighlight, + event.buf + ) + then + local highlight_augroup = + vim.api.nvim_create_augroup('lsp-highlight', { clear = false }) + vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, { + buffer = event.buf, + group = highlight_augroup, + callback = vim.lsp.buf.document_highlight, + }) + + vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, { + buffer = event.buf, + group = highlight_augroup, + callback = vim.lsp.buf.clear_references, + }) + + vim.api.nvim_create_autocmd('LspDetach', { + group = vim.api.nvim_create_augroup('lsp-detach', { clear = true }), + callback = function(event2) + vim.lsp.buf.clear_references() + vim.api.nvim_clear_autocmds { + group = 'lsp-highlight', + buffer = event2.buf, + } + end, + }) + end + end, + }) + + -- Diagnostic Config + -- See :help vim.diagnostic.Opts + vim.diagnostic.config { + severity_sort = true, + float = { border = 'rounded', source = 'if_many' }, + underline = { severity = vim.diagnostic.severity.ERROR }, + signs = vim.g.have_nerd_font and { + text = { + [vim.diagnostic.severity.ERROR] = '󰅚 ', + [vim.diagnostic.severity.WARN] = '󰀪 ', + [vim.diagnostic.severity.INFO] = '󰋽 ', + [vim.diagnostic.severity.HINT] = '󰌶 ', + }, + } or {}, + virtual_text = { + source = 'if_many', + spacing = 2, + format = function(diagnostic) + local diagnostic_message = { + [vim.diagnostic.severity.ERROR] = diagnostic.message, + [vim.diagnostic.severity.WARN] = diagnostic.message, + [vim.diagnostic.severity.INFO] = diagnostic.message, + [vim.diagnostic.severity.HINT] = diagnostic.message, + } + return diagnostic_message[diagnostic.severity] + end, + }, + } + + local capabilities = require('blink.cmp').get_lsp_capabilities() + + local servers = { + ansiblels = {}, + ast_grep = {}, + bashls = {}, + cssls = {}, + dockerls = {}, + gopls = { + settings = { + gopls = { + hints = { + assignVariableTypes = true, + compositeLiteralFields = true, + compositeLiteralTypes = true, + constantValues = true, + functionTypeParameters = true, + parameterNames = true, + rangeVariableTypes = true, }, }, - }) - end - lspconfig.jsonls.settings = { - json = { - schemas = require('schemastore').json.schemas(), - validate = { enable = true }, - }, - yaml = { - schemaStore = { - -- You must disable built-in SchemaStore support if you want to use - -- this plugin and its advanced options like `ignore`. - enable = false, - -- Avoid TypeError: Cannot read properties of undefined (reading 'length') - url = '', }, - schemas = require('schemastore').yaml.schemas(), - validate = { enable = true }, + }, + html = {}, + intelephense = { + init_options = { + licenceKey = vim.env.INTELEPHENSE_LICENSE or GetIntelephenseLicense() or nil, + }, + }, + jsonls = {}, + lua_ls = { + settings = { + Lua = { + diagnostics = { + globals = { 'vim' }, + disable = { 'missing-fields' }, + }, + completion = { callSnippet = 'Replace' }, + workspace = { checkThirdParty = true }, + hint = { + enable = true, + arrayIndex = 'Auto', + await = true, + paramName = 'All', + paramType = true, + semicolon = 'SameLine', + setType = false, + }, + }, + }, + on_init = function(client) + client.config.settings.Lua.workspace.library = { + vim.env.VIMRUNTIME, + } + client.config.settings.Lua.runtime = { version = 'LuaJIT' } + client.notify( + 'workspace/didChangeConfiguration', + { settings = client.config.settings } + ) + end, + }, + omnisharp = {}, -- C# OmniSharp (will respect EditorConfig for formatting) + pyright = {}, + tailwindcss = {}, + terraformls = {}, + ts_ls = {}, + volar = { + settings = { + typescript = { + inlayHints = { + enumMemberValues = { enabled = true }, + functionLikeReturnTypes = { enabled = true }, + propertyDeclarationTypes = { enabled = true }, + }, + }, + }, + }, + vimls = {}, + eslint = {}, + yamlls = { + settings = { + yaml = { + keyOrdering = false, -- don't auto-sort YAML keys on format + schemaStore = { enable = true }, -- use JSON Schema Store for validation + }, + }, }, } - -- Diagnostic configuration - local signs = { - { name = 'DiagnosticSignError', text = '' }, -- Error icon - { name = 'DiagnosticSignWarn', text = '' }, -- Warning icon - { name = 'DiagnosticSignHint', text = '' }, -- Hint icon - { name = 'DiagnosticSignInfo', text = '' }, -- Information icon + local ensure_installed = vim.tbl_keys(servers or {}) + vim.list_extend(ensure_installed, { + 'actionlint', -- GitHub Actions linter + 'shfmt', -- Shell formatter + 'stylua', -- Lua formatter + 'shellcheck', -- Shell linter + }) + + require('mason-tool-installer').setup { + auto_install = true, + auto_update = true, + ensure_installed = ensure_installed, } - local function ensure_sign_defined(name, sign_opts) - if vim.tbl_isempty(vim.fn.sign_getdefined(name)) then - vim.fn.sign_define(name, sign_opts) - end - end + require('mason-conform').setup { + ensure_installed = ensure_installed, + } - for _, sign in ipairs(signs) do - ensure_sign_defined(sign.name, { - text = sign.text, - texthl = sign.texthl or sign.name, - numhl = sign.numhl or sign.name, - }) - end - - ---@type vim.diagnostic.Opts - local diagnostics_config = { - signs = { - active = signs, -- show signs + require('mason-lspconfig').setup { + ensure_installed = {}, -- explicitly set to an empty table + automatic_installation = false, + handlers = { + function(server_name) + local server = servers[server_name] or {} + server.capabilities = + vim.tbl_deep_extend('force', {}, capabilities, server.capabilities or {}) + require('lspconfig')[server_name].setup(server) + end, }, - update_in_insert = false, - underline = true, - severity_sort = true, - virtual_text = true, } - vim.diagnostic.config(diagnostics_config) - - -- end of junnplus/lsp-setup config + lazydev.setup { + ---@type boolean|(fun(root:string):boolean?) + enabled = true, + debug = false, + runtime = vim.env.VIMRUNTIME --[[@as string]], + library = { + { path = '${3rd}/luv/library', words = { 'vim%.uv' } }, + }, + integrations = { + lspconfig = true, + cmp = true, + }, + } end, }, - - -- Lightweight yet powerful formatter plugin for Neovim - -- https://github.com/stevearc/conform.nvim - { - 'stevearc/conform.nvim', - event = { 'BufWritePre' }, - cmd = { 'ConformInfo' }, - opts = { - notify_on_error = false, - ---@type nil|conform.FormatOpts|fun(bufnr: integer): nil|conform.FormatOpts - format_on_save = function(bufnr) - -- Disable "format_on_save lsp_fallback" for languages that don't - -- have a well standardized coding style. You can add additional - -- languages here or re-enable it for the disabled ones. - local disable_filetypes = { c = true, cpp = true } - local lsp_format_opt - if disable_filetypes[vim.bo[bufnr].filetype] then - lsp_format_opt = 'never' - else - lsp_format_opt = 'fallback' - end - - -- Disable autoformat for files in a certain paths - local bufname = vim.api.nvim_buf_get_name(bufnr) - if bufname:match '/dist|node_modules|vendor/' then return end - - return { - timeout_ms = 500, - lsp_format = lsp_format_opt, - } - end, - formatters_by_ft = { - lua = { 'stylua' }, - sh = { 'shfmt' }, - bash = { 'shfmt' }, - php = { 'phpcbf' }, - python = { 'isort', 'black' }, - -- Conform can also run multiple formatters sequentially - -- python = { "isort", "black" }, - -- - -- You can use 'stop_after_first' to run the first available formatter from the list - -- javascript = { "prettierd", "prettier", stop_after_first = true }, - }, - }, - init = function() - -- If you want the formatexpr, here is the place to set it - vim.o.formatexpr = "v:lua.require'conform'.formatexpr()" - end, - }, - -- Automatically install formatters registered with conform.nvim via mason.nvim - -- https://github.com/zapling/mason-conform.nvim - { 'zapling/mason-conform.nvim', opts = {} }, } diff --git a/config/nvim/lua/plugins/neotree.lua b/config/nvim/lua/plugins/neotree.lua index d244328..47f568d 100644 --- a/config/nvim/lua/plugins/neotree.lua +++ b/config/nvim/lua/plugins/neotree.lua @@ -54,9 +54,7 @@ return { event_handlers = { { event = 'file_opened', - handler = function(_) - require('neo-tree.command').execute { action = 'close' } - end, + handler = function(_) require('neo-tree.command').execute { action = 'close' } end, }, }, default_component_configs = { diff --git a/config/nvim/lua/plugins/other.lua b/config/nvim/lua/plugins/other.lua index 03d2e0e..ec14512 100644 --- a/config/nvim/lua/plugins/other.lua +++ b/config/nvim/lua/plugins/other.lua @@ -1,44 +1,13 @@ return { - { - 'rmagatti/auto-session', - lazy = false, - version = '*', - opts = { - suppressed_dirs = { - '/', - '~/', - '~/Downloads', - '~/Library', - }, - bypass_save_filetypes = { - 'PlenaryTestPopup', - 'alpha', - 'checkhealth', - 'dashboard', - 'dbout', - 'gitsigns.blame', - 'grug-far', - 'help', - 'lspinfo', - 'man', - 'neo-tree', - 'neotest-output', - 'neotest-output-panel', - 'neotest-summary', - 'notify', - 'qf', - 'spectre_panel', - 'startuptime', - 'trouble', - 'tsplayground', - }, - -- log_level = 'debug', - }, - }, { 'nvim-lua/plenary.nvim', version = '*', lazy = false, }, + + -- Vim plugin for automatic time tracking and metrics + -- generated from your programming activity. + -- https://github.com/wakatime/vim-wakatime + { 'wakatime/vim-wakatime', lazy = false, enabled = true }, } diff --git a/config/nvim/lua/plugins/telescope.lua b/config/nvim/lua/plugins/telescope.lua index d92d5f8..2550aee 100644 --- a/config/nvim/lua/plugins/telescope.lua +++ b/config/nvim/lua/plugins/telescope.lua @@ -3,7 +3,8 @@ return { -- https://github.com/nvim-telescope/telescope.nvim 'nvim-telescope/telescope.nvim', version = '*', - lazy = false, + lazy = true, + cmd = 'Telescope', dependencies = { { 'nvim-lua/plenary.nvim' }, { 'nvim-telescope/telescope-symbols.nvim' }, @@ -16,10 +17,6 @@ return { -- https://github.com/polirritmico/telescope-lazy-plugins.nvim { 'polirritmico/telescope-lazy-plugins.nvim' }, - -- Neovim plugin. Telescope.nvim extension that adds LuaSnip integration. - -- https://github.com/benfowler/telescope-luasnip.nvim - { 'benfowler/telescope-luasnip.nvim' }, - -- Fuzzy Finder Algorithm which requires local dependencies to be built. -- Only load if `make` is available { @@ -27,27 +24,45 @@ return { build = 'make', cond = vim.fn.executable 'make' == 1, }, - - -- Import modules with ease - -- https://github.com/piersolenski/telescope-import.nvim - { 'piersolenski/telescope-import.nvim' }, }, config = function() local t = require 'telescope' local a = require 'telescope.actions' + local c = require 'telescope.config' local open_with_trouble = require('trouble.sources.telescope').open local add_to_trouble = require('trouble.sources.telescope').add + -- Clone the default Telescope configuration + local vimgrep_arguments = { unpack(c.values.vimgrep_arguments) } + + -- I want to search in hidden/dot files. + table.insert(vimgrep_arguments, '--hidden') + -- I don't want to search in the `.git` directory. + table.insert(vimgrep_arguments, '--glob') + table.insert(vimgrep_arguments, '!**/.git/*') + -- [[ Configure Telescope ]] -- See `:help telescope` and `:help telescope.setup()` t.setup { defaults = { + -- `hidden = true` is not supported in text grep commands. + vimgrep_arguments = vimgrep_arguments, + layout_strategy = 'horizontal', pickers = { find_files = { + -- `hidden = true` will still show the inside of `.git/` as + -- it's not `.gitignore`d. + find_command = { 'rg', '--files', '--hidden', '--glob', '!**/.git/*' }, theme = 'dropdown', }, + mappings = { + i = { + [''] = a.cycle_previewers_next, + [''] = a.cycle_previewers_prev, + }, + }, }, mappings = { i = { @@ -64,28 +79,28 @@ return { }, }, }, + highlight = { + enable = true, + additional_vim_regex_highlighting = false, + }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = '', + node_incremental = '', + scope_incremental = '', + node_decremental = '', + }, + }, + context_commentstring = { + enable = true, + enable_autocmd = false, + }, extensions = { lazy_plugins = { -- Must be a valid path to the file containing the lazy spec and setup() call. lazy_config = vim.fn.stdpath 'config' .. '/init.lua', }, - import = { - -- Imports can be added at a specified line whilst keeping the cursor in place - insert_at_top = true, - -- Optionally support additional languages or modify existing languages... - custom_languages = { - { - -- The filetypes that ripgrep supports (find these via `rg --type-list`) - extensions = { 'js', 'ts' }, - -- The Vim filetypes - filetypes = { 'vue' }, - -- Optionally set a line other than 1 - insert_at_line = 2, ---@type function|number - -- The regex pattern for the import statement - regex = [[^(?:import(?:[\"'\s]*([\w*{}\n, ]+)from\s*)?[\"'\s](.*?)[\"'\s].*)]], - }, - }, - }, }, } diff --git a/config/nvim/lua/plugins/ui.lua b/config/nvim/lua/plugins/ui.lua index 40146db..d83da27 100644 --- a/config/nvim/lua/plugins/ui.lua +++ b/config/nvim/lua/plugins/ui.lua @@ -1,17 +1,8 @@ return { - -- https://github.com/rmehri01/onenord.nvim { 'rmehri01/onenord.nvim', - priority = 1000, -- Make sure to load this before all the other start plugins. - opts = { - borders = true, - fade_nc = true, - disable = { - float_background = true, - }, - }, + opts = {}, }, - -- Automatic dark mode -- https://github.com/f-person/auto-dark-mode.nvim { @@ -33,6 +24,7 @@ return { -- https://github.com/catgoose/nvim-colorizer.lua { 'catgoose/nvim-colorizer.lua', + event = 'BufReadPre', opts = { user_default_options = { names = false, @@ -40,13 +32,27 @@ return { }, }, - -- A neovim plugin that shows colorcolumn dynamically - -- https://github.com/Bekaboo/deadcolumn.nvim - { 'Bekaboo/deadcolumn.nvim' }, - -- Remove all background colors to make nvim transparent -- https://github.com/xiyaowong/nvim-transparent - { 'xiyaowong/nvim-transparent', opts = {} }, + { + 'xiyaowong/nvim-transparent', + lazy = false, + config = function() + local t = require 'transparent' + t.setup { + extra_groups = { + 'NormalNC', + 'NormalFloat', + 'FloatBorder', + 'TelescopeBorder', + 'TelescopePromptBorder', + 'TelescopeResultsBorder', + 'TelescopePreviewBorder', + }, + } + t.clear_prefix 'NeoTree' + end, + }, -- Display a character as the colorcolumn -- https://github.com/lukas-reineke/virt-column.nvim diff --git a/config/nvim/lua/plugins/wakatime.lua b/config/nvim/lua/plugins/wakatime.lua deleted file mode 100644 index bac0efd..0000000 --- a/config/nvim/lua/plugins/wakatime.lua +++ /dev/null @@ -1,4 +0,0 @@ --- Vim plugin for automatic time tracking and metrics --- generated from your programming activity. --- https://github.com/wakatime/vim-wakatime -return { 'wakatime/vim-wakatime', lazy = false, enabled = true } diff --git a/config/nvim/syntax/env.vim b/config/nvim/syntax/env.vim new file mode 100644 index 0000000..a11847e --- /dev/null +++ b/config/nvim/syntax/env.vim @@ -0,0 +1,31 @@ +" Vim syntax file +" Language: env files (NOT shell code) +" Maintainer: Gernot Schulz +" Source: https://github.com/overleaf/vim-env-syntax + +" quit when a syntax file was already loaded +if exists("b:current_syntax") + finish +endif + +syn match envComment '^#.*' +syn match envVariableUnassigned "^\<\h\w*$" + +syn match envVariable "^\<\h\w*\ze=" nextgroup=envVarAssign +syn match envVarAssign contained "=" nextgroup=envVar,envQuotedVarOpen,envSpace +syn match envVar contained "\h\w*" +syn match envSpace contained "\s\+" nextgroup=envQuotedVarOpen +syn match envQuotedVarOpen contained "[\"']" + +syn match envSpace "\s$" +syn match envQuotedVarClose "[\"']$" + +let b:current_syntax = "env" + +hi def link envComment Comment +hi def link envVariableUnassigned Error +hi def link envVariable Identifier +hi def link envVarAssign Operator +hi def link envSpace Error +hi def link envQuotedVarOpen Error +hi def link envQuotedVarClose Error diff --git a/config/wezterm/wezterm.lua b/config/wezterm/wezterm.lua index 827ee98..0ad03ca 100644 --- a/config/wezterm/wezterm.lua +++ b/config/wezterm/wezterm.lua @@ -6,7 +6,7 @@ config.set_environment_variables = { } -- Font and font size -config.font_size = 14.0 +config.font_size = 14.5 config.font = wezterm.font_with_fallback { { family = 'Operator Mono', @@ -20,7 +20,7 @@ config.font = wezterm.font_with_fallback { config.harfbuzz_features = { 'zero', 'ss01', 'cv05' } -- Make the window a bit transparent -config.window_background_opacity = 0.98 +config.window_background_opacity = 0.96 -- Don't show tab bar config.enable_tab_bar = false diff --git a/stylua.toml b/stylua.toml index 6f90ec6..b142eec 100644 --- a/stylua.toml +++ b/stylua.toml @@ -1,4 +1,4 @@ -column_width = 120 +column_width = 90 line_endings = "Unix" indent_type = "Spaces" indent_width = 2