# 🚦 Trouble A pretty list for showing diagnostics, references, telescope results, quickfix and location lists to help you solve all the trouble your code is causing. ![LSP Trouble Screenshot](./media/shot.png) ## ✨ Features - pretty list of: - Diagnostics - LSP references - LSP implementations - LSP definitions - LSP type definitions - quickfix list - location list - [Telescope](https://github.com/nvim-telescope/telescope.nvim) search results - automatically updates on new diagnostics - toggle **diagnostics** mode between **workspace** or **document** - **interactive preview** in your last accessed window - _cancel_ preview or _jump_ to the location - configurable actions, signs, highlights,... ## ⚡️ Requirements - Neovim >= 0.7.2 - Properly configured Neovim LSP client - [nvim-web-devicons](https://github.com/nvim-tree/nvim-web-devicons) is optional to enable file icons - a theme with properly configured highlight groups for Neovim Diagnostics - or install 🌈 [lsp-colors](https://github.com/folke/lsp-colors.nvim) to automatically create the missing highlight groups - a [patched font](https://www.nerdfonts.com/) for the default severity and fold icons ## 📦 Installation Install the plugin with your preferred package manager: ### [lazy.nvim](https://github.com/folke/lazy.nvim) ```lua return { "folke/trouble.nvim", dependencies = { "nvim-tree/nvim-web-devicons" }, opts = { -- your configuration comes here -- or leave it empty to use the default settings -- refer to the configuration section below }, } ``` ## ⚙️ Configuration ### Setup Trouble comes with the following defaults: ```lua { position = "bottom", -- position of the list can be: bottom, top, left, right height = 10, -- height of the trouble list when position is top or bottom width = 50, -- width of the list when position is left or right icons = true, -- use devicons for filenames mode = "workspace_diagnostics", -- "workspace_diagnostics", "document_diagnostics", "quickfix", "lsp_references", "loclist" severity = nil, -- nil (ALL) or vim.diagnostic.severity.ERROR | WARN | INFO | HINT fold_open = "", -- icon used for open folds fold_closed = "", -- icon used for closed folds group = true, -- group results by file padding = true, -- add an extra new line on top of the list cycle_results = true, -- cycle item list when reaching beginning or end of list action_keys = { -- key mappings for actions in the trouble list -- map to {} to remove a mapping, for example: -- close = {}, close = "q", -- close the list cancel = "", -- cancel the preview and get back to your last window / buffer / cursor refresh = "r", -- manually refresh jump = {"", ""}, -- jump to the diagnostic or open / close folds open_split = { "" }, -- open buffer in new split open_vsplit = { "" }, -- open buffer in new vsplit open_tab = { "" }, -- open buffer in new tab jump_close = {"o"}, -- jump to the diagnostic and close the list toggle_mode = "m", -- toggle between "workspace" and "document" diagnostics mode switch_severity = "s", -- switch "diagnostics" severity filter level to HINT / INFO / WARN / ERROR toggle_preview = "P", -- toggle auto_preview hover = "K", -- opens a small popup with the full multiline message preview = "p", -- preview the diagnostic location close_folds = {"zM", "zm"}, -- close all folds open_folds = {"zR", "zr"}, -- open all folds toggle_fold = {"zA", "za"}, -- toggle fold of current file previous = "k", -- previous item next = "j" -- next item }, indent_lines = true, -- add an indent guide below the fold icons auto_open = false, -- automatically open the list when you have diagnostics auto_close = false, -- automatically close the list when you have no diagnostics auto_preview = true, -- automatically preview the location of the diagnostic. to close preview and go back to last window auto_fold = false, -- automatically fold a file trouble list at creation auto_jump = {"lsp_definitions"}, -- for the given modes, automatically jump if there is only a single result signs = { -- icons / text used for a diagnostic error = "", warning = "", hint = "", information = "", other = "", }, use_diagnostic_signs = false -- enabling this will use the signs defined in your lsp client } ``` > 💡 if you don't want to use icons or a patched font, you can use the settings below ```lua -- settings without a patched font or icons { icons = false, fold_open = "v", -- icon used for open folds fold_closed = ">", -- icon used for closed folds indent_lines = false, -- add an indent guide below the fold icons signs = { -- icons / text used for a diagnostic error = "error", warning = "warn", hint = "hint", information = "info" }, use_diagnostic_signs = false -- enabling this will use the signs defined in your lsp client } ``` ## 🚀 Usage ### Commands Trouble comes with the following commands: - `Trouble [mode]`: open the list - `TroubleClose [mode]`: close the list - `TroubleToggle [mode]`: toggle the list - `TroubleRefresh`: manually refresh the active list Modes: - **document_diagnostics:** document diagnostics from the builtin LSP client - **workspace_diagnostics:** workspace diagnostics from the builtin LSP client - **lsp_references:** references of the word under the cursor from the builtin LSP client - **lsp_definitions:** definitions of the word under the cursor from the builtin LSP client * **lsp_type_definitions:** type definitions of the word under the cursor from the builtin LSP client - **quickfix:** [quickfix](https://neovim.io/doc/user/quickfix.html) items - **loclist:** items from the window's [location list](https://neovim.io/doc/user/quickfix.html) Example keybindings: ```vim " Vim Script nnoremap xx TroubleToggle nnoremap xw TroubleToggle workspace_diagnostics nnoremap xd TroubleToggle document_diagnostics nnoremap xq TroubleToggle quickfix nnoremap xl TroubleToggle loclist nnoremap gR TroubleToggle lsp_references ``` ```lua -- Lua vim.keymap.set("n", "xx", "TroubleToggle", {silent = true, noremap = true} ) vim.keymap.set("n", "xw", "TroubleToggle workspace_diagnostics", {silent = true, noremap = true} ) vim.keymap.set("n", "xd", "TroubleToggle document_diagnostics", {silent = true, noremap = true} ) vim.keymap.set("n", "xl", "TroubleToggle loclist", {silent = true, noremap = true} ) vim.keymap.set("n", "xq", "TroubleToggle quickfix", {silent = true, noremap = true} ) vim.keymap.set("n", "gR", "TroubleToggle lsp_references", {silent = true, noremap = true} ) ``` ### API You can use the following functions in your keybindings: ```lua -- jump to the next item, skipping the groups require("trouble").next({skip_groups = true, jump = true}); -- jump to the previous item, skipping the groups require("trouble").previous({skip_groups = true, jump = true}); -- jump to the first item, skipping the groups require("trouble").first({skip_groups = true, jump = true}); -- jump to the last item, skipping the groups require("trouble").last({skip_groups = true, jump = true}); ``` ### Telescope You can easily open any search results in **Trouble**, by defining a custom action: ```lua local actions = require("telescope.actions") local trouble = require("trouble.providers.telescope") local telescope = require("telescope") telescope.setup { defaults = { mappings = { i = { [""] = trouble.open_with_trouble }, n = { [""] = trouble.open_with_trouble }, }, }, } ``` When you open telescope, you can now hit `` to open the results in **Trouble** ## 🎨 Colors The table below shows all the highlight groups defined for Trouble. | Highlight Group | | ------------------------ | | _TroubleCount_ | | _TroubleError_ | | _TroubleNormal_ | | _TroubleTextInformation_ | | _TroubleSignWarning_ | | _TroubleLocation_ | | _TroubleWarning_ | | _TroublePreview_ | | _TroubleTextError_ | | _TroubleSignInformation_ | | _TroubleIndent_ | | _TroubleSource_ | | _TroubleSignHint_ | | _TroubleSignOther_ | | _TroubleFoldIcon_ | | _TroubleTextWarning_ | | _TroubleCode_ | | _TroubleInformation_ | | _TroubleSignError_ | | _TroubleFile_ | | _TroubleHint_ | | _TroubleTextHint_ | | _TroubleText_ |