migrate to new builtin plugin manager with new folder structure

This commit is contained in:
sankalp committed 2026-05-07 20:41:03 +05:45
1 parent b532749302
commit 42483b98f5
39 files changed
+2139 -2485

No files matched your search

+34
View File
@@ -0,0 +1,34 @@
add("ellisonleao/gruvbox.nvim")
local palette = require("gruvbox").palette
require("gruvbox").setup({
bold = false,
italic = {
strings = false,
emphasis = false,
comments = false,
folds = false,
},
contrast = "hard",
transparent_mode = true,
overrides = {
-- builtin
SignColumn = { bg = "None" },
CursorLineNr = { bg = "None" },
Whitespace = { fg = palette.dark0 },
EndOfBuffer = { fg = palette.dark0_hard },
Visual = { fg = "None", bg = palette.dark1 },
Label = { link = "GruvboxPurple" },
-- blink.cmp
BlinkCmpMenu = { link = "Normal" },
BlinkCmpMenuBorder = { link = "BlinkCmpMenu" },
BlinkCmpMenuSelection = { fg = "None", bg = palette.dark1 },
BlinkCmpLabelMatch = { fg = palette.bright_green },
BlinkCmpScrollBarGutter = { bg = palette.dark2 },
BlinkCmpScrollBarThumb = { bg = palette.light1 },
-- indent guides
MiniIndentscopeSymbol = { fg = palette.dark1 },
},
})
+74
View File
@@ -0,0 +1,74 @@
add({
{ src = "mason-org/mason.nvim", version = "main" }, -- lsp installer manager
{ src = "mason-org/mason-lspconfig.nvim", version = "main" }, -- lsp installer
"neovim/nvim-lspconfig", -- lsp config
"nvimdev/Lspsaga.nvim", -- lsp ui
"rachartier/tiny-inline-diagnostic.nvim", -- inline diagnostic
"rachartier/tiny-code-action.nvim", -- code action
})
-- lsp installer
require("mason").setup({
ui = {
icons = {
package_installed = "✓",
package_pending = "➜",
package_uninstalled = "✗",
},
border = "rounded",
backdrop = 100,
},
})
require("mason-lspconfig").setup({
ensure_installed = require("extensions").lsp_server,
automatic_installation = false, -- Don't auto-install or auto-configure
})
-- improve neovim lsp experience
vim.api.nvim_create_autocmd("LspAttach", {
callback = function()
require("lspsaga").setup({
ui = {
theme = "round",
border = "rounded",
devicon = true,
title = true,
winblend = 1,
expand = "",
collapse = "",
preview = "",
code_action = "󰠠 ",
diagnostic = "",
incoming = "",
outgoing = "",
hover = "",
},
})
--inline diagnostic
require("tiny-inline-diagnostic").setup({
options = {
show_source = true,
multiple_diag_under_cursor = true,
},
})
--code action
require("tiny-code-action").setup({
picker = {
"buffer",
opts = {
auto_preview = true,
hotkeys = true,
hotkeys_mode = "sequential",
},
},
})
end,
})
vim.diagnostic.config({ virtual_text = false }) -- Disable default virtual text
vim.keymap.set("n", "<leader>.", function()
require("tiny-code-action").code_action()
end, { desc = "Code action" })
+82
View File
@@ -0,0 +1,82 @@
add({
"mfussenegger/nvim-lint", -- linter
"rshkarin/mason-nvim-lint", -- linter installer
"stevearc/conform.nvim", -- autoformater
"zapling/mason-conform.nvim", -- formatter installer
})
-- linter
require("lint").linters_by_ft = {
["*"] = { "codespell" },
["javascript"] = { "eslint_d", "cspell" },
["typescript"] = { "eslint_d", "cspell" },
["javascriptreact"] = { "eslint_d", "cspell" },
["typescriptreact"] = { "eslint_d", "cspell" },
["dockerfile"] = { "hadolint" },
["markdown"] = { "write_good", "markdownlint" },
["text"] = { "write_good" },
["sh"] = { "shellcheck" },
["yaml"] = { "actionlint" },
["python"] = { "ruff" },
}
require("mason-nvim-lint").setup({
ensure_installed = require("extensions").linter,
automatic_installation = false,
})
-- formatter
require("conform").setup({
formatters = {
["markdown-toc"] = {
condition = function(_, ctx)
for _, line in ipairs(vim.api.nvim_buf_get_lines(ctx.buf, 0, -1, false)) do
if line:find("<!%-%-% toc %-%->") then
return true
end
end
end,
},
["markdownlint-cli2"] = {
condition = function(_, ctx)
local diag = vim.tbl_filter(function(d)
return d.source == "markdownlint"
end, vim.diagnostic.get(ctx.buf))
return #diag > 0
end,
},
},
formatters_by_ft = {
["lua"] = { "stylua" },
["c"] = { "clang_format" },
["cpp"] = { "clang_format" },
["h"] = { "clang_format" },
["python"] = { "ruff_fix", "ruff_format", "ruff_organize_imports" },
["javascript"] = { "biome" },
["typescript"] = { "biome" },
["typescriptreact"] = { "biome" },
["markdown"] = { "prettier", "markdownlint-cli2", "markdown-toc" },
["markdown.mdx"] = { "prettier", "markdownlint-cli2", "markdown-toc" },
["mdx"] = { "prettier" },
["_"] = { "trim_whitespace" },
},
options = {
stop_after_first = true,
},
format_after_save = function(bufnr)
if not vim.b[bufnr].conform_disable then
return {
lsp_format = "fallback",
}
end
end,
})
vim.keymap.set("n", "<leader>tf", function()
vim.b.conform_disable = not vim.b.conform_disable
local status = vim.b.conform_disable and "disabled" or "enabled"
vim.notify("Autoformat " .. status, vim.log.levels.INFO)
end, { desc = "Toggle autoformat" })
require("mason-conform").setup({
ensure_installed = require("extensions").formatter,
automatic_installation = true,
})
+75
View File
@@ -0,0 +1,75 @@
add({
"saghen/blink.lib",
{ src = "saghen/blink.cmp", version = "v0.*" },
"L3MON4D3/LuaSnip",
"rafamadriz/friendly-snippets",
})
require("blink.cmp").setup({
fuzzy = { implementation = "prefer_rust" },
snippets = { preset = "luasnip" },
sources = {
default = { "lsp", "path", "snippets", "buffer" },
providers = {},
},
completion = {
ghost_text = { enabled = true },
list = {
selection = {
preselect = false,
auto_insert = true,
},
},
documentation = {
window = { border = "rounded" },
auto_show = true,
auto_show_delay_ms = 50,
},
menu = {
border = "rounded",
draw = {
components = {
kind_icon = {
text = function(ctx)
local kind_icon, _, _ = require("mini.icons").get("lsp", ctx.kind)
return kind_icon
end,
highlight = function(ctx)
local _, hl, _ = require("mini.icons").get("lsp", ctx.kind)
return hl
end,
},
kind = {
highlight = function(ctx)
local _, hl, _ = require("mini.icons").get("lsp", ctx.kind)
return hl
end,
},
},
},
},
},
signature = {
window = { border = "rounded" },
},
keymap = {
preset = "none",
["<S-Tab>"] = { "select_prev", "snippet_backward", "fallback" },
["<Tab>"] = { "select_next", "snippet_forward", "fallback" },
["<CR>"] = { "accept", "fallback" },
["<C-space>"] = { "hide", "show" },
["<C-y>"] = { "show", "show_documentation", "hide_documentation" },
["<C-u>"] = { "scroll_documentation_up", "fallback" },
["<C-d>"] = { "scroll_documentation_down", "fallback" },
},
})
local luasnip = require("luasnip")
require("luasnip.loaders.from_vscode").lazy_load()
require("luasnip.loaders.from_vscode").lazy_load({
paths = { vim.fn.stdpath("config") .. "/snippets" },
})
luasnip.filetype_extend("mdx", { "markdown" })
+72
View File
@@ -0,0 +1,72 @@
add({
"windwp/nvim-autopairs", -- autopairs
"windwp/nvim-ts-autotag", -- autotag
"folke/todo-comments.nvim", -- todo comment highlights
"wakatime/vim-wakatime", --wakaTime coding time tracker
"lambdalisue/suda.vim", -- edit files as sudo (:SudaWrite)
"numToStr/Comment.nvim", -- smart comment toggling
"NMAC427/guess-indent.nvim", -- auto-detect tab/space indentation
"brenoprata10/nvim-highlight-colors", -- color highlighting
"davidmh/mdx.nvim", -- syntax highlighter for mdx
"nvim-treesitter/nvim-treesitter", -- nvim-treesitter
"Exafunction/windsurf.vim", -- windsurf ai for autocompletion
"numToStr/Navigator.nvim", -- navigator
"m4xshen/hardtime.nvim", -- workflow
"lukas-reineke/indent-blankline.nvim", --indent guides
"mg979/vim-visual-multi", -- multiple cursors
})
vim.g.VM_maps = {
["Find Under"] = "<M-d>", -- Alt + d | Select word under cursor and start multi-cursor
["Find Subword Under"] = "<M-d>", -- Alt + d | Select subword under cursor
["Select All"] = "<C-M-d>", -- Ctrl + Alt + d | Select all occurrences in the buffer
["Add Cursor Down"] = "<C-M-j>", -- Ctrl + Alt + j | Add a cursor on the line below
["Add Cursor Up"] = "<C-M-k>", -- Ctrl + Alt + k | Add a cursor on the line above
}
-- lazy load insert mode enhancements
vim.api.nvim_create_autocmd("InsertEnter", {
callback = function()
require("nvim-autopairs").setup({})
require("nvim-ts-autotag").setup({})
end,
once = true,
})
-- lazy load general editor enhancements
vim.api.nvim_create_autocmd({ "BufReadPost", "BufNewFile" }, {
callback = function()
require("todo-comments").setup({ signs = false })
require("Comment").setup()
require("guess-indent").setup({})
require("nvim-highlight-colors").setup({ render = "background" })
require("Navigator").setup({
auto_save = "current",
disable_on_zoom = false,
mux = "auto",
})
end,
})
require("hardtime").setup({})
require("ibl").setup({})
require("nvim-treesitter").setup({
ensure_installed = require("extensions").ts_parsers,
auto_install = true,
highlight = {
enable = true,
additional_vim_regex_highlighting = true,
},
indent = {
enable = true,
},
})
-- windsurf
vim.keymap.set("i", "<A-f>", function()
return vim.fn["codeium#Accept"]()
end, { expr = true, silent = true })
vim.keymap.set("i", "<A-x>", function()
return vim.fn["codeium#Clear"]()
end, { expr = true, silent = true })
+34
View File
@@ -0,0 +1,34 @@
add({
"lewis6991/gitsigns.nvim",
"wintermute-cell/gitignore.nvim", -- .gitignore generator
})
vim.api.nvim_create_autocmd({ "BufRead", "BufNewFile" }, {
callback = function()
require("gitsigns").setup({
signcolumn = true,
current_line_blame = true,
attach_to_untracked = false,
current_line_blame_formatter = "<author>, <author_time:%R> - <summary>",
watch_gitdir = {
follow_files = true,
},
current_line_blame_opts = {
virt_text = true,
virt_text_pos = "eol", -- 'eol' | 'overlay' | 'right_align'
delay = 1000,
ignore_whitespace = false,
virt_text_priority = 100,
use_focus = true,
},
signs = {
add = { text = "" },
change = { text = "󱗜 " },
delete = { text = "󰍵 " },
topdelete = { text = "󱥨 " },
changedelete = { text = "󰾟 " },
untracked = { text = "󰰧 " },
},
})
end,
})
+153
View File
@@ -0,0 +1,153 @@
add("echasnovski/mini.nvim")
require("mini.ai").setup() -- extend and create a/i textobjects
require("mini.pairs").setup() -- autopairs
require("mini.icons").setup() -- icons
require("mini.bracketed").setup() -- go forward/backward with square brackets
-- File explorer
require("mini.files").setup({
mappings = {
close = "q",
go_in = "L",
go_in_plus = "l",
go_out = "h",
go_out_plus = "H",
mark_goto = "'",
mark_set = "m",
reset = "<BS>",
reveal_cwd = "@",
show_help = "g?",
synchronize = "<CR>",
trim_left = "<",
trim_right = ">",
},
})
require("mini.misc").setup({
-- restore cursor position on file reopen
require("mini.misc").setup_restore_cursor(),
-- automated change of current directory
require("mini.misc").setup_auto_root(),
})
-- splitjoin
require("mini.splitjoin").setup({
mappings = {
toggle = "<leader>tj",
split = "",
join = "",
},
})
-- surround action
require("mini.surround").setup({
mappings = {
add = "msa",
delete = "msd",
find = "msf",
find_left = "msF",
highlight = "msh",
replace = "msr",
update_n_lines = "msn",
suffix_last = "l",
suffix_next = "n",
},
})
-- indents
require("mini.indentscope").setup({
draw = { animation = require("mini.indentscope").gen_animation.linear({ ease = "out", duration = 15 }) },
options = { border = "top", try_as_border = true, indent_at_cursor = false },
})
vim.api.nvim_create_autocmd("BufEnter", {
pattern = "*",
callback = function(args)
if vim.bo[args.buf].buftype ~= "" then
vim.b[args.buf].miniindentscope_disable = true
end
end,
})
-- statusline
require("mini.statusline").setup({
use_icons = true,
content = {
active = function()
local mode, mode_hl = MiniStatusline.section_mode({ trunc_width = 120 })
local git = MiniStatusline.section_git({ trunc_width = 40 })
local diff = MiniStatusline.section_diff({ trunc_width = 80 })
local diagnostics = MiniStatusline.section_diagnostics({ trunc_width = 60 })
local lsp = MiniStatusline.section_lsp({ trunc_width = 40 })
local filename = MiniStatusline.section_filename({ trunc_width = 140 })
local function section_filetype(args)
if MiniStatusline.is_truncated(args.trunc_width) or vim.bo.filetype == "" or vim.bo.buftype ~= "" then
return ""
end
local ok, icons = pcall(require, "mini.icons")
local icon = ok and select(1, icons.get("filetype", vim.bo.filetype)) or ""
return string.format("%s %s│", icon, vim.bo.filetype)
end
local function section_lsp_clients(args)
if MiniStatusline.is_truncated(args.trunc_width) then
return ""
end
local clients = vim.lsp.get_clients({ bufnr = 0 })
if not clients or #clients == 0 then
return ""
end
local names = vim.tbl_map(function(c)
return c.name
end, clients)
return string.format(" %s", table.concat(names, ", "))
end
local function section_searchcount(args)
if vim.v.hlsearch == 0 then
return ""
end
local ok, s = pcall(vim.fn.searchcount, { recompute = true })
if not ok or s.current == nil or s.total == 0 then
return ""
end
local icon = MiniStatusline.is_truncated(args.trunc_width) and "" or " "
if s.incomplete == 1 then
return icon .. "?/?│"
end
local fmt = ">%d"
local cur = s.current > s.maxcount and fmt:format(s.maxcount) or s.current
local tot = s.total > s.maxcount and fmt:format(s.maxcount) or s.total
return ("%s%s/%s│"):format(icon, cur, tot)
end
local function section_location(args)
return MiniStatusline.is_truncated(args.trunc_width) and "%-2l│%-2v" or "󰉸 %-2l│󱥖 %-2v"
end
local filetype = section_filetype({ trunc_width = 70 })
local searchcount = section_searchcount({ trunc_width = 80 })
local loc = section_location({ trunc_width = 120 })
local lsp_clients = section_lsp_clients({ trunc_width = 60 })
return MiniStatusline.combine_groups({
{ hl = mode_hl, strings = { mode:upper() } },
{ hl = "MiniStatuslineDevinfo", strings = { git, diff, diagnostics, lsp } },
"%<",
{ hl = "MiniStatuslineFilename", strings = { filename } },
"%=",
{ hl = "MiniStatuslineDevinfo", strings = { lsp_clients } },
{ hl = mode_hl, strings = { filetype, searchcount, loc } },
})
end,
inactive = function()
return MiniStatusline.combine_groups({
{ hl = "MiniStatuslineInactive", strings = { vim.fn.expand("%:t") } },
})
end,
},
})
+367
View File
@@ -0,0 +1,367 @@
add("folke/snacks.nvim")
local function files_layout(preview_width, height, width)
preview_width = preview_width or 0.6
height = height or 0.8
width = width or 0.9
return {
layout = {
box = "horizontal",
width = width,
min_width = 120,
height = height,
{
box = "vertical",
border = "rounded",
title = "{title} {live} {flags}",
{ win = "input", height = 1, border = "bottom" },
{ win = "list", border = "none" },
},
{ win = "preview", title = "{preview}", border = "rounded", width = preview_width },
},
}
end
local function palette_layout(height, width)
height = height or 0.4
width = width or 0.6
return {
preview = false,
layout = {
backdrop = false,
row = 1,
width = width,
min_width = 80,
height = height,
border = "rounded",
box = "vertical",
{
win = "input",
height = 1,
border = "rounded",
title = "{title} {live} {flags}",
title_pos = "center",
},
{ win = "list", border = "hpad" },
{ win = "preview", title = "{preview}", border = "rounded" },
},
}
end
local Snacks = require("snacks")
Snacks.setup({
animate = {
enabled = true,
duration = 20, -- ms per step
easing = "linear",
fps = 60,
},
bigfile = {
enabled = true,
notify = true,
size = 1000 * 1024, -- 1 MB instead of 100 KB
},
bufdelete = { enabled = true },
dashboard = {
preset = {
header = [[
░█░█░█▀▀░█░█░█▀▀░█▀█░█▀▄░█▀▀░█░█
░█▀▄░█▀▀░░█░░█░░░█░█░█░█░█▀▀░▄▀▄
░▀░▀░▀▀▀░░▀░░▀▀▀░▀▀▀░▀▀░░▀▀▀░▀░▀
]],
},
sections = {
{ section = "header" },
{
icon = "",
title = "Keymaps",
section = "keys",
indent = 2,
padding = 1,
},
{
icon = "",
title = "Recent Files",
section = "recent_files",
indent = 2,
padding = 1,
},
{
icon = "",
title = "Projects",
section = "projects",
indent = 2,
padding = 1,
},
},
},
debug = { enabled = true },
dim = {
enabled = true,
scope = {
min_size = 5,
max_size = 20,
siblings = true,
},
},
explorer = { enabled = false },
projects = {
dirs = {
"~/Project",
"~/.config/Modus"
}
},
git = { enabled = true },
gitbrowse = { enabled = true },
image = { enabled = true },
indent = {
enabled = true,
priority = 1,
char = "▍",
only_scope = false,
only_current = false,
hl = {
"SnacksIndent1",
"SnacksIndent2",
"SnacksIndent3",
"SnacksIndent4",
"SnacksIndent5",
"SnacksIndent6",
"SnacksIndent7",
"SnacksIndent8",
},
},
input = {
enabled = true,
icon = "",
icon_hl = "SnacksInputIcon",
icon_pos = "left",
prompt_pos = "title",
win = { style = "input" },
expand = true,
},
layout = { enabled = true },
lazygit = { enabled = true },
notifier = {
enabled = true,
timeout = 2000,
width = { min = 40, max = 0.4 },
height = { min = 1, max = 0.6 },
margin = { top = 0, right = 1, bottom = 0 },
padding = true,
sort = { "level", "added" },
level = vim.log.levels.TRACE,
icons = {
debug = "",
error = "",
info = "",
trace = "",
warn = "",
},
style = "compact",
top_down = true,
date_format = "%R",
more_format = " ↓ %d lines ",
refresh = 50,
},
notify = { enabled = true },
picker = {
enabled = true,
icon = "",
icon_hl = "SnacksPickerIcon",
icon_pos = "left",
prompt_pos = "title",
win = { style = "picker" },
expand = true,
matchers = {
frecency = true,
cwd_bonus = false,
},
sources = {
-- layout options: dropdown, horizontal, vertical, vscode, ivy, ivy_split, telescope, top, left, right, bottom, sidebar
buffers = { layout = files_layout() },
commands = { layout = palette_layout() },
command_history = { layout = palette_layout() },
files = {
hidden = true,
layout = files_layout(),
},
icons = {
icon_sources = { "nerd_fonts", "emoji" },
layout = palette_layout(),
},
git_files = { layout = files_layout() },
git_branches = { layout = { preset = "vertical" } },
git_status = { layout = files_layout() },
help = { layout = { preset = "ivy_split" } },
man = { layout = { preset = "ivy_split" } },
notifications = { layout = palette_layout() },
projects = { layout = files_layout(0.8) },
recent = { layout = files_layout() },
search_history = { layout = palette_layout() },
smart = { layout = files_layout() },
undo = { layout = { preset = "ivy" } },
zoxide = { layout = files_layout(0.7) },
},
layout = "custom",
layouts = {
custom = {
layout = {
box = "vertical",
backdrop = false,
row = -1,
width = 0,
height = 0.4,
border = "top",
title = " {title} {live} {flags}",
title_pos = "left",
{
box = "horizontal",
{ win = "list", border = "rounded" },
{ win = "preview", title = "{preview}", width = 0.6, border = "left" },
},
{ win = "input", height = 1, border = "top" },
},
},
},
},
profiler = { enabled = true },
quickfile = { enabled = true },
rename = { enabled = true },
scope = {
enabled = true,
keys = {
textobject = {
ii = {
min_size = 2, -- minimum size of the scope
edge = false, -- inner scope
cursor = false,
treesitter = { blocks = { enabled = false } },
desc = "inner scope",
},
ai = {
cursor = false,
min_size = 2, -- minimum size of the scope
treesitter = { blocks = { enabled = false } },
desc = "full scope",
},
},
jump = {
["[a"] = {
min_size = 1, -- allow single line scopes
bottom = false,
cursor = false,
edge = true,
treesitter = { blocks = { enabled = false } },
desc = "jump to top edge of scope",
},
["]a"] = {
min_size = 1, -- allow single line scopes
bottom = true,
cursor = false,
edge = true,
treesitter = { blocks = { enabled = false } },
desc = "jump to bottom edge of scope",
},
},
},
},
scratch = {
enabled = true,
name = "SCRATCH",
ft = function()
if vim.bo.buftype == "" and vim.bo.filetype ~= "" then
return vim.bo.filetype
end
return "markdown"
end,
icon = nil,
root = vim.fn.stdpath("data") .. "/scratch",
autowrite = true,
filekey = {
cwd = true,
branch = true,
count = true,
},
win = {
width = 120,
height = 40,
bo = { buftype = "", buflisted = false, bufhidden = "hide", swapfile = false },
minimal = false,
noautocmd = false,
zindex = 20,
wo = { winhighlight = "NormalFloat:Normal" },
border = "rounded",
title_pos = "center",
footer_pos = "center",
keys = {
["execute"] = {
"<cr>",
function(_)
vim.cmd("%SnipRun")
end,
desc = "Execute buffer",
mode = { "n", "x" },
},
},
},
win_by_ft = {
lua = {
keys = {
["source"] = {
"<leader>cr",
function(self)
local name = "scratch." .. vim.fn.fnamemodify(vim.api.nvim_buf_get_name(self.buf), ":e")
Snacks.debug.run({ buf = self.buf, name = name })
end,
desc = "Source buffer",
mode = { "n", "x" },
},
},
},
},
},
scroll = { enabled = false },
statuscolumn = {
enabled = false, -- Change this to false
left = { "mark", "sign" },
right = { "fold", "git" },
folds = {
open = false,
git_hl = false,
},
git = {
patterns = { "GitSign", "MiniDiffSign" },
},
refresh = 50,
},
terminal = { enabled = false },
toggle = { enabled = false },
win = { enabled = true },
words = { enabled = false },
zen = {
enabled = true,
toggles = {
dim = true,
git_signs = false,
mini_diff_signs = false,
-- diagnostics = false,
-- inlay_hints = false,
},
show = {
statusline = false,
tabline = false,
},
win = { style = "zen" },
zoom = {
toggles = {},
show = { statusline = true, tabline = true },
win = {
backdrop = false,
width = 0,
},
},
},
})
+104
View File
@@ -0,0 +1,104 @@
add({
"m4xshen/smartcolumn.nvim", -- smart column when needed
"karb94/neoscroll.nvim", -- smooth scrolling
"OXY2DEV/markview.nvim", -- rendering for html and markdown
"serhez/bento.nvim", -- buffer manager
{ src = "akinsho/toggleterm.nvim", version = "*" }, --float terminal
"max397574/better-escape.nvim", -- better escape
"zbirenbaum/neodim", -- dimming the highlights of unused functions, variables, parameters, and more
})
-- lazy load UI enhancement plugins
vim.api.nvim_create_autocmd({ "BufReadPost", "BufNewFile" }, {
callback = function()
require("neoscroll").setup({
mappings = { "<C-u>", "<C-d>", "<C-b>", "<C-f>", "<C-y>", "<C-e>", "zt", "zz", "zb" },
})
require("neodim").setup({
alpha = 0.5,
blend_color = nil,
hide = {
underline = true,
virtual_text = true,
signs = true,
},
regex = {
"[uU]nused",
"[nN]ever [rR]ead",
"[nN]ot [rR]ead",
},
priority = 128,
disable = {},
})
end,
})
-- lazy load markdown preview
vim.api.nvim_create_autocmd("FileType", {
pattern = "markdown",
callback = function()
require("markview").setup({
preview = {
icon_provider = "mini",
enable = false,
},
})
end,
})
vim.keymap.set("n", "<leader>cv", "<cmd>Markview toggle<cr>", { desc = "toggle markdown preview" })
-- smart column only when needed
require("smartcolumn").setup({
colorcolumn = 120,
disabled_filetypes = {
"help",
"text",
"markdown",
"oil",
"snacks_dashboard",
"dashboard",
},
})
require("bento").setup({})
require("toggleterm").setup({
size = 10,
open_mapping = [[<c-\>]],
hide_numbers = true,
shade_filetypes = {},
shade_terminals = true,
shading_factor = "2",
start_in_insert = true,
insert_mappings = true,
terminal_mappings = true,
persist_size = true,
direction = "float",
close_on_exit = true,
shell = vim.o.shell,
float_opts = {
border = "curved",
winblend = 0,
highlights = {
border = "Normal",
background = "Normal",
},
},
})
-- lazy load better escape
vim.api.nvim_create_autocmd("InsertEnter", {
callback = function()
require("better_escape").setup({
mappings = {
i = {
k = { j = "<Esc>" },
j = { k = "<Esc>", j = "<Esc>" },
-- disable jj
-- j = { j = false },
},
},
})
end,
once = true,
})
+301
View File
@@ -0,0 +1,301 @@
add("folke/which-key.nvim")
local wk = require("which-key")
wk.setup({
preset = "helix",
plugins = {
marks = true,
registers = true,
spelling = {
enabled = true,
suggestions = 30,
},
},
presets = {
operators = true,
motions = true,
text_objects = true,
windows = true,
nav = true,
z = true,
g = true,
},
icons = {
breadcrumb = "",
separator = "",
group = "",
keys = {
Space = "",
},
rules = false, -- enable auto icon rules
},
show_help = false,
show_keys = true,
triggers = {
{ "<auto>", mode = "nvisoct" },
{ "<leader>", mode = { "n", "v" } },
},
})
local normal_mappings = {
mode = "n",
{ "<leader>x", ":x<cr>", desc = " Save and Quit" },
-- { "<leader>a", group = " AI" },
{ "<leader>b", group = " Buffer" },
{ "<leader>c", group = " Code" },
{ "<leader>cF", ":retab<cr>", desc = "Fix Tabs" },
{ "<leader>cd", ":RootDir<cr>", desc = "Root Directory" },
{ "<leader>cf", ":lua vim.lsp.buf.format({async = true})<cr>", desc = "Format File" },
{ "<leader>cg", ":Neogen<cr>", desc = "Generate Docstring" },
{ "<leader>cl", "::g/^\\s*$/d<cr>", desc = "Clean Empty Lines" },
{ "<leader>cm", ":MarkdownPreviewToggle<cr>", desc = "Markdown Preview" },
{ "<leader>cq", ":lua Snacks.picker.qflist()<cr>", desc = "Quickfix List" },
{ "<leader>e", group = " Edit" },
{ "<leader>ea", ":b#<cr>", desc = "Alternate File" },
{ "<leader>eC", group = "Edit Configs" },
{
"<leader>ee",
function()
local minifiles = require("mini.files")
minifiles.open(vim.api.nvim_buf_get_name(0), true)
minifiles.reveal_cwd()
end,
desc = "Explore Tree",
},
{ "<leader>eE", ":lua Snacks.explorer()<cr>", desc = "File Explorer" },
{ "<leader>ef", "gf", desc = "File Under Cursor" },
{ "<leader>em", ":e README.md<cr>", desc = "Readme" },
{ "<leader>en", ":enew<cr>", desc = "New File" },
{ "<leader>er", ":lua require('snacks').rename.rename_file()<cr>", desc = "Rename Current File" },
{ "<leader>f", group = " Find" },
{ "<leader>fx", ":%bd|e#|bd#<cr>", desc = "Close except current" },
{ "<leader>ff", ":lua Snacks.picker.files()<cr>", desc = "Find Files" },
{ "<leader>fg", ":lua Snacks.picker.grep()<cr>", desc = "Live Grep" },
{ "<leader>fp", ":lua Snacks.picker.projects()<cr>", desc = "Projects" },
{
"<leader>ct",
function()
local curr_path = vim.fn.expand("%:p")
Snacks.picker.todo_comments({
transform = function(item)
local item_path = vim.fn.fnamemodify(item.cwd .. "/" .. item.file, ":p")
return item_path == curr_path
end,
})
end,
desc = "Search Todos in Current File",
},
{ "<leader>fT", ":lua Snacks.picker.todo_comments()<cr>", desc = "Search Todos" },
{ "<leader>fu", ":lua Snacks.picker.undo()<cr>", desc = "Undotree" },
{ "<leader>g", group = " Git" },
{ "<leader>gA", ":Gitsigns stage_buffer<cr>", desc = "Stage Buffer" },
{ "<leader>gR", ":Gitsigns reset_buffer<cr>", desc = "Reset Buffer" },
{ "<leader>ga", ":Gitsigns stage_hunk<cr>", desc = "Stage Hunk" },
{ "<leader>gb", ":lua require('gitsigns').blame_line({full = true})<cr>", desc = "Blame" },
{ "<leader>gB", ":lua require('snacks').git.blame_line()<cr>", desc = "Detailed Blame" },
{ "<leader>gc", ":Gitignore<cr>", desc = "Generate .gitignore" },
{ "<leader>gd", ":Gitsigns diffthis HEAD<cr>", desc = "Git Diff" },
{ "<leader>gF", ":Git<cr>", desc = "Fugitive Panel" },
{ "<leader>gi", ":Gitsigns preview_hunk<cr>", desc = "Hunk Info" },
{ "<leader>gj", ":Gitsigns next_hunk<cr>", desc = "Next Hunk" },
{ "<leader>gk", ":Gitsigns prev_hunk<cr>", desc = "Prev Hunk" },
{ "<leader>gl", ":lua Snacks.picker.git_log()<cr>", desc = "Checkout commit" },
{ "<leader>gr", ":Gitsigns reset_hunk<cr>", desc = "Reset Hunk" },
{ "<leader>gs", ":lua Snacks.picker.git_status()<cr>", desc = "Open changed file" },
{ "<leader>gu", ":Gitsigns undo_stage_hunk<cr>", desc = "Undo Stage Hunk" },
{ "<leader>gv", ":Gitsigns select_hunk<cr>", desc = "Select Hunk" },
{ "<leader>gw", ':lua require("snacks").gitbrowse()<cr>', desc = "Git Browse" },
{ "<leader>gp", ":lua Snacks.picker.git_branches()<cr>", desc = "Pick and Switch Git Branches" },
{ "<leader>gt", group = "Toggle" },
{ "<leader>gtb", ":Gitsigns toggle_current_line_blame<cr>", desc = "Blame" },
{ "<leader>gtd", ":Gitsigns toggle_deleted<cr>", desc = "Deleted" },
{ "<leader>gtl", ":Gitsigns toggle_linehl<cr>", desc = "Line HL" },
{ "<leader>gtn", ":Gitsigns toggle_numhl<cr>", desc = "Number HL" },
{ "<leader>gts", ":Gitsigns toggle_signs<cr>", desc = "Signs" },
{ "<leader>gtw", ":Gitsigns toggle_word_diff<cr>", desc = "Word Diff" },
{ "<leader>i", group = " Insert" },
{ "<leader>id", ":put =strftime('## %a, %d %b, %Y, %r')<cr>", desc = "Date" },
{ "<leader>if", ":put =expand('%:t')<cr>", desc = "File Name" },
{ "<leader>ip", ":put %<cr>", desc = "Relative Path" },
{ "<leader>iP", ":put %:p<cr>", desc = "Absolute Path" },
{ "<leader>it", ":put =strftime('## %r')<cr>", desc = "Time" },
{ "<leader>l", group = " LSP" },
{ "<leader>la", ":Lspsaga code_action<cr>", desc = "Code Action" },
{ "<leader>ld", ":Lspsaga goto_definition<cr>", desc = "Goto Definition" },
{ "<leader>lf", ":Lspsaga finder<cr>", desc = "Finder" },
{ "<leader>lh", ":Lspsaga hover_doc<cr>", desc = "Hover" },
{ "<leader>lI", ":LspInfo<cr>", desc = "LSP Info" },
{ "<leader>lj", ":Lspsaga diagnostic_jump_next<cr>", desc = "Next Diagnostic" },
{ "<leader>lk", ":Lspsaga diagnostic_jump_prev<cr>", desc = "Prev Diagnostic" },
{ "<leader>lo", ":Lspsaga outline<cr>", desc = "Outline" },
{ "<leader>lp", ":Lspsaga peek_definition<cr>", desc = "Peek Definition" },
{ "<leader>lq", ":LspStop<cr>", desc = "Stop LSP" },
{ "<leader>lQ", ":LspRestart<cr>", desc = "Restart LSP" },
{ "<leader>lr", ":Lspsaga rename<cr>", desc = "Rename" },
{ "<leader>lR", ":Lspsaga project_replace<cr>", desc = "Replace" },
{ "<leader>lt", ":Lspsaga goto_type_definition<cr>", desc = "Goto Type Definition" },
{ "<leader>lT", ":Lspsaga peek_type_definition<cr>", desc = "Peek Type Definition" },
{ "<leader>o", group = " Options" },
{ "<leader>oi", "vim.show_pos", desc = "Inspect Position" },
{ "<leader>oN", ":lua Snacks.notifier.show_history()<cr>", desc = "Notification History" },
{ "<leader>or", ":set relativenumber!<cr>", desc = "Relative Numbers" },
{ "<leader>p", group = " Packages" },
{ "<leader>pc", ":Lazy check<cr>", desc = "Check" },
{ "<leader>pd", ":Lazy debug<cr>", desc = "Debug" },
{ "<leader>pe", ':lua require("snacks").profiler.scratch()<cr>', desc = "Profiler Scratch" },
{ "<leader>pf", ':lua require("snacks").profiler.pick()<cr>', desc = "Profiler Pick" },
{ "<leader>pi", ":Lazy install<cr>", desc = "Install" },
{ "<leader>pl", ":Lazy log<cr>", desc = "Log" },
{ "<leader>pm", ":Mason<cr>", desc = "Mason" },
{ "<leader>pp", ":Lazy<cr>", desc = "Plugins" },
{ "<leader>pP", ":Lazy profile<cr>", desc = "Profile" },
{ "<leader>pr", ":Lazy restore<cr>", desc = "Restore" },
{ "<leader>ps", ":Lazy sync<cr>", desc = "Sync" },
{ "<leader>pt", ':lua require("snacks").profiler.toggle()<cr>', desc = "Profiler Toggle" },
{ "<leader>pu", ":Lazy update<cr>", desc = "Update" },
{ "<leader>px", ":Lazy clean<cr>", desc = "Clean" },
{ "<leader>q", group = " Quit" },
{ "<leader>qa", ":qall<cr>", desc = "Quit All" },
{ "<leader>qb", ":bw<cr>", desc = "Close Buffer" },
{ "<leader>qd", ':lua require("snacks").bufdelete()<cr>', desc = "Delete Buffer" },
{ "<leader>qf", ":qall!<cr>", desc = "Force Quit" },
{ "<leader>qo", ":%bdelete|b#|bdelete#<cr>", desc = "Close Others" },
{ "<leader>qq", ":q<cr>", desc = "Quit" },
{ "<leader>qs", "<C-w>c", desc = "Close Split" },
{ "<leader>qw", ":wq<cr>", desc = "Write and Quit" },
{ "<leader>r", group = " Refactor" },
{ "<leader>rd", "", desc = "Go To Definition" }, -- treesitter navigation
{ "<leader>rD", "", desc = "List Definition" },
{ "<leader>rh", "", desc = "List Definition Head" },
{ "<leader>rj", "", desc = "Next Usage" },
{ "<leader>rk", "", desc = "Previous Usage" },
{ "<leader>rn", "", desc = "Swap Next" },
{ "<leader>rp", "", desc = "Swap Previous" },
{ "<leader>rr", "", desc = "Smart Rename" },
{ "<leader>rs", ":%s/\\<<C-r><C-w>\\>/<C-r><C-w>/gI<Left><Left><Left>", desc = "Replace Word Buffer" },
{ "<leader>s", group = " Split" },
{ "<leader>s+", ":resize +10<cr>", desc = "Increase window height" },
{ "<leader>s-", ":vertical resize -20<cr>", desc = "Decrease window width" },
{ "<leader>s/", "<C-w>s", desc = "Split Below" },
{ "<leader>s=", ":vertical resize +20<cr>", desc = "Increase window width" },
{ "<leader>sH", ":vertical resize -10<cr>", desc = "Decrease window width" },
{ "<leader>sJ", ":resize -5<cr>", desc = "Decrease window height" },
{ "<leader>sK", ":resize +5<cr>", desc = "Increase window height" },
{ "<leader>sL", ":vertical resize +10<cr>", desc = "Increase window width" },
{ "<leader>s\\", "<C-w>v", desc = "Split Right" },
{ "<leader>s_", ":resize -10<cr>", desc = "Decrease window height" },
{ "<leader>s`", "<C-w>p", desc = "Previous Window" },
{ "<leader>sa", ":split<cr>", desc = "Horizontal Split" },
{ "<leader>sc", ":tabclose<cr>", desc = "Close Tab" },
{ "<leader>sf", ":tabfirst<cr>", desc = "First Tab" },
{ "<leader>sh", "<C-w>h", desc = "Move Left" },
{ "<leader>sj", "<C-w>j", desc = "Move Down" },
{ "<leader>sk", "<C-w>k", desc = "Move Up" },
{ "<leader>sl", "<C-w>l", desc = "Move Right" },
{ "<leader>sq", "<C-w>c", desc = "Close Split" },
{ "<leader>ss", ":vsplit<cr>", desc = "Vertical Split" },
{ "<leader>t", group = " Terminal" },
{ "<leader>t1", "<cmd>1ToggleTerm<cr>", desc = "Toggle Terminal" },
{ "<leader>t2", "<cmd>2ToggleTerm<cr>", desc = "Toggle Terminal" },
{ "<leader>tc", "<Cmd>close<CR>", desc = "Hide Terminal" },
{ "<leader>th", group = "Inlay Hints" },
{ "<leader>w", group = " Writing" },
{ "<leader>wc", ":set spell!<cr>", desc = "Spellcheck" },
{ "<leader>wd", ':lua require("snacks").dim.enable()<cr>', desc = "Dim On" },
{ "<leader>wD", ':lua require("snacks").dim.disable()<cr>', desc = "Dim Off" },
{ "<leader>wf", ":lua require'utils'.sudo_write()<cr>", desc = "Force Write" },
{ "<leader>wj", "]s", desc = "Next Misspell" },
{ "<leader>wk", "[s", desc = "Prev Misspell" },
{ "<leader>wn", ":WriteNoFormat<cr>", desc = "Write Without Formatting" },
{ "<leader>wq", ":wq<cr>", desc = "Write and Quit" },
{ "<leader>ww", ":w<cr>", desc = "Write" },
{ "<leader>wz", ':lua require("snacks").zen.zen()<cr>', desc = "Zen" },
{ "<leader>wZ", ':lua require("snacks").zen.zoom()<cr>', desc = "Zoom" },
{ "<leader>y", group = " Yank" },
{ "<leader>yL", ":CopyAbsolutePathWithLine<cr>", desc = "Absolute Path with Line" },
{ "<leader>yP", ":CopyAbsolutePath<cr>", desc = "Absolute Path" },
{ "<leader>ya", ":%y+<cr>", desc = "Copy Whole File" },
{ "<leader>yf", ":CopyFileName<cr>", desc = "File Name" },
{ "<leader>yg", ':lua require"gitlinker".get_buf_range_url()<cr>', desc = "Copy Git URL" },
{ "<leader>yl", ":CopyRelativePathWithLine<cr>", desc = "Relative Path with Line" },
{ "<leader>yp", ":CopyRelativePath<cr>", desc = "Relative Path" },
}
local visual_mappings = {
mode = "v",
-- { "<leader>a", group = " AI" },
{ "<leader>c", group = " Code" },
{ "<leader>cS", ":sort!<cr>", desc = "Sort Desc" },
{ "<leader>ci", ":sort i<cr>", desc = "Sort Case Insensitive" },
{ "<leader>cs", ":sort<cr>", desc = "Sort Asc" },
{ "<leader>cu", ":!uniq<cr>", desc = "Unique" },
{ "<leader>cx", ":lua<cr>", desc = "Execute Lua" },
{ "<leader>g", group = " Git" },
{ "<leader>ga", ":'<,'>Gitsigns stage_hunk<cr>", desc = "Stage Hunk" },
{ "<leader>gr", ":'<,'>Gitsigns reset_hunk<cr>", desc = "Reset Hunk" },
{ "<leader>gu", ":'<,'>Gitsigns undo_stage_hunk<cr>", desc = "Undo Stage Hunk" },
{ "<leader>l", group = " LSP" },
{ "<leader>la", ":<C-U>Lspsaga range_code_action<cr>", desc = "Code Action" },
-- { "<leader>o", group = " Options" },
{ "<leader>y", group = " Yank" },
{ "<leader>yg", ':lua require"gitlinker".get_buf_range_url("v")<cr>', desc = "Copy Git URL" },
}
local no_leader_mappings = {
mode = "n",
{ "<C-Down>", ":resize -10<cr>", desc = "Decrease window height" },
{ "<C-Left>", ":vertical resize -10<cr>", desc = "Decrease window width" },
{ "<C-Right>", ":vertical resize +10<cr>", desc = "Increase window width" },
{ "<C-Up>", ":resize +10<cr>", desc = "Increase window height" },
{ "<C-h>", ":NavigatorLeft<cr>", desc = "Move Left" },
{ "<C-j>", ":NavigatorDown<cr>", desc = "Move Down" },
{ "<C-k>", ":NavigatorUp<cr>", desc = "Move Up" },
{ "<C-l>", ":NavigatorRight<cr>", desc = "Move Right" },
{ "<C-\\>", ":NavigatorPrevious<cr>", desc = "Previous Pane" },
-- { '<S-h>', ':bprevious<cr>', desc = 'Previous Buffer' },
-- { '<S-l>', ':bnext<cr>', desc = 'Next Buffer' },
{ "<Tab>", ":bnext<cr>", desc = "Next Buffer" },
{ "<S-Tab>", ":bprevious<cr>", desc = "Previous Buffer" },
{ "K", ":Lspsaga hover_doc<cr>", desc = "LSP Hover" },
{ "Q", ":qall!<cr>", desc = "Force Quit!" },
{ "U", ":redo<cr>", desc = "Redo" },
{ "[", group = " Previous" },
{ "[g", ":Gitsigns prev_hunk<cr>", desc = "Git Hunk" },
{ "[o", group = "Textobjects" },
{ "]", group = " Next" },
{ "]g", ":Gitsigns next_hunk<cr>", desc = "Git Hunk" },
{ "]o", group = "Textobjects" },
{ "gd", ":Lspsaga goto_definition<cr>", desc = "Goto Definition" },
}
wk.add(normal_mappings)
wk.add(visual_mappings)
wk.add(no_leader_mappings)