377 lines
14 KiB
Lua
377 lines
14 KiB
Lua
return {{
|
|
"mbbill/undotree",
|
|
name = "undotree",
|
|
lazy = false,
|
|
}, {
|
|
"lewis6991/satellite.nvim",
|
|
name = "satellite",
|
|
lazy = false,
|
|
config = function()
|
|
require("satellite").setup {
|
|
current_only = false,
|
|
winblend = 50,
|
|
zindex = 40,
|
|
excluded_filetypes = {},
|
|
width = 2,
|
|
handlers = {
|
|
cursor = {
|
|
enable = true,
|
|
overlap = true,
|
|
-- Supports any number of symbols
|
|
symbols = { '⎺', '⎻', '⎼', '⎽' }
|
|
-- symbols = { '⎻', '⎼' }
|
|
-- Highlights:
|
|
-- - SatelliteCursor (default links to NonText
|
|
},
|
|
search = {
|
|
enable = true,
|
|
-- Highlights:
|
|
-- - SatelliteSearch (default links to Search)
|
|
-- - SatelliteSearchCurrent (default links to SearchCurrent)
|
|
},
|
|
diagnostic = {
|
|
enable = true,
|
|
signs = {'-', '=', '≡'},
|
|
min_severity = vim.diagnostic.severity.HINT,
|
|
-- Highlights:
|
|
-- - SatelliteDiagnosticError (default links to DiaSatelliteEnablegnosticError)
|
|
-- - SatelliteDiagnosticWarn (default links to DiagnosticWarn)
|
|
-- - SatelliteDiagnosticInfo (default links to DiagnosticInfo)
|
|
-- - SatelliteDiagnosticHint (default links to DiagnosticHint)
|
|
},
|
|
gitsigns = {
|
|
enable = true,
|
|
signs = { -- can only be a single character (multibyte is okay)
|
|
add = "│",
|
|
change = "│",
|
|
delete = "-",
|
|
},
|
|
-- Highlights:
|
|
-- SatelliteGitSignsAdd (default links to GitSignsAdd)
|
|
-- SatelliteGitSignsChange (default links to GitSignsChange)
|
|
-- SatelliteGitSignsDelete (default links to GitSignsDelete)
|
|
},
|
|
marks = {
|
|
enable = true,
|
|
show_builtins = false, -- shows the builtin marks like [ ] < >
|
|
key = 'm'
|
|
-- Highlights:
|
|
-- SatelliteMark (default links to Normal)
|
|
},
|
|
quickfix = {
|
|
signs = { '-', '=', '≡' },
|
|
-- Highlights:
|
|
-- SatelliteQuickfix (default links to WarningMsg)
|
|
}
|
|
},
|
|
}
|
|
end,
|
|
}, {
|
|
"catppuccin/nvim",
|
|
name = "catppuccin",
|
|
config = function()
|
|
require("catppuccin").setup {
|
|
flavour = "mocha",
|
|
-- Colors adapted from https://github.com/one-dark/jetbrains-one-dark-theme
|
|
-- Catppuccin colors: https://github.com/catppuccin/catppuccin/blob/main/docs/style-guide.md
|
|
-- Catppuccin Neovim config: https://github.com/catppuccin/nvim/#configuration
|
|
color_overrides = {
|
|
mocha = {
|
|
text = "#BBBBBB",
|
|
base = "#282c34",
|
|
crust = "#21252b",
|
|
mauve = "#D55FDE",
|
|
blue = "#61AFEF",
|
|
teal = "#2BBAC5",
|
|
red = "#EF596F",
|
|
green = "#89CA78",
|
|
peach = "#D19A66",
|
|
yellow = "#E5C07B",
|
|
sapphire = "#009191",
|
|
maroon = "#f9c89a"
|
|
}
|
|
},
|
|
integrations = {
|
|
cmp = true,
|
|
neotree = true,
|
|
mason = true,
|
|
},
|
|
custom_highlights = function(C)
|
|
-- :Telescope highlights for a general list
|
|
-- Rust-analyzer tokens: https://rust-analyzer.github.io/manual.html#semantic-syntax-highlighting
|
|
-- @lsp.mod.* for modifiers
|
|
-- @lsp.modtype.* for types with modifiers
|
|
-- @lsp.type.* for token types
|
|
return {
|
|
Error = { fg = C.red, italic = true, underline = true },
|
|
["@lsp.type.interface"] = { fg = C.yellow },
|
|
["@function.builtin"] = { fg = C.blue },
|
|
["@lsp.typemod.method.builtIn"] = { fg = C.blue },
|
|
["@lsp.mod.mutable"] = { underline = true },
|
|
["@lsp.mod.consuming"] = { bold = true },
|
|
["@lsp.type.lifetime"] = { fg = C.teal },
|
|
["@variable.builtin"] = { fg = C.mauve },
|
|
["StorageClass"] = { fg = C.mauve },
|
|
["@constructor.lua"] = { fg = C.overlay2 },
|
|
["@preproc"] = { fg = C.maroon },
|
|
["@debug"] = { fg = C.maroon },
|
|
["@field"] = { fg = C.red },
|
|
["@property"] = { fg = C.red },
|
|
["@lsp.type.formatSpecifier"] = { fg = C.teal },
|
|
["@lsp.type.escapeSequence"] = { fg = C.teal },
|
|
PreProc = { fg = C.maroon },
|
|
Special = { fg = C.teal },
|
|
["@namespace"] = { fg = C.overlay2 },
|
|
["@define"] = { fg = C.maroon },
|
|
["@string.escape"] = { fg = C.teal },
|
|
Operator = { fg = C.text },
|
|
CmpItemKindSnippet = { fg = C.base, bg = C.green },
|
|
CmpItemKindKeyword = { fg = C.base, bg = C.mauve },
|
|
CmpItemKindText = { fg = C.base, bg = C.teal },
|
|
CmpItemKindMethod = { fg = C.base, bg = C.blue },
|
|
CmpItemKindConstructor = { fg = C.base, bg = C.blue },
|
|
CmpItemKindFunction = { fg = C.base, bg = C.blue },
|
|
CmpItemKindFolder = { fg = C.base, bg = C.blue },
|
|
CmpItemKindModule = { fg = C.base, bg = C.blue },
|
|
CmpItemKindConstant = { fg = C.base, bg = C.peach },
|
|
CmpItemKindField = { fg = C.base, bg = C.red },
|
|
CmpItemKindProperty = { fg = C.base, bg = C.red },
|
|
CmpItemKindEnum = { fg = C.base, bg = C.peach },
|
|
CmpItemKindUnit = { fg = C.base, bg = C.peach },
|
|
CmpItemKindClass = { fg = C.base, bg = C.yellow },
|
|
CmpItemKindVariable = { fg = C.base, bg = C.flamingo },
|
|
CmpItemKindFile = { fg = C.base, bg = C.blue },
|
|
CmpItemKindInterface = { fg = C.base, bg = C.yellow },
|
|
CmpItemKindColor = { fg = C.base, bg = C.red },
|
|
CmpItemKindReference = { fg = C.base, bg = C.red },
|
|
CmpItemKindEnumMember = { fg = C.base, bg = C.red },
|
|
CmpItemKindStruct = { fg = C.base, bg = C.blue },
|
|
CmpItemKindValue = { fg = C.base, bg = C.peach },
|
|
CmpItemKindEvent = { fg = C.base, bg = C.blue },
|
|
CmpItemKindOperator = { fg = C.base, bg = C.blue },
|
|
CmpItemKindTypeParameter = { fg = C.base, bg = C.blue },
|
|
CmpItemKindCopilot = { fg = C.base, bg = C.teal },
|
|
}
|
|
end,
|
|
}
|
|
end,
|
|
}, {
|
|
"hrsh7th/nvim-cmp",
|
|
-- override the options table that is used in the `require("cmp").setup()` call
|
|
opts = function(_, opts)
|
|
-- opts parameter is the default options table
|
|
-- the function is lazy loaded so cmp is able to be required
|
|
local lspkind = require("lspkind")
|
|
|
|
local cmp = require("cmp")
|
|
-- Completion sources
|
|
opts.sources = cmp.config.sources({
|
|
{ name = "crates", priority = 1250 },
|
|
{ name = "nvim_lsp", priority = 1000 },
|
|
{ name = "luasnip", priority = 750 },
|
|
{ name = "buffer", priority = 500 },
|
|
{ name = "path", priority = 250 },
|
|
})
|
|
|
|
-- Custom comparator to sort LSP text and snippets last
|
|
local types = require("cmp.types")
|
|
local function compareLspKind(entry1, entry2)
|
|
local kind1 = entry1:get_kind() --- @type lsp.CompletionItemKind | number
|
|
local kind2 = entry2:get_kind() --- @type lsp.CompletionItemKind | number
|
|
kind1 = kind1 == types.lsp.CompletionItemKind.Text and 100 or kind1
|
|
kind2 = kind2 == types.lsp.CompletionItemKind.Text and 100 or kind2
|
|
kind1 = kind1 == types.lsp.CompletionItemKind.Snippet and 90 or kind1
|
|
kind2 = kind2 == types.lsp.CompletionItemKind.Snippet and 90 or kind2
|
|
if kind1 ~= kind2 then
|
|
local diff = kind1 - kind2
|
|
if diff < 0 then
|
|
return true
|
|
elseif diff > 0 then
|
|
return false
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
-- Custom comparators for sorting of options
|
|
local compare = require('cmp.config.compare')
|
|
opts.sorting = {
|
|
priority_weight = 2,
|
|
comparators = {
|
|
compare.offset,
|
|
compare.exact,
|
|
compare.score,
|
|
compare.recently_used,
|
|
compareLspKind,
|
|
compare.sort_text,
|
|
compare.length,
|
|
compare.order,
|
|
},
|
|
}
|
|
|
|
-- Make the cmp prompt pretty
|
|
-- How to customize: https://docs.astronvim.com/recipes/cmp/
|
|
-- From: https://github.com/johnallen3d/dotfiles/blob/46300be412aba524743f8e3d47fff4df3deb2857/dot_config/nvim/lua/config/plugins/cmp.lua
|
|
opts.formatting = {
|
|
fields = { "kind", "abbr", "menu" },
|
|
format = function(entry, vim_item)
|
|
local kind = lspkind.cmp_format({
|
|
mode = "symbol_text",
|
|
maxwidth = 50,
|
|
})(entry, vim_item)
|
|
local strings = vim.split(kind.kind, "%s", { trimempty = true })
|
|
kind.kind = " " .. strings[1] .. " "
|
|
kind.menu = " (" .. strings[2] .. ")"
|
|
|
|
return kind
|
|
end,
|
|
}
|
|
|
|
-- Use PageUp and PageDown to navigate through completions
|
|
local luasnip = require("luasnip")
|
|
opts.mapping["<PageDown>"] = cmp.mapping(function(fallback)
|
|
if cmp.visible() then
|
|
cmp.select_next_item({ count = 5 })
|
|
elseif luasnip.jumpable(5) then
|
|
luasnip.jump(5)
|
|
else
|
|
fallback()
|
|
end
|
|
end, { "i", "s" })
|
|
opts.mapping["<PageUp>"] = cmp.mapping(function(fallback)
|
|
if cmp.visible() then
|
|
cmp.select_prev_item({ count = 5 })
|
|
elseif luasnip.jumpable(-5) then
|
|
luasnip.jump(-5)
|
|
else
|
|
fallback()
|
|
end
|
|
end, { "i", "s" })
|
|
|
|
-- return the new table to be used
|
|
return opts
|
|
end,
|
|
}, {
|
|
"lewis6991/hover.nvim",
|
|
name = "hover",
|
|
config = function()
|
|
require("hover").setup {
|
|
init = function()
|
|
-- Require providers
|
|
require("hover.providers.lsp")
|
|
-- require('hover.providers.gh')
|
|
-- require('hover.providers.gh_user')
|
|
-- require('hover.providers.jira')
|
|
-- require('hover.providers.man')
|
|
-- require('hover.providers.dictionary')
|
|
end,
|
|
preview_opts = {
|
|
border = 'single'
|
|
},
|
|
-- Whether the contents of a currently open hover window should be moved
|
|
-- to a :h preview-window when pressing the hover keymap.
|
|
preview_window = false,
|
|
title = true,
|
|
mouse_providers = {
|
|
'LSP'
|
|
},
|
|
mouse_delay = 1000
|
|
}
|
|
end
|
|
}, {
|
|
"ggandor/leap.nvim",
|
|
name = "leap",
|
|
lazy = false,
|
|
config = function()
|
|
local leap = require('leap')
|
|
leap.setup {
|
|
highlight_unlabeled_phase_one_targets = true
|
|
}
|
|
leap.create_default_mappings()
|
|
|
|
-- Magic trick from https://github.com/ggandor/leap.nvim/issues/65#issuecomment-1637749795
|
|
-- to highlight already matched parts
|
|
local function highlight_unlabeled_phase_one_targets(targets, first_idx, last_idx)
|
|
local hl = require('leap.highlight')
|
|
for i = first_idx or 1, last_idx or #targets do
|
|
local target = targets[i]
|
|
if target.chars then
|
|
local bufnr = target.wininfo.bufnr
|
|
local id = vim.api.nvim_buf_set_extmark(
|
|
bufnr, hl.ns, target.pos[1] - 1, target.pos[2] - 1,
|
|
{
|
|
virt_text = { { table.concat(target.chars), "LeapMatch" } },
|
|
virt_text_pos = "overlay",
|
|
hl_mode = "combine",
|
|
priority = hl.priority.label,
|
|
}
|
|
)
|
|
-- This way Leap automatically cleans up your stuff together with its own.
|
|
table.insert(hl.extmarks, { bufnr, id })
|
|
end
|
|
end
|
|
-- Continue with Leap's native function body.
|
|
return true
|
|
end
|
|
|
|
leap.opts.on_beacons = highlight_unlabeled_phase_one_targets
|
|
end
|
|
}, {
|
|
"rebelot/heirline.nvim",
|
|
opts = function(_, opts)
|
|
-- Config override from: https://docs.astronvim.com/recipes/status#default-statusline-with-mode-text
|
|
local status = require("astronvim.utils.status")
|
|
opts.statusline = { -- statusline
|
|
hl = { fg = "fg", bg = "bg" },
|
|
status.component.mode { mode_text = { padding = { left = 1, right = 1 } } }, -- add the mode text
|
|
status.component.git_branch(),
|
|
status.component.file_info { filetype = {}, filename = false, file_modified = false },
|
|
status.component.git_diff(),
|
|
status.component.diagnostics(),
|
|
status.component.fill(),
|
|
status.component.cmd_info(),
|
|
status.component.fill(),
|
|
status.component.lsp(),
|
|
status.component.treesitter(),
|
|
status.component.nav(),
|
|
-- remove the 2nd mode indicator on the right
|
|
}
|
|
|
|
-- return the final configuration table
|
|
return opts
|
|
end,
|
|
}, {
|
|
"onsails/lspkind.nvim",
|
|
opts = function(_, opts)
|
|
-- use codicons preset
|
|
opts.preset = "codicons"
|
|
-- set some missing symbol types
|
|
opts.symbol_map = {
|
|
Array = "",
|
|
Boolean = "",
|
|
Key = "",
|
|
Namespace = "",
|
|
Null = "",
|
|
Number = "",
|
|
Object = "",
|
|
Package = "",
|
|
String = "",
|
|
}
|
|
return opts
|
|
end,
|
|
}, {
|
|
-- Rust crates helper
|
|
"saecki/crates.nvim",
|
|
tag = "stable",
|
|
lazy = false,
|
|
dependencies = "nvim-lua/plenary.nvim",
|
|
config = function()
|
|
require("crates").setup({
|
|
null_ls = {
|
|
enabled = true,
|
|
name = "crates",
|
|
},
|
|
})
|
|
end,
|
|
}}
|