diff --git a/lua/custom/plugins/configs/lsp.lua b/lua/custom/plugins/configs/lsp.lua index 58b39fa..3da5cf6 100644 --- a/lua/custom/plugins/configs/lsp.lua +++ b/lua/custom/plugins/configs/lsp.lua @@ -1,34 +1,271 @@ -local lspconfig = require 'lspconfig' -local lspsettings = require 'custom.plugins.configs.lspsettings' +-- Brief aside: **What is LSP?** +-- +-- LSP is an initialism you've probably heard, but might not understand what it is. +-- +-- LSP stands for Language Server Protocol. It's a protocol that helps editors +-- and language tooling communicate in a standardized fashion. +-- +-- In general, you have a "server" which is some tool built to understand a particular +-- language (such as `gopls`, `lua_ls`, `rust_analyzer`, etc.). These Language Servers +-- (sometimes called LSP servers, but that's kind of like ATM Machine) are standalone +-- processes that communicate with some "client" - in this case, Neovim! +-- +-- LSP provides Neovim with features like: +-- - Go to definition +-- - Find references +-- - Autocompletion +-- - Symbol Search +-- - and more! +-- +-- Thus, Language Servers are external tools that must be installed separately from +-- Neovim. This is where `mason` and related plugins come into play. +-- +-- If you're wondering about lsp vs treesitter, you can check out the wonderfully +-- and elegantly composed help section, `:help lsp-vs-treesitter` + +-- This function gets run when an LSP attaches to a particular buffer. +-- That is to say, every time a new file is opened that is associated with +-- an lsp (for example, opening `main.rs` is associated with `rust_analyzer`) this +-- function will be executed to configure the current buffer +vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('kickstart-lsp-attach', { clear = true }), + callback = function(event) + -- 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. + -- + -- 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 map = function(keys, func, desc) + vim.keymap.set('n', keys, func, { buffer = event.buf, desc = 'LSP: ' .. desc }) + end + + -- 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('gd', require('telescope.builtin').lsp_definitions, '[G]oto [D]efinition') + + -- Find references for the word under your cursor. + map('gr', require('telescope.builtin').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('gI', require('telescope.builtin').lsp_implementations, '[G]oto [I]mplementation') + + -- Rename the variable under your cursor. + -- Most Language Servers support renaming across files, etc. + map('rn', 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('ca', vim.lsp.buf.code_action, '[C]ode [A]ction') + + -- Opens a popup that displays documentation about the word under your cursor + -- See `:help K` for why this keymap. + map('K', vim.lsp.buf.hover, 'Hover Documentation') + + -- WARN: This is not Goto Definition, this is Goto Declaration. + -- For example, in C this would take you to the header. + map('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') + + -- 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.server_capabilities.documentHighlightProvider then + local highlight_augroup = vim.api.nvim_create_augroup('kickstart-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('kickstart-lsp-detach', { clear = true }), + callback = function(event2) + vim.lsp.buf.clear_references() + vim.api.nvim_clear_autocmds { group = 'kickstart-lsp-highlight', buffer = event2.buf } + end, + }) + end + + -- The following autocommand is used to enable inlay hints in your + -- code, if the language server you are using supports them + -- + -- This may be unwanted, since they displace some of your code + if client and client.server_capabilities.inlayHintProvider and vim.lsp.inlay_hint then + map('th', function() + vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) + end, '[T]oggle Inlay [H]ints') + end + end, +}) + +-- LSP servers and clients are able to communicate to each other what features they support. +-- By default, Neovim doesn't support everything that is in the LSP specification. +-- When you add nvim-cmp, luasnip, etc. Neovim now has *more* capabilities. +-- So, we create new capabilities with nvim cmp, and then broadcast that to the servers. local capabilities = vim.lsp.protocol.make_client_capabilities() +capabilities = vim.tbl_deep_extend('force', capabilities, require('cmp_nvim_lsp').default_capabilities()) --- these are using the defaults +-- 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. Available keys are: +-- - cmd (table): Override the default command used to start the server +-- - filetypes (table): Override the default list of associated filetypes for the server +-- - capabilities (table): Override fields in capabilities. Can be used to disable certain LSP features. +-- - settings (table): Override the default settings passed when initializing the server. +-- For example, to see the options for `lua_ls`, you could go to: https://luals.github.io/wiki/settings/ local servers = { - 'html', - 'cssls', - 'tsserver', - 'clangd', - 'bashls', - 'cmake', - 'yamlls', - 'texlab', - 'csharp_ls', - 'lua_ls', + -- clangd = {}, + -- gopls = {}, + -- pyright = {}, + -- rust_analyzer = {}, + -- ... etc. See `:help lspconfig-all` for a list of all the pre-configured LSPs + -- + -- Some languages (like typescript) have entire language plugins that can be useful: + -- https://github.com/pmizio/typescript-tools.nvim + -- + -- But for many setups, the LSP (`tsserver`) will work just fine + -- tsserver = {}, + -- + + html = {}, + cssls = {}, + tsserver = {}, + clangd = {}, + bashls = {}, + cmake = {}, + yamlls = {}, + texlab = {}, + csharp_ls = {}, + basedpyright = { + root_dir = vim.loop.cwd, + flags = { debounce_text_changes = 300 }, + single_file_support = true, + settings = { + python = { + analysis = { + autoSearchPaths = true, + diagnosticMode = 'openFilesOnly', + useLibraryCodeForTypes = true, + typeCheckingMode = 'basic', + }, + }, + }, + }, + rust_analyzer = { + settings = { + ['rust-analyzer'] = { + check = { + command = 'clippy', + }, + imports = { + granularity = { + group = 'module', + }, + prefix = 'self', + }, + cargo = { + buildScripts = { + enable = true, + }, + }, + procMacro = { + enable = true, + }, + }, + }, + }, + ltex = { + use_spellfile = false, + settings = { + ltex = { + checkFrequency = 'save', -- shut up while i'm just editing, see + -- specific language (such as en-GB or de-DE is recommended, but I + -- want multilingual) + language = 'auto', + enabled = { + 'bibtex', + 'tex', + 'latex', + 'gitcommit', + 'markdown', + 'org', + 'restructuredtext', + 'rsweave', + 'quarto', + 'rmd', + 'context', + -- "html", + -- "xhtml", + }, + additionalRules = { + enablePickyRules = true, + -- thats cool, but often adds diagnostics in + -- places where a german might confuse words that are similar + -- between english and german REGARDLESS of context. I seem to use the + -- english words only in the proper contexts, so leaving this on + -- just adds annoying hints like 'Hinweis: "list/NN.*" (English) bedeutet "Liste", + -- "Verzeichnis" (German). Meinten Sie vielleicht 'cunning', 'trick'?' + -- everytime I use the word "list". I liked that this makes the hints be + -- in german regardless of the language I'm working in through... + --motherTongue = "de", + }, + -- load token and additional languagetool items later + }, + }, + languageToolOrg = { + apiKey = require 'custom.secret.languagetool', + username = 'accounts@cscherr.de', + languageToolHttpServerUrl = 'https://api.languagetoolplus.com/v2/', + }, + languageToolHttpServerUrl = 'https://api.languagetoolplus.com/v2/', + }, + lua_ls = { + settings = { + Lua = { + completion = { + callSnippet = 'Replace', + }, + }, + }, + }, } -for _, lsp in ipairs(servers) do - lspconfig[lsp].setup { - capabilities = capabilities, - } -end +-- Ensure the servers and tools above are installed +-- To check the current status of installed tools and/or manually install +-- other tools, you can run +-- :Mason +-- +-- You can press `g?` for help in this menu. +require('mason').setup() -local server_with_settings = { - -- "textlsp", - 'ltex', - 'rust_analyzer', - 'basedpyright', +-- You can add other tools here that you want Mason to install +-- for you, so that they are available from within Neovim. +local ensure_installed = vim.tbl_keys(servers or {}) +vim.list_extend(ensure_installed, { + 'stylua', -- Used to format Lua code +}) +require('mason-tool-installer').setup { ensure_installed = ensure_installed } + +require('mason-lspconfig').setup { + handlers = { + function(server_name) + local server = servers[server_name] or {} + -- This handles overriding only values explicitly passed + -- by the server configuration above. Useful when disabling + -- certain features of an LSP (for example, turning off formatting for tsserver) + server.capabilities = vim.tbl_deep_extend('force', {}, capabilities, server.capabilities or {}) + require('lspconfig')[server_name].setup(server) + end, + }, } - -for _, lsp in ipairs(server_with_settings) do - lspconfig[lsp].setup(lspsettings[lsp]) -end diff --git a/lua/custom/plugins/configs/lspsettings.lua b/lua/custom/plugins/configs/lspsettings.lua deleted file mode 100644 index 67f82ff..0000000 --- a/lua/custom/plugins/configs/lspsettings.lua +++ /dev/null @@ -1,202 +0,0 @@ -local M = {} - -M.basedpyright = { - root_dir = vim.loop.cwd, - flags = { debounce_text_changes = 300 }, - single_file_support = true, - settings = { - python = { - analysis = { - autoSearchPaths = true, - diagnosticMode = "openFilesOnly", - useLibraryCodeForTypes = true, - typeCheckingMode = "basic", - }, - }, - }, -} -M.rust_analyzer = { - settings = { - ["rust-analyzer"] = { - check = { - command = "clippy", - }, - imports = { - granularity = { - group = "module", - }, - prefix = "self", - }, - cargo = { - buildScripts = { - enable = true, - }, - }, - procMacro = { - enable = true, - }, - }, - }, -} - -M.ltex = { - use_spellfile = false, - settings = { - ltex = { - checkFrequency = "save", -- shut up while i'm just editing, see - -- specific language (such as en-GB or de-DE is recommended, but I - -- want multilingual) - language = "auto", - enabled = { - "bibtex", - "tex", - "latex", - "gitcommit", - "markdown", - "org", - "restructuredtext", - "rsweave", - "quarto", - "rmd", - "context", - -- "html", - -- "xhtml", - }, - additionalRules = { - enablePickyRules = true, - -- thats cool, but often adds diagnostics in - -- places where a german might confuse words that are similar - -- between english and german REGARDLESS of context. I seem to use the - -- english words only in the proper contexts, so leaving this on - -- just adds annoying hints like 'Hinweis: "list/NN.*" (English) bedeutet "Liste", - -- "Verzeichnis" (German). Meinten Sie vielleicht 'cunning', 'trick'?' - -- everytime I use the word "list". I liked that this makes the hints be - -- in german regardless of the language I'm working in through... - --motherTongue = "de", - }, - -- load token and additional languagetool items later - }, - }, -} - -M.textlsp = { - filetypes = { - "bibtex", - "tex", - "latex", - "gitcommit", - "markdown", - "org", - "restructuredtext", - "rsweave", - "quarto", - "rmd", - "context", - "html", - "xhtml", - }, - settings = { - textLSP = { - analysers = { - languagetool = { - enabled = true, - check_text = { - on_open = true, - on_save = true, - on_change = false, - }, - }, - gramformer = { - -- gramformer dependency needs to be installed manually - enabled = true, - gpu = false, - check_text = { - on_open = false, - on_save = true, - on_change = false, - }, - }, - hf_checker = { - enabled = false, - gpu = false, - quantize = 32, - model = "pszemraj/flan-t5-large-grammar-synthesis", - min_length = 40, - check_text = { - on_open = false, - on_save = true, - on_change = false, - }, - }, - hf_instruction_checker = { - enabled = true, - gpu = false, - quantize = 32, - model = "grammarly/coedit-large", - min_length = 40, - check_text = { - on_open = false, - on_save = true, - on_change = false, - }, - }, - hf_completion = { - enabled = true, - gpu = false, - quantize = 32, - model = "bert-base-multilingual-cased", - topk = 5, - }, - -- openai = { - -- enabled = false, - -- api_key = "", - -- check_text = { - -- on_open = false, - -- on_save = false, - -- on_change = false, - -- }, - -- model = "gpt-3.5-turbo", - -- max_token = 16, - -- }, - -- grammarbot = { - -- enabled = false, - -- api_key = "", - -- -- longer texts are split, this parameter sets the maximum number of splits per analysis - -- input_max_requests = 1, - -- check_text = { - -- on_open = false, - -- on_save = false, - -- on_change = false, - -- }, - -- }, - }, - documents = { - -- org = { - -- org_todo_keywords = { - -- "TODO", - -- "IN_PROGRESS", - -- "DONE", - -- }, - -- }, - txt = { - parse = true, - }, - }, - }, - }, -} - --- load secrets --- the secret module should just return a string with the token -local available, token = require("custom.utils").try_require "custom.secret.languagetool_token" -if available then - M.ltex.languageToolOrg = { - apiKey = token, - username = "accounts@cscherr.de", - languageToolHttpServerUrl = "https://api.languagetoolplus.com/v2/", - } - M.ltex.languageToolHttpServerUrl = "https://api.languagetoolplus.com/v2/" -end - -return M - diff --git a/lua/custom/plugins/editing.lua b/lua/custom/plugins/editing.lua index dbca3bb..15eb3b0 100644 --- a/lua/custom/plugins/editing.lua +++ b/lua/custom/plugins/editing.lua @@ -23,4 +23,36 @@ return { require('Comment').setup(opts) end, }, + { + 'uga-rosa/ccc.nvim', + lazy = false, + event = 'FileType', + keys = { + { 'cp', 'CccPick', desc = 'Color-picker' }, + }, + opts = { + highlighter = { + auto_enable = true, + lsp = true, + excludes = { 'lazy', 'mason', 'help', 'neo-tree' }, + }, + }, + }, + { + 'dhruvasagar/vim-table-mode', + lazy = false, + -- tm is automatically set for toggle + -- see t menu + }, + { + 'ziontee113/icon-picker.nvim', + keys = { + { '', 'IconPickerNormal', desc = 'pick icon' }, + { 'y', 'IconPickerYank', desc = 'yank icon' }, + }, + cmd = { 'IconPickerInsert', 'IconPickerYank', 'IconPickerNormal' }, + config = function() + require('icon-picker').setup { disable_legacy_commands = true } + end, + }, } diff --git a/lua/custom/plugins/init.lua b/lua/custom/plugins/init.lua index cf3b196..14067c6 100644 --- a/lua/custom/plugins/init.lua +++ b/lua/custom/plugins/init.lua @@ -8,345 +8,6 @@ return { -- -- Use the `dependencies` key to specify the dependencies of a particular plugin - { -- Fuzzy Finder (files, lsp, etc) - 'nvim-telescope/telescope.nvim', - cmd = 'Telescope', - dependencies = { - 'nvim-lua/plenary.nvim', - 'nvim-treesitter/nvim-treesitter', - { -- If encountering errors, see telescope-fzf-native README for installation instructions - 'nvim-telescope/telescope-fzf-native.nvim', - - -- `build` is used to run some command when the plugin is installed/updated. - -- This is only run then, not every time Neovim starts up. - build = 'make', - - -- `cond` is a condition used to determine whether this plugin should be - -- installed and loaded. - cond = function() - return vim.fn.executable 'make' == 1 - end, - }, - { 'nvim-telescope/telescope-ui-select.nvim' }, - - -- Useful for getting pretty icons, but requires a Nerd Font. - { 'nvim-tree/nvim-web-devicons', enabled = vim.g.have_nerd_font }, - }, - config = function() - -- Telescope is a fuzzy finder that comes with a lot of different things that - -- it can fuzzy find! It's more than just a "file finder", it can search - -- many different aspects of Neovim, your workspace, LSP, and more! - -- - -- The easiest way to use Telescope, is to start by doing something like: - -- :Telescope help_tags - -- - -- After running this command, a window will open up and you're able to - -- type in the prompt window. You'll see a list of `help_tags` options and - -- a corresponding preview of the help. - -- - -- Two important keymaps to use while in Telescope are: - -- - Insert mode: - -- - Normal mode: ? - -- - -- This opens a window that shows you all of the keymaps for the current - -- Telescope picker. This is really useful to discover what Telescope can - -- do as well as how to actually do it! - - -- [[ Configure Telescope ]] - -- See `:help telescope` and `:help telescope.setup()` - require('telescope').setup { - -- You can put your default mappings / updates / etc. in here - -- All the info you're looking for is in `:help telescope.setup()` - -- - -- defaults = { - -- mappings = { - -- i = { [''] = 'to_fuzzy_refine' }, - -- }, - -- }, - -- pickers = {} - extensions = { - ['ui-select'] = { - require('telescope.themes').get_dropdown(), - }, - }, - defaults = { - vimgrep_arguments = { - 'rg', - '-L', - '--color=never', - '--no-heading', - '--with-filename', - '--line-number', - '--column', - '--smart-case', - }, - prompt_prefix = '  ', - }, - } - - -- Enable Telescope extensions if they are installed - pcall(require('telescope').load_extension, 'fzf') - pcall(require('telescope').load_extension, 'ui-select') - - -- See `:help telescope.builtin` - local builtin = require 'telescope.builtin' - vim.keymap.set('n', 'fh', builtin.help_tags, { desc = '[F]ind [H]elp' }) - vim.keymap.set('n', 'fk', builtin.keymaps, { desc = '[F]ind [K]eymaps' }) - vim.keymap.set('n', 'ff', builtin.find_files, { desc = '[F]ind [F]iles' }) - vim.keymap.set('n', 'ft', builtin.builtin, { desc = '[F]ind [T]elescope' }) - vim.keymap.set('n', 'fw', builtin.live_grep, { desc = '[F]ind a [W]ord interactively' }) - vim.keymap.set('n', 'fcw', builtin.grep_string, { desc = '[F]ind [C]urrent [W]ord' }) - vim.keymap.set('n', 'fd', builtin.diagnostics, { desc = '[F]ind [D]iagnostics' }) - vim.keymap.set('n', 'fr', builtin.resume, { desc = '[F]ind [R]esume' }) - vim.keymap.set('n', 'fof.', builtin.oldfiles, { desc = '[F]ind [O]ld Files ("." for repeat)' }) - vim.keymap.set('n', '', builtin.buffers, { desc = '[ ] Find existing buffers' }) - vim.keymap.set('n', 'fb', builtin.buffers, { desc = '[F]ind existing [B]uffers' }) - vim.keymap.set('n', 'fm', builtin.marks, { desc = '[F]ind book[M]arks' }) - vim.keymap.set('n', 'fd', builtin.diagnostics, { desc = '[F]ind LSP [D]iagnostigs' }) - vim.keymap.set('n', 'fs', builtin.lsp_dynamic_workspace_symbols, { desc = '[F]ind LSP [S]ymbols' }) - - -- Slightly advanced example of overriding default behavior and theme - vim.keymap.set('n', '/', function() - -- You can pass additional configuration to Telescope to change the theme, layout, etc. - builtin.current_buffer_fuzzy_find(require('telescope.themes').get_dropdown { - winblend = 10, - previewer = false, - }) - end, { desc = '[/] Fuzzily search in current buffer' }) - - -- It's also possible to pass additional configuration options. - -- See `:help telescope.builtin.live_grep()` for information about particular keys - vim.keymap.set('n', 'f/', function() - builtin.live_grep { - grep_open_files = true, - prompt_title = 'Live Grep in Open Files', - } - end, { desc = '[F]ind [/] in Open Files' }) - - -- Shortcut for searching your Neovim configuration files - vim.keymap.set('n', 'fnf', function() - builtin.find_files { cwd = vim.fn.stdpath 'config' } - end, { desc = '[F]ind [N]eovim [F]iles' }) - end, - }, - - { -- LSP Configuration & Plugins - 'neovim/nvim-lspconfig', - dependencies = { - -- Automatically install LSPs and related tools to stdpath for Neovim - { 'williamboman/mason.nvim', config = true }, -- NOTE: Must be loaded before dependants - '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', opts = {} }, - - -- `neodev` configures Lua LSP for your Neovim config, runtime and plugins - -- used for completion, annotations and signatures of Neovim apis - { 'folke/neodev.nvim', opts = {} }, - }, - config = function() - -- Brief aside: **What is LSP?** - -- - -- LSP is an initialism you've probably heard, but might not understand what it is. - -- - -- LSP stands for Language Server Protocol. It's a protocol that helps editors - -- and language tooling communicate in a standardized fashion. - -- - -- In general, you have a "server" which is some tool built to understand a particular - -- language (such as `gopls`, `lua_ls`, `rust_analyzer`, etc.). These Language Servers - -- (sometimes called LSP servers, but that's kind of like ATM Machine) are standalone - -- processes that communicate with some "client" - in this case, Neovim! - -- - -- LSP provides Neovim with features like: - -- - Go to definition - -- - Find references - -- - Autocompletion - -- - Symbol Search - -- - and more! - -- - -- Thus, Language Servers are external tools that must be installed separately from - -- Neovim. This is where `mason` and related plugins come into play. - -- - -- If you're wondering about lsp vs treesitter, you can check out the wonderfully - -- and elegantly composed help section, `:help lsp-vs-treesitter` - - -- This function gets run when an LSP attaches to a particular buffer. - -- That is to say, every time a new file is opened that is associated with - -- an lsp (for example, opening `main.rs` is associated with `rust_analyzer`) this - -- function will be executed to configure the current buffer - vim.api.nvim_create_autocmd('LspAttach', { - group = vim.api.nvim_create_augroup('kickstart-lsp-attach', { clear = true }), - callback = function(event) - -- 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. - -- - -- 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 map = function(keys, func, desc) - vim.keymap.set('n', keys, func, { buffer = event.buf, desc = 'LSP: ' .. desc }) - end - - -- 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('gd', require('telescope.builtin').lsp_definitions, '[G]oto [D]efinition') - - -- Find references for the word under your cursor. - map('gr', require('telescope.builtin').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('gI', require('telescope.builtin').lsp_implementations, '[G]oto [I]mplementation') - - -- 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('D', require('telescope.builtin').lsp_type_definitions, 'Type [D]efinition') - - -- Fuzzy find all the symbols in your current document. - -- Symbols are things like variables, functions, types, etc. - map('ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') - - -- Fuzzy find all the symbols in your current workspace. - -- Similar to document symbols, except searches over your entire project. - map('ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') - - -- Rename the variable under your cursor. - -- Most Language Servers support renaming across files, etc. - map('rn', 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('ca', vim.lsp.buf.code_action, '[C]ode [A]ction') - - -- Opens a popup that displays documentation about the word under your cursor - -- See `:help K` for why this keymap. - map('K', vim.lsp.buf.hover, 'Hover Documentation') - - -- WARN: This is not Goto Definition, this is Goto Declaration. - -- For example, in C this would take you to the header. - map('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') - - -- 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.server_capabilities.documentHighlightProvider then - local highlight_augroup = vim.api.nvim_create_augroup('kickstart-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('kickstart-lsp-detach', { clear = true }), - callback = function(event2) - vim.lsp.buf.clear_references() - vim.api.nvim_clear_autocmds { group = 'kickstart-lsp-highlight', buffer = event2.buf } - end, - }) - end - - -- The following autocommand is used to enable inlay hints in your - -- code, if the language server you are using supports them - -- - -- This may be unwanted, since they displace some of your code - if client and client.server_capabilities.inlayHintProvider and vim.lsp.inlay_hint then - map('th', function() - vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) - end, '[T]oggle Inlay [H]ints') - end - end, - }) - - -- LSP servers and clients are able to communicate to each other what features they support. - -- By default, Neovim doesn't support everything that is in the LSP specification. - -- When you add nvim-cmp, luasnip, etc. Neovim now has *more* capabilities. - -- So, we create new capabilities with nvim cmp, and then broadcast that to the servers. - local capabilities = vim.lsp.protocol.make_client_capabilities() - capabilities = vim.tbl_deep_extend('force', capabilities, require('cmp_nvim_lsp').default_capabilities()) - - -- 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. Available keys are: - -- - cmd (table): Override the default command used to start the server - -- - filetypes (table): Override the default list of associated filetypes for the server - -- - capabilities (table): Override fields in capabilities. Can be used to disable certain LSP features. - -- - settings (table): Override the default settings passed when initializing the server. - -- For example, to see the options for `lua_ls`, you could go to: https://luals.github.io/wiki/settings/ - local servers = { - -- clangd = {}, - -- gopls = {}, - -- pyright = {}, - -- rust_analyzer = {}, - -- ... etc. See `:help lspconfig-all` for a list of all the pre-configured LSPs - -- - -- Some languages (like typescript) have entire language plugins that can be useful: - -- https://github.com/pmizio/typescript-tools.nvim - -- - -- But for many setups, the LSP (`tsserver`) will work just fine - -- tsserver = {}, - -- - - lua_ls = { - -- cmd = {...}, - -- filetypes = { ...}, - -- capabilities = {}, - settings = { - Lua = { - completion = { - callSnippet = 'Replace', - }, - -- You can toggle below to ignore Lua_LS's noisy `missing-fields` warnings - -- diagnostics = { disable = { 'missing-fields' } }, - }, - }, - }, - } - - -- Ensure the servers and tools above are installed - -- To check the current status of installed tools and/or manually install - -- other tools, you can run - -- :Mason - -- - -- You can press `g?` for help in this menu. - require('mason').setup() - - -- You can add other tools here that you want Mason to install - -- for you, so that they are available from within Neovim. - local ensure_installed = vim.tbl_keys(servers or {}) - vim.list_extend(ensure_installed, { - 'stylua', -- Used to format Lua code - }) - require('mason-tool-installer').setup { ensure_installed = ensure_installed } - - require('mason-lspconfig').setup { - handlers = { - function(server_name) - local server = servers[server_name] or {} - -- This handles overriding only values explicitly passed - -- by the server configuration above. Useful when disabling - -- certain features of an LSP (for example, turning off formatting for tsserver) - server.capabilities = vim.tbl_deep_extend('force', {}, capabilities, server.capabilities or {}) - require('lspconfig')[server_name].setup(server) - end, - }, - } - end, - }, - { -- Autoformat 'stevearc/conform.nvim', lazy = false, @@ -383,229 +44,51 @@ return { }, }, }, - - { -- Autocompletion - 'hrsh7th/nvim-cmp', - event = 'InsertEnter', - dependencies = { - -- Snippet Engine & its associated nvim-cmp source - { - 'L3MON4D3/LuaSnip', - build = (function() - -- Build Step is needed for regex support in snippets. - -- This step is not supported in many windows environments. - -- Remove the below condition to re-enable on windows. - if vim.fn.has 'win32' == 1 or vim.fn.executable 'make' == 0 then - return - end - return 'make install_jsregexp' - end)(), - dependencies = { - -- `friendly-snippets` contains a variety of premade snippets. - -- See the README about individual language/framework/plugin snippets: - -- https://github.com/rafamadriz/friendly-snippets - -- { - -- 'rafamadriz/friendly-snippets', - -- config = function() - -- require('luasnip.loaders.from_vscode').lazy_load() - -- end, - -- }, - }, - }, - 'saadparwaiz1/cmp_luasnip', - - -- Adds other completion capabilities. - -- nvim-cmp does not ship with all sources by default. They are split - -- into multiple repos for maintenance purposes. - 'hrsh7th/cmp-nvim-lsp', - 'hrsh7th/cmp-path', - }, + { + 'glacambre/firenvim', + enabled = vim.g.started_by_firenvim, + lazy = false, + build = function() + vim.fn['firenvim#install'](0) + end, config = function() - -- See `:help cmp` - local cmp = require 'cmp' - local luasnip = require 'luasnip' - luasnip.config.setup {} - - cmp.setup { - snippet = { - expand = function(args) - luasnip.lsp_expand(args.body) - end, - }, - completion = { completeopt = 'menu,menuone,noinsert' }, - - -- For an understanding of why these mappings were - -- chosen, you will need to read `:help ins-completion` - -- - -- No, but seriously. Please read `:help ins-completion`, it is really good! - mapping = cmp.mapping.preset.insert { - -- Select the [n]ext item - [''] = cmp.mapping.select_next_item(), - -- Select the [p]revious item - [''] = cmp.mapping.select_prev_item(), - - -- Scroll the documentation window [b]ack / [f]orward - [''] = cmp.mapping.scroll_docs(-4), - [''] = cmp.mapping.scroll_docs(4), - - -- Accept ([y]es) the completion. - -- This will auto-import if your LSP supports it. - -- This will expand snippets if the LSP sent a snippet. - [''] = cmp.mapping.confirm { select = true }, - - -- If you prefer more traditional completion keymaps, - -- you can uncomment the following lines - --[''] = cmp.mapping.confirm { select = true }, - --[''] = cmp.mapping.select_next_item(), - --[''] = cmp.mapping.select_prev_item(), - - -- Manually trigger a completion from nvim-cmp. - -- Generally you don't need this, because nvim-cmp will display - -- completions whenever it has completion options available. - [''] = cmp.mapping.complete {}, - - -- Think of as moving to the right of your snippet expansion. - -- So if you have a snippet that's like: - -- function $name($args) - -- $body - -- end - -- - -- will move you to the right of each of the expansion locations. - -- is similar, except moving you backwards. - [''] = cmp.mapping(function() - if luasnip.expand_or_locally_jumpable() then - luasnip.expand_or_jump() - end - end, { 'i', 's' }), - [''] = cmp.mapping(function() - if luasnip.locally_jumpable(-1) then - luasnip.jump(-1) - end - end, { 'i', 's' }), - - -- For more advanced Luasnip keymaps (e.g. selecting choice nodes, expansion) see: - -- https://github.com/L3MON4D3/LuaSnip?tab=readme-ov-file#keymaps - }, - sources = { - { name = 'nvim_lsp' }, - { name = 'luasnip' }, - { name = 'path' }, + vim.g.firenvim_config = { + localSettings = { + ['.*'] = { + filename = '/tmp/{hostname}_{pathname%10}.{extension%5}', + cmdline = 'firenvim', + takeover = 'never', -- can't open it with never at all? + }, }, } end, }, - - { -- You can easily change to a different colorscheme. - -- Change the name of the colorscheme plugin below, and then - -- change the command in the config to whatever the name of that colorscheme is. - -- - -- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`. - 'folke/tokyonight.nvim', - priority = 1000, -- Make sure to load this before all the other start plugins. - init = function() - -- Load the colorscheme here. - -- Like many other themes, this one has different styles, and you could load - -- any other, such as 'tokyonight-storm', 'tokyonight-moon', or 'tokyonight-day'. - vim.cmd.colorscheme 'tokyonight-night' - - -- You can configure highlights by doing something like: - vim.cmd.hi 'Comment gui=none' - end, + { + -- enables UNIX specific stuff in vim, + -- specifically: + -- :SudoWrite + -- :SudoRead + -- :Chmod + -- and also some more, but those are easy done with shell + 'tpope/vim-eunuch', + lazy = false, }, - - -- Highlight todo, notes, etc in comments - { 'folke/todo-comments.nvim', event = 'VimEnter', dependencies = { 'nvim-lua/plenary.nvim' }, opts = { signs = false } }, - - { -- Collection of various small independent plugins/modules - 'echasnovski/mini.nvim', + { + 'mikesmithgh/kitty-scrollback.nvim', + enabled = true, + lazy = true, + cmd = { 'KittyScrollbackGenerateKittens', 'KittyScrollbackCheckHealth' }, + event = { 'User KittyScrollbackLaunch' }, + -- version = '*', -- latest stable version, may have breaking changes if major version changed + -- version = '^3.0.0', -- pin major version, include fixes and features that do not have breaking changes config = function() - -- Better Around/Inside textobjects - -- - -- Examples: - -- - va) - [V]isually select [A]round [)]paren - -- - yinq - [Y]ank [I]nside [N]ext [']quote - -- - ci' - [C]hange [I]nside [']quote - require('mini.ai').setup { n_lines = 500 } - - -- Add/delete/replace surroundings (brackets, quotes, etc.) - -- - -- - saiw) - [S]urround [A]dd [I]nner [W]ord [)]Paren - -- - sd' - [S]urround [D]elete [']quotes - -- - sr)' - [S]urround [R]eplace [)] ['] - require('mini.surround').setup() - - -- Simple and easy statusline. - -- You could remove this setup call if you don't like it, - -- and try some other statusline plugin - local statusline = require 'mini.statusline' - -- set use_icons to true if you have a Nerd Font - statusline.setup { use_icons = vim.g.have_nerd_font } - - -- You can configure sections in the statusline by overriding their - -- default behavior. For example, here we set the section for - -- cursor location to LINE:COLUMN - ---@diagnostic disable-next-line: duplicate-set-field - statusline.section_location = function() - return '%2l:%-2v' - end - - -- ... and there is more! - -- Check out: https://github.com/echasnovski/mini.nvim - end, - }, - { -- Highlight, edit, and navigate code - 'nvim-treesitter/nvim-treesitter', - build = ':TSUpdate', - opts = { - ensure_installed = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'vim', 'vimdoc' }, - -- Autoinstall languages that are not installed - auto_install = true, - highlight = { - enable = true, - -- Some languages depend on vim's regex highlighting system (such as Ruby) for indent rules. - -- If you are experiencing weird indenting issues, add the language to - -- the list of additional_vim_regex_highlighting and disabled languages for indent. - additional_vim_regex_highlighting = { 'ruby' }, - }, - indent = { enable = true, disable = { 'ruby' } }, - }, - config = function(_, opts) - -- [[ Configure Treesitter ]] See `:help nvim-treesitter` - - -- Prefer git instead of curl in order to improve connectivity in some environments - require('nvim-treesitter.install').prefer_git = true - ---@diagnostic disable-next-line: missing-fields - require('nvim-treesitter.configs').setup(opts) - - -- There are additional nvim-treesitter modules that you can use to interact - -- with nvim-treesitter. You should go explore a few and see what interests you: - -- - -- - Incremental selection: Included, see `:help nvim-treesitter-incremental-selection-mod` - -- - Show your current context: https://github.com/nvim-treesitter/nvim-treesitter-context - -- - Treesitter + textobjects: https://github.com/nvim-treesitter/nvim-treesitter-textobjects + require('kitty-scrollback').setup { + myconfig = function() + return { keymaps_enabled = false } + end, + } end, }, - -- The following two comments only work if you have downloaded the kickstart repo, not just copy pasted the - -- init.lua. If you want these files, they are in the repository, so you can just download them and - -- place them in the correct locations. - - -- NOTE: Next step on your Neovim journey: Add/Configure additional plugins for Kickstart - -- - -- Here are some example plugins that I've included in the Kickstart repository. - -- Uncomment any of the lines below to enable them (you will need to restart nvim). - -- - -- require 'kickstart.plugins.debug', - -- require 'kickstart.plugins.indent_line', - -- require 'kickstart.plugins.lint', - -- require 'kickstart.plugins.autopairs', - -- require 'kickstart.plugins.neo-tree', - -- require 'kickstart.plugins.gitsigns', -- adds gitsigns recommend keymaps - - -- NOTE: The import below can automatically add your own plugins, configuration, etc from `lua/custom/plugins/*.lua` - -- This is the easiest way to modularize your config. - -- - -- Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going. - -- For additional information, see `:help lazy.nvim-lazy.nvim-structuring-your-plugins` { import = 'custom.plugins' }, } diff --git a/lua/custom/plugins/lsp.lua b/lua/custom/plugins/lsp.lua index 56c7785..c032663 100644 --- a/lua/custom/plugins/lsp.lua +++ b/lua/custom/plugins/lsp.lua @@ -1,6 +1,63 @@ +local cmp = require 'cmp' return { { 'neovim/nvim-lspconfig', + dependencies = { + -- Automatically install LSPs and related tools to stdpath for Neovim + { 'williamboman/mason.nvim', config = true }, -- NOTE: Must be loaded before dependants + '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', opts = {} }, + + -- `neodev` configures Lua LSP for your Neovim config, runtime and plugins + -- used for completion, annotations and signatures of Neovim apis + { 'folke/neodev.nvim', opts = {} }, + }, + keys = { + { '', cmp.mapping.select_prev_item(), desc = 'Next completion' }, + { '', cmp.mapping.select_next_item(), desc = 'Last completion' }, + { '', cmp.mapping.complete(), desc = 'Accept completion' }, + { '', cmp.mapping.close(), desc = 'Hide completions' }, + { '', cmp.mapping.confirm { + behavior = cmp.ConfirmBehavior.Insert, + select = true, + }, desc = 'Accept completion' }, + { + '', + cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif require('luasnip').expand_or_jumpable() then + vim.fn.feedkeys(vim.api.nvim_replace_termcodes('luasnip-expand-or-jump', true, true, true), '') + else + fallback() + end + end, { + 'i', + 's', + }), + desc = 'Next completion', + }, + { + '', + cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif require('luasnip').expand_or_jumpable() then + vim.fn.feedkeys(vim.api.nvim_replace_termcodes('luasnip-expand-or-jump', true, true, true), '') + else + fallback() + end + end, { + 'i', + 's', + }), + desc = 'Last completion', + }, + }, config = function() require 'custom.plugins.configs.lsp' end, @@ -18,4 +75,386 @@ return { }, }, }, + { + 'folke/trouble.nvim', + cmd = 'Trouble', + opts = { use_diagnostic_signs = true }, + -- stylua: ignore + keys = { + { 'rb', "Trouble diagnostics toggle filter.buf=0", desc = 'Document Diagnostics (Trouble)' }, + { 'rr', 'Trouble diagnostics toggle', desc = 'Workspace Diagnostics (Trouble)' }, + { 'rq', "Trouble qflist toggle", desc = 'Quickfix List (Trouble)' }, + { 'rl', "Trouble loclist toggle", desc = 'Location List (Trouble)' }, + { 'rd', "Trouble symbols", desc = 'LSP symbols (Trouble)' }, + { 'rt', "Trouble todo", desc = 'Todos (Trouble)' }, + { + '[q', + function() + if require('trouble').is_open() then + require('trouble').previous({ skip_groups = true, jump = true }) + else + vim.cmd.cprev() + end + end, + desc = 'Previous trouble/quickfix item', + }, + { + ']q', + function() + if require('trouble').is_open() then + require('trouble').next({ skip_groups = true, jump = true }) + else + vim.cmd.cnext() + end + end, + desc = 'Next trouble/quickfix item', + }, + }, + }, + { -- Autocompletion + 'hrsh7th/nvim-cmp', + enabled = false, + event = 'InsertEnter', + dependencies = { + -- Snippet Engine & its associated nvim-cmp source + { + 'L3MON4D3/LuaSnip', + build = (function() + -- Build Step is needed for regex support in snippets. + -- This step is not supported in many windows environments. + -- Remove the below condition to re-enable on windows. + if vim.fn.has 'win32' == 1 or vim.fn.executable 'make' == 0 then + return + end + return 'make install_jsregexp' + end)(), + dependencies = { + -- `friendly-snippets` contains a variety of premade snippets. + -- See the README about individual language/framework/plugin snippets: + -- https://github.com/rafamadriz/friendly-snippets + -- { + -- 'rafamadriz/friendly-snippets', + -- config = function() + -- require('luasnip.loaders.from_vscode').lazy_load() + -- end, + -- }, + }, + }, + 'saadparwaiz1/cmp_luasnip', + + -- Adds other completion capabilities. + -- nvim-cmp does not ship with all sources by default. They are split + -- into multiple repos for maintenance purposes. + 'hrsh7th/cmp-nvim-lsp', + 'hrsh7th/cmp-path', + }, + config = function() + -- See `:help cmp` + local cmp = require 'cmp' + local luasnip = require 'luasnip' + luasnip.config.setup {} + + cmp.setup { + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) + end, + }, + completion = { completeopt = 'menu,menuone,noinsert' }, + + -- For an understanding of why these mappings were + -- chosen, you will need to read `:help ins-completion` + -- + -- No, but seriously. Please read `:help ins-completion`, it is really good! + mapping = cmp.mapping.preset.insert { + -- Select the [n]ext item + [''] = cmp.mapping.select_next_item(), + -- Select the [p]revious item + [''] = cmp.mapping.select_prev_item(), + + -- Scroll the documentation window [b]ack / [f]orward + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + + -- Accept ([y]es) the completion. + -- This will auto-import if your LSP supports it. + -- This will expand snippets if the LSP sent a snippet. + [''] = cmp.mapping.confirm { select = true }, + + -- If you prefer more traditional completion keymaps, + -- you can uncomment the following lines + --[''] = cmp.mapping.confirm { select = true }, + --[''] = cmp.mapping.select_next_item(), + --[''] = cmp.mapping.select_prev_item(), + + -- Manually trigger a completion from nvim-cmp. + -- Generally you don't need this, because nvim-cmp will display + -- completions whenever it has completion options available. + [''] = cmp.mapping.complete {}, + + -- Think of as moving to the right of your snippet expansion. + -- So if you have a snippet that's like: + -- function $name($args) + -- $body + -- end + -- + -- will move you to the right of each of the expansion locations. + -- is similar, except moving you backwards. + [''] = cmp.mapping(function() + if luasnip.expand_or_locally_jumpable() then + luasnip.expand_or_jump() + end + end, { 'i', 's' }), + [''] = cmp.mapping(function() + if luasnip.locally_jumpable(-1) then + luasnip.jump(-1) + end + end, { 'i', 's' }), + + -- For more advanced Luasnip keymaps (e.g. selecting choice nodes, expansion) see: + -- https://github.com/L3MON4D3/LuaSnip?tab=readme-ov-file#keymaps + }, + sources = { + { name = 'nvim_lsp' }, + { name = 'luasnip' }, + { name = 'path' }, + }, + } + end, + }, + { -- Highlight, edit, and navigate code + 'nvim-treesitter/nvim-treesitter', + build = ':TSUpdate', + opts = { + ensure_installed = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'vim', 'vimdoc' }, + -- Autoinstall languages that are not installed + auto_install = true, + highlight = { + enable = true, + -- Some languages depend on vim's regex highlighting system (such as Ruby) for indent rules. + -- If you are experiencing weird indenting issues, add the language to + -- the list of additional_vim_regex_highlighting and disabled languages for indent. + additional_vim_regex_highlighting = { 'ruby' }, + }, + indent = { enable = true, disable = { 'ruby' } }, + }, + config = function(_, opts) + -- [[ Configure Treesitter ]] See `:help nvim-treesitter` + + -- Prefer git instead of curl in order to improve connectivity in some environments + require('nvim-treesitter.install').prefer_git = true + ---@diagnostic disable-next-line: missing-fields + require('nvim-treesitter.configs').setup(opts) + + -- There are additional nvim-treesitter modules that you can use to interact + -- with nvim-treesitter. You should go explore a few and see what interests you: + -- + -- - Incremental selection: Included, see `:help nvim-treesitter-incremental-selection-mod` + -- - Show your current context: https://github.com/nvim-treesitter/nvim-treesitter-context + -- - Treesitter + textobjects: https://github.com/nvim-treesitter/nvim-treesitter-textobjects + end, + }, + { + 'kevinhwang91/nvim-bqf', + ft = 'qf', + cmd = 'BqfAutoToggle', + event = 'QuickFixCmdPost', + opts = { + auto_resize_height = false, + func_map = { + tab = 'st', + split = 'sv', + vsplit = 'sg', + + stoggleup = 'K', + stoggledown = 'J', + stogglevm = '', + + ptoggleitem = 'p', + ptoggleauto = 'P', + ptogglemode = 'zp', + + pscrollup = '', + pscrolldown = '', + + prevfile = 'gk', + nextfile = 'gj', + + prevhist = '', + nexthist = '', + }, + preview = { + auto_preview = true, + should_preview_cb = function(bufnr) + -- file size greater than 100kb can't be previewed automatically + local filename = vim.api.nvim_buf_get_name(bufnr) + local fsize = vim.fn.getfsize(filename) + if fsize > 100 * 1024 then + return false + end + return true + end, + }, + }, + }, + { + 'rmagatti/goto-preview', + event = 'FileType', + config = function() + require('core.utils').load_mappings 'goto_preview' + require('goto-preview').setup {} + end, + dependencies = 'nvim-telescope/telescope.nvim', + opts = { + width = 78, + height = 15, + default_mappings = false, + opacity = 10, + }, + }, + { 'kosayoda/nvim-lightbulb', event = { 'BufReadPre', 'BufNewFile' } }, + { + 'hrsh7th/nvim-cmp', + enabled = not vim.g.started_by_firenvim, + }, + { + 'mfussenegger/nvim-dap', + lazy = false, + init = function() + require('core.utils').load_mappings 'debug' + end, + config = function() + local dap = require 'dap' + local mason_registry = require 'mason-registry' + local codelldb_root = mason_registry.get_package('codelldb'):get_install_path() .. '/extension/' + local codelldb_path = codelldb_root .. 'adapter/codelldb' + local liblldb_path = codelldb_root .. 'lldb/lib/liblldb.so' + dap.defaults.fallback.external_terminal = { + command = '/home/plex/.local/bin/kitty', + args = {}, + } + dap.adapters.gdb = { + type = 'executable', + command = 'gdb', + args = { '-i', 'dap' }, + } + dap.adapters.codelldb = { + type = 'server', + port = '30333', + executable = { + command = codelldb_path, + args = { '--port', '30333' }, + detached = false, + }, + } + dap.configurations.cpp = { + { + name = 'Launch file', + type = 'codelldb', + request = 'launch', + program = function() + return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/', 'file') + end, + args = function() + return require('custom.utils').tokenize_args(vim.fn.input 'args: ') + end, + cwd = '${workspaceFolder}', + -- FIXME: perhaps we can put the stdio somewhere more practical + stopOnEntry = false, + }, + } + dap.configurations.c = dap.configurations.cpp + dap.configurations.rust = dap.configurations.cpp + end, + }, + { + 'rcarriga/nvim-dap-ui', + init = function() + require('core.utils').load_mappings 'debug' + end, + dependencies = { + 'mfussenegger/nvim-dap', + 'nvim-neotest/nvim-nio', + }, + config = function(_, opts) + local dap = require 'dap' + local dapui = require 'dapui' + dapui.setup(opts) + dap.listeners.after.event_initialized['dapui_config'] = function() + dapui.open {} + end + dap.listeners.before.event_terminated['dapui_config'] = function() + -- dapui.close {} + end + dap.listeners.before.event_exited['dapui_config'] = function() + -- dapui.close {} + end + end, + }, + { + 'folke/lazydev.nvim', + ft = 'lua', -- only load on lua files + opts = { + library = { + -- See the configuration section for more details + -- Load luvit types when the `vim.uv` word is found + { path = 'luvit-meta/library', words = { 'vim%.uv' } }, + }, + }, + }, + { 'Bilal2453/luvit-meta', lazy = true }, -- optional `vim.uv` typings + { -- optional completion source for require statements and module annotations + 'hrsh7th/nvim-cmp', + opts = function(_, opts) + opts.sources = opts.sources or {} + table.insert(opts.sources, { + name = 'lazydev', + group_index = 0, -- set group index to 0 to skip loading LuaLS completions + }) + end, + }, + { + 'mrcjkb/rustaceanvim', + enabled = false, + version = '^4', -- Recommended + ft = { 'rust' }, + config = function() + local dap = require 'dap' + vim.g.rustaceanvim = { + enable_clippy = true, + -- Plugin configuration + tools = { + enable_clippy = true, + }, + -- LSP configuration + server = { + on_attach = function(client, bufnr) + -- you can also put keymaps in here + end, + settings = { + -- rust-analyzer language server configuration + ['rust-analyzer'] = { + cargo = { + features = 'all', + }, + }, + }, + }, + -- DAP configuration + dap = { + -- FIXME: the rustaceanvim debug config does not map the stdout/stderr to the + -- opened terminal, effectively rendering debugging with it useless. Luckily, + -- we can use the regular nvim-dap and nvim-dap-ui. + adapter = dap.adapters.codelldb, + }, + } + end, + }, + { + 'theHamsta/nvim-dap-virtual-text', + lazy = false, -- PERF: this can be done more elegant + config = function() + require('nvim-dap-virtual-text').setup() + end, + }, } diff --git a/lua/custom/plugins/telescope.lua b/lua/custom/plugins/telescope.lua index a564707..86b46c5 100644 --- a/lua/custom/plugins/telescope.lua +++ b/lua/custom/plugins/telescope.lua @@ -1 +1,159 @@ -return {} +return { + { -- Fuzzy Finder (files, lsp, etc) + 'nvim-telescope/telescope.nvim', + cmd = 'Telescope', + dependencies = { + 'nvim-lua/plenary.nvim', + 'nvim-treesitter/nvim-treesitter', + { -- If encountering errors, see telescope-fzf-native README for installation instructions + 'nvim-telescope/telescope-fzf-native.nvim', + + -- `build` is used to run some command when the plugin is installed/updated. + -- This is only run then, not every time Neovim starts up. + build = 'make', + + -- `cond` is a condition used to determine whether this plugin should be + -- installed and loaded. + cond = function() + return vim.fn.executable 'make' == 1 + end, + }, + { 'nvim-telescope/telescope-ui-select.nvim' }, + + -- Useful for getting pretty icons, but requires a Nerd Font. + { 'nvim-tree/nvim-web-devicons', enabled = vim.g.have_nerd_font }, + }, + config = function() + -- Telescope is a fuzzy finder that comes with a lot of different things that + -- it can fuzzy find! It's more than just a "file finder", it can search + -- many different aspects of Neovim, your workspace, LSP, and more! + -- + -- The easiest way to use Telescope, is to start by doing something like: + -- :Telescope help_tags + -- + -- After running this command, a window will open up and you're able to + -- type in the prompt window. You'll see a list of `help_tags` options and + -- a corresponding preview of the help. + -- + -- Two important keymaps to use while in Telescope are: + -- - Insert mode: + -- - Normal mode: ? + -- + -- This opens a window that shows you all of the keymaps for the current + -- Telescope picker. This is really useful to discover what Telescope can + -- do as well as how to actually do it! + + -- [[ Configure Telescope ]] + -- See `:help telescope` and `:help telescope.setup()` + require('telescope').setup { + -- You can put your default mappings / updates / etc. in here + -- All the info you're looking for is in `:help telescope.setup()` + -- + -- defaults = { + -- mappings = { + -- i = { [''] = 'to_fuzzy_refine' }, + -- }, + -- }, + -- pickers = {} + extensions = { + ['ui-select'] = { + require('telescope.themes').get_dropdown(), + }, + }, + defaults = { + vimgrep_arguments = { + 'rg', + '-L', + '--color=never', + '--no-heading', + '--with-filename', + '--line-number', + '--column', + '--smart-case', + }, + prompt_prefix = '  ', + }, + } + + -- Enable Telescope extensions if they are installed + pcall(require('telescope').load_extension, 'fzf') + pcall(require('telescope').load_extension, 'ui-select') + + -- See `:help telescope.builtin` + local builtin = require 'telescope.builtin' + vim.keymap.set('n', 'fh', builtin.help_tags, { desc = '[F]ind [H]elp' }) + vim.keymap.set('n', 'fk', builtin.keymaps, { desc = '[F]ind [K]eymaps' }) + vim.keymap.set('n', 'ff', builtin.find_files, { desc = '[F]ind [F]iles' }) + vim.keymap.set('n', 'ft', builtin.builtin, { desc = '[F]ind [T]elescope' }) + vim.keymap.set('n', 'fw', builtin.live_grep, { desc = '[F]ind a [W]ord interactively' }) + vim.keymap.set('n', 'fcw', builtin.grep_string, { desc = '[F]ind [C]urrent [W]ord' }) + vim.keymap.set('n', 'fd', builtin.diagnostics, { desc = '[F]ind [D]iagnostics' }) + vim.keymap.set('n', 'fr', builtin.resume, { desc = '[F]ind [R]esume' }) + vim.keymap.set('n', 'fof.', builtin.oldfiles, { desc = '[F]ind [O]ld Files ("." for repeat)' }) + vim.keymap.set('n', '', builtin.buffers, { desc = '[ ] Find existing buffers' }) + vim.keymap.set('n', 'fb', builtin.buffers, { desc = '[F]ind existing [B]uffers' }) + vim.keymap.set('n', 'fm', builtin.marks, { desc = '[F]ind book[M]arks' }) + vim.keymap.set('n', 'fd', builtin.diagnostics, { desc = '[F]ind LSP [D]iagnostigs' }) + vim.keymap.set('n', 'fs', builtin.lsp_dynamic_workspace_symbols, { desc = '[F]ind LSP [S]ymbols' }) + + -- Slightly advanced example of overriding default behavior and theme + vim.keymap.set('n', '/', function() + -- You can pass additional configuration to Telescope to change the theme, layout, etc. + builtin.current_buffer_fuzzy_find(require('telescope.themes').get_dropdown { + winblend = 10, + previewer = false, + }) + end, { desc = '[/] Fuzzily search in current buffer' }) + + -- It's also possible to pass additional configuration options. + -- See `:help telescope.builtin.live_grep()` for information about particular keys + vim.keymap.set('n', 'f/', function() + builtin.live_grep { + grep_open_files = true, + prompt_title = 'Live Grep in Open Files', + } + end, { desc = '[F]ind [/] in Open Files' }) + + -- Shortcut for searching your Neovim configuration files + vim.keymap.set('n', 'fnf', function() + builtin.find_files { cwd = vim.fn.stdpath 'config' } + end, { desc = '[F]ind [N]eovim [F]iles' }) + end, + }, + { + 'jvgrootveld/telescope-zoxide', + dependencies = 'nvim-telescope/telescope.nvim', + config = function() + -- Useful for easily creating commands + local z_utils = require 'telescope._extensions.zoxide.utils' + + require('telescope').setup { + -- (other Telescope configuration...) + extensions = { + zoxide = { + prompt_title = '[ Walking on the shoulders of TJ ]', + mappings = { + default = { + after_action = function(selection) + print('Update to (' .. selection.z_score .. ') ' .. selection.path) + end, + }, + [''] = { + before_action = function(selection) + print 'before C-s' + end, + action = function(selection) + vim.cmd.edit(selection.path) + end, + }, + -- Opens the selected entry in a new split + [''] = { action = z_utils.create_basic_command 'split' }, + }, + }, + }, + } + require('telescope').load_extension 'zoxide' + end, + }, + { 'nanotee/zoxide.vim', lazy = false, enabled = false }, +} diff --git a/lua/custom/plugins/ui.lua b/lua/custom/plugins/ui.lua index d37e90c..1b832fb 100644 --- a/lua/custom/plugins/ui.lua +++ b/lua/custom/plugins/ui.lua @@ -240,42 +240,6 @@ return { }, }, }, - { - 'folke/trouble.nvim', - cmd = 'Trouble', - opts = { use_diagnostic_signs = true }, - -- stylua: ignore - keys = { - { 'rb', "Trouble diagnostics toggle filter.buf=0", desc = 'Document Diagnostics (Trouble)' }, - { 'rr', 'Trouble diagnostics toggle', desc = 'Workspace Diagnostics (Trouble)' }, - { 'rq', "Trouble qflist toggle", desc = 'Quickfix List (Trouble)' }, - { 'rl', "Trouble loclist toggle", desc = 'Location List (Trouble)' }, - { 'rd', "Trouble symbols", desc = 'LSP symbols (Trouble)' }, - { 'rt', "Trouble todo", desc = 'Todos (Trouble)' }, - { - '[q', - function() - if require('trouble').is_open() then - require('trouble').previous({ skip_groups = true, jump = true }) - else - vim.cmd.cprev() - end - end, - desc = 'Previous trouble/quickfix item', - }, - { - ']q', - function() - if require('trouble').is_open() then - require('trouble').next({ skip_groups = true, jump = true }) - else - vim.cmd.cnext() - end - end, - desc = 'Next trouble/quickfix item', - }, - }, - }, { 'akinsho/toggleterm.nvim', keys = { @@ -302,4 +266,244 @@ return { }, }, }, + { -- You can easily change to a different colorscheme. + -- Change the name of the colorscheme plugin below, and then + -- change the command in the config to whatever the name of that colorscheme is. + -- + -- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`. + 'folke/tokyonight.nvim', + priority = 1000, -- Make sure to load this before all the other start plugins. + init = function() + -- Load the colorscheme here. + -- Like many other themes, this one has different styles, and you could load + -- any other, such as 'tokyonight-storm', 'tokyonight-moon', or 'tokyonight-day'. + vim.cmd.colorscheme 'tokyonight-night' + + -- You can configure highlights by doing something like: + vim.cmd.hi 'Comment gui=none' + end, + }, + { + 'folke/noice.nvim', + enabled = not vim.g.started_by_firenvim, + event = 'VeryLazy', + -- config.lsp.signature.enabled = false + dependencies = { + -- if you lazy-load any plugin below, make sure to add proper `module="..."` entries + 'MunifTanjim/nui.nvim', + -- OPTIONAL: + -- `nvim-notify` is only needed, if you want to use the notification view. + -- If not available, we use `mini` as the fallback + 'rcarriga/nvim-notify', + }, + config = function() + require('notify').setup { + top_down = false, + } + require('noice').setup { + lsp = { + override = { + ['vim.lsp.util.convert_input_to_markdown_lines'] = true, + ['vim.lsp.util.stylize_markdown'] = true, + ['cmp.entry.get_documentation'] = true, + }, + -- IDK how to disable the nvchad builtins for this, which would + -- produce a conflict + signature = { enabled = false }, + hover = { enabled = false }, + progress = { + enabled = true, + -- Lsp Progress is formatted using the builtins for lsp_progress. See config.format.builtin + -- See the section on formatting for more details on how to customize. + --- @type NoiceFormat|string + format = 'lsp_progress', + --- @type NoiceFormat|string + format_done = 'lsp_progress_done', + throttle = 1000 / 30, -- frequency to update lsp progress message + view = 'mini', -- default: mini + }, + }, + -- you can enable a preset for easier configuration + presets = { + bottom_search = true, -- use a classic bottom cmdline for search + command_palette = true, -- position the cmdline and popupmenu together + long_message_to_split = true, -- long messages will be sent to a split + inc_rename = true, -- enables an input dialog for inc-rename.nvim + lsp_doc_border = true, -- add a border to hover docs and signature help + }, + messages = { + enabled = true, + -- NOTE: we keep it with notify, + -- change this to something else if you want + view_error = 'notify', + }, + popupmenu = { + enabled = true, + }, + notify = { + enabled = true, + }, + } + end, + }, + { + 'stevearc/dressing.nvim', + init = function() + ---@diagnostic disable-next-line: duplicate-set-field + vim.ui.select = function(...) + require('lazy').load { plugins = { 'dressing.nvim' } } + return vim.ui.select(...) + end + ---@diagnostic disable-next-line: duplicate-set-field + vim.ui.input = function(...) + require('lazy').load { plugins = { 'dressing.nvim' } } + return vim.ui.input(...) + end + end, + }, + { + 'chentoast/marks.nvim', + lazy = false, + dependencies = 'lewis6991/gitsigns.nvim', + event = 'FileType', + opts = { + sign_priority = { lower = 10, upper = 15, builtin = 8, bookmark = 20 }, + bookmark_1 = { sign = '󰉀' }, -- ⚐ ⚑ 󰈻 󰈼 󰈽 󰈾 󰈿 󰉀 + }, + }, + { + 'Bekaboo/deadcolumn.nvim', + event = { 'BufReadPre', 'BufNewFile' }, + }, + { + 'kevinhwang91/nvim-ufo', + event = { 'BufReadPost', 'BufNewFile' }, + -- stylua: ignore + keys = { + { 'zR', function() require('ufo').openAllFolds() end }, + { 'zM', function() require('ufo').closeAllFolds() end }, + }, + dependencies = { + 'kevinhwang91/promise-async', + 'nvim-treesitter/nvim-treesitter', + 'neovim/nvim-lspconfig', + }, + opts = function() + -- fancy display function for folds (stolen from nvim-ufo readme) + local handler = function(virtText, lnum, endLnum, width, truncate) + local newVirtText = {} + local suffix = (' 󰁂 %d '):format(endLnum - lnum) + local sufWidth = vim.fn.strdisplaywidth(suffix) + local targetWidth = width - sufWidth + local curWidth = 0 + for _, chunk in ipairs(virtText) do + local chunkText = chunk[1] + local chunkWidth = vim.fn.strdisplaywidth(chunkText) + if targetWidth > curWidth + chunkWidth then + table.insert(newVirtText, chunk) + else + chunkText = truncate(chunkText, targetWidth - curWidth) + local hlGroup = chunk[2] + table.insert(newVirtText, { chunkText, hlGroup }) + chunkWidth = vim.fn.strdisplaywidth(chunkText) + -- str width returned from truncate() may less than 2nd argument, need padding + if curWidth + chunkWidth < targetWidth then + suffix = suffix .. (' '):rep(targetWidth - curWidth - chunkWidth) + end + break + end + curWidth = curWidth + chunkWidth + end + table.insert(newVirtText, { suffix, 'MoreMsg' }) + return newVirtText + end + require('ufo').setup { + -- use treesitter to get the folds + provider_selector = function(bufnr, filetype, buftype) + return { 'treesitter', 'indent' } + end, + -- apply out fancy fold display + fold_virt_text_handler = handler, + } + end, + }, + { + 'b0o/incline.nvim', + event = 'FileType', + config = function() + local function get_diagnostic_label(props) + local icons = { error = '', warn = '', info = '', hint = '' } + local label = {} + + for severity, icon in pairs(icons) do + local n = #vim.diagnostic.get(props.buf, { severity = vim.diagnostic.severity[string.upper(severity)] }) + if n > 0 then + table.insert(label, { icon .. ' ' .. n .. ' ', group = 'DiagnosticSign' .. severity }) + end + end + if #label > 0 then + table.insert(label, { '| ' }) + end + return label + end + local function get_git_diff(props) + local icons = { removed = '', changed = '', added = '' } + local labels = {} + -- local signs = vim.api.nvim_buf_get_var(props.buf, "gitsigns_status_dict") + -- local signs = vim.b.gitsigns_status_dict + -- for name, icon in pairs(icons) do + -- if tonumber(signs[name]) and signs[name] > 0 then + -- table.insert(labels, { icon .. " " .. signs[name] .. " ", group = "Diff" .. name }) + -- end + -- end + if #labels > 0 then + table.insert(labels, { '| ' }) + end + return labels + end + + require('incline').setup { + render = function(props) + local filename = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(props.buf), ':t') + local ft_icon, ft_color = require('nvim-web-devicons').get_icon_color(filename) + local modified = vim.api.nvim_buf_get_option(props.buf, 'modified') and 'bold,italic' or 'bold' + + local buffer = { + { get_diagnostic_label(props) }, + { get_git_diff(props) }, + { ft_icon, guifg = ft_color }, + { ' ' }, + { filename, gui = modified }, + } + return buffer + end, + } + end, + }, + { + 'iamcco/markdown-preview.nvim', + cmd = { 'MarkdownPreviewToggle', 'MarkdownPreview', 'MarkdownPreviewStop' }, + ft = { 'markdown' }, + build = function() + vim.fn['mkdp#util#install']() + end, + config = function() + -- Ugly fix for wsl not finding my browser + -- I HATE windows + vim.g.mkdp_echo_preview_url = 1 + end, + }, + { + 'nvim-lualine/lualine.nvim', + lazy = false, + dependencies = { + 'nvim-tree/nvim-web-devicons', + 'NvChad/ui', -- load after nvchad ui + }, + config = function() + -- TODO: add lsp module for lualine + -- Maybe we can steal modules from the nvchad ui + require('lualine').setup() + end, + }, }