migrate to new builtin plugin manager with new folder structure
This commit is contained in:
39 files changed
+2139
-2485
No files matched your search
@@ -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 },
|
||||
},
|
||||
})
|
||||
@@ -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" })
|
||||
@@ -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,
|
||||
})
|
||||
@@ -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" })
|
||||
@@ -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 })
|
||||
@@ -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
@@ -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,
|
||||
},
|
||||
})
|
||||
@@ -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
@@ -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,
|
||||
})
|
||||
@@ -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)
|
||||
Reference in new issue
Block a user