417 lines
13 KiB
Lua
417 lines
13 KiB
Lua
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 = false },
|
|
dim = {
|
|
enabled = true,
|
|
scope = {
|
|
min_size = 5,
|
|
max_size = 20,
|
|
siblings = true,
|
|
},
|
|
},
|
|
explorer = { enabled = false },
|
|
projects = {
|
|
enabled = true,
|
|
dirs = {
|
|
'~/Projects',
|
|
'~/Projects/other',
|
|
'~/.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 = 20, 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 = {
|
|
dev = { '~/Projects', '~/Projects/other' },
|
|
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 = true },
|
|
select = { enabled = true },
|
|
statuscolumn = {
|
|
enabled = true, -- 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 = true },
|
|
win = { enabled = true },
|
|
words = { enabled = true },
|
|
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,
|
|
},
|
|
},
|
|
},
|
|
})
|
|
|
|
--- LSP Notifications via Snacks
|
|
local spinner = { '⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏' }
|
|
|
|
-- Notify when an LSP server connects
|
|
vim.api.nvim_create_autocmd('LspAttach', {
|
|
callback = function(args)
|
|
local client = vim.lsp.get_client_by_id(args.data.client_id)
|
|
if client then
|
|
vim.notify('Attached ' .. client.name, vim.log.levels.INFO, {
|
|
title = 'LSP',
|
|
icon = ' ',
|
|
timeout = 1500,
|
|
})
|
|
end
|
|
end,
|
|
})
|
|
|
|
-- Show progress using Neovim's built-in vim.lsp.status()
|
|
vim.api.nvim_create_autocmd('LspProgress', {
|
|
callback = function(ev)
|
|
local client = vim.lsp.get_client_by_id(ev.data.client_id)
|
|
local is_done = ev.data.params.value.kind == 'end'
|
|
local msg = vim.lsp.status()
|
|
if msg == '' then
|
|
msg = is_done and 'Ready' or 'Processing...'
|
|
end
|
|
|
|
vim.notify(msg, vim.log.levels.INFO, {
|
|
id = 'lsp_progress',
|
|
title = client and client.name or 'LSP',
|
|
timeout = is_done and 1000 or false,
|
|
opts = function(notif)
|
|
notif.icon = is_done and ' '
|
|
or spinner[math.floor(vim.uv.hrtime() / (1e6 * 80)) % #spinner + 1]
|
|
end,
|
|
})
|
|
end,
|
|
})
|
|
|
|
|