snacks + tabline changes

This commit is contained in:
iofq 2025-07-18 09:36:11 -05:00
parent 97d6553252
commit ac39b0585d
No known key found for this signature in database
GPG key ID: ECF3B2DA38BF7183
11 changed files with 120 additions and 70 deletions

View file

@ -49,6 +49,7 @@
stylua stylua
luajitPackages.luacheck luajitPackages.luacheck
alejandra alejandra
nvim-dev
]; ];
shellHook = '' shellHook = ''
# symlink the .luarc.json generated in the overlay # symlink the .luarc.json generated in the overlay

View file

@ -385,10 +385,11 @@ hi(0, 'MiniDepsTitle', { link = 'Title' })
hi(0, 'MiniDepsTitleError', { bg = '#e85c51', fg = '#0f1c1e' }) hi(0, 'MiniDepsTitleError', { bg = '#e85c51', fg = '#0f1c1e' })
hi(0, 'MiniDepsTitleSame', { link = 'DiffText' }) hi(0, 'MiniDepsTitleSame', { link = 'DiffText' })
hi(0, 'MiniDepsTitleUpdate', { bg = '#7aa4a1', fg = '#0f1c1e' }) hi(0, 'MiniDepsTitleUpdate', { bg = '#7aa4a1', fg = '#0f1c1e' })
hi(0, 'MiniDiffOverAdd', { link = 'DiffAdd' }) hi(0, 'MiniDiffOverAdd', { bg = '#31474b' })
hi(0, 'MiniDiffOverChange', { link = 'DiffText' }) hi(0, 'MiniDiffOverChange', { bg = '#466066' })
hi(0, 'MiniDiffOverContext', { link = 'DiffChange' }) hi(0, 'MiniDiffOverChangeBuf', { bg = '#466066' })
hi(0, 'MiniDiffOverDelete', { link = 'DiffDelete' }) hi(0, 'MiniDiffOverContext', { bg = '#31474b' })
hi(0, 'MiniDiffOverDelete', { fg = 'red' })
hi(0, 'MiniDiffSignAdd', { fg = 'green', bold = true }) hi(0, 'MiniDiffSignAdd', { fg = 'green', bold = true })
hi(0, 'MiniDiffSignChange', { fg = 'green', bold = true }) hi(0, 'MiniDiffSignChange', { fg = 'green', bold = true })
hi(0, 'MiniDiffSignDelete', { fg = 'red', bold = true }) hi(0, 'MiniDiffSignDelete', { fg = 'red', bold = true })

View file

@ -87,6 +87,8 @@ vim.keymap.set('n', '<S-l>', vim.cmd.bnext, { noremap = true, silent = true })
vim.keymap.set('n', '<S-h>', vim.cmd.bprev, { noremap = true, silent = true }) vim.keymap.set('n', '<S-h>', vim.cmd.bprev, { noremap = true, silent = true })
vim.keymap.set('v', '<', '<gv') vim.keymap.set('v', '<', '<gv')
vim.keymap.set('v', '>', '>gv') vim.keymap.set('v', '>', '>gv')
vim.keymap.set('v', '<A-j>', ":m '>+1<CR>gv=gv", { desc = 'move selection down' })
vim.keymap.set('v', '<A-k>', ":m '<-2<CR>gv=gv", { desc = 'move selection up' })
vim.keymap.set({ 'v', 'n' }, 'q:', '<nop>') vim.keymap.set({ 'v', 'n' }, 'q:', '<nop>')
vim.keymap.set('n', 'gq', vim.cmd.bdelete, { noremap = true, silent = true, desc = 'close buffer' }) vim.keymap.set('n', 'gq', vim.cmd.bdelete, { noremap = true, silent = true, desc = 'close buffer' })
vim.keymap.set('n', 'gQ', function() vim.keymap.set('n', 'gQ', function()

View file

@ -32,6 +32,13 @@ return {
snippets = { snippets = {
score_offset = -10, score_offset = -10,
}, },
path = {
opts = {
get_cwd = function(_)
return vim.fn.getcwd()
end,
},
},
ripgrep = { ripgrep = {
module = 'blink-ripgrep', module = 'blink-ripgrep',
name = 'rg', name = 'rg',

View file

@ -1,7 +1,6 @@
local diff = require('mini.diff') local diff = require('mini.diff')
local M = { local M = {
cache = {}, cache = {},
jj_cache = {},
} }
M.get_buf_realpath = function(buf_id) M.get_buf_realpath = function(buf_id)
@ -20,10 +19,10 @@ M.jj_start_watching_tree_state = function(buf_id, path)
local on_not_in_jj = vim.schedule_wrap(function() local on_not_in_jj = vim.schedule_wrap(function()
if not vim.api.nvim_buf_is_valid(buf_id) then if not vim.api.nvim_buf_is_valid(buf_id) then
M.cache[buf_id] = nil M.cache[buf_id] = nil
return return false
end end
diff.fail_attach(buf_id) diff.fail_attach(buf_id)
M.jj_cache[buf_id] = {} M.cache[buf_id] = {}
end) end)
local process, stdout_feed = nil, {} local process, stdout_feed = nil, {}
@ -61,12 +60,11 @@ M.jj_setup_tree_state_watch = function(buf_id, jj_dir_path)
timer:stop() timer:stop()
timer:start(50, 0, buf_jj_set_ref_text) timer:start(50, 0, buf_jj_set_ref_text)
end end
buf_fs_event:start(jj_dir_path, { recursive = false }, watch_tree_state) buf_fs_event:start(jj_dir_path, { stat = true }, watch_tree_state)
M.jj_invalidate_cache(M.jj_cache[buf_id]) M.jj_invalidate_cache(M.cache[buf_id])
M.jj_cache[buf_id] = { fs_event = buf_fs_event, timer = timer } M.cache[buf_id] = { fs_event = buf_fs_event, timer = timer }
end end
M.jj_set_ref_text = vim.schedule_wrap(function(buf_id) M.jj_set_ref_text = vim.schedule_wrap(function(buf_id)
if not vim.api.nvim_buf_is_valid(buf_id) then if not vim.api.nvim_buf_is_valid(buf_id) then
return return
@ -86,13 +84,13 @@ M.jj_set_ref_text = vim.schedule_wrap(function(buf_id)
-- Set -- Set
local stdout = vim.loop.new_pipe() local stdout = vim.loop.new_pipe()
local spawn_opts = { local spawn_opts = {
args = { 'file', 'show', '--ignore-working-copy', '-r', '@-', './' .. basename }, args = { 'file', 'show', '--no-pager', '--ignore-working-copy', '-r', '@-', './' .. basename },
cwd = cwd, cwd = cwd,
stdio = { nil, stdout, nil }, stdio = { nil, stdout, nil },
} }
local process, stdout_feed = nil, {} local process, stdout_feed = nil, {}
local on_exit = function(exit_code) process = vim.loop.spawn('jj', spawn_opts, function(exit_code)
process:close() process:close()
if exit_code ~= 0 or stdout_feed[1] == nil then if exit_code ~= 0 or stdout_feed[1] == nil then
@ -102,9 +100,8 @@ M.jj_set_ref_text = vim.schedule_wrap(function(buf_id)
-- Set reference text accounting for possible 'crlf' end of line in index -- Set reference text accounting for possible 'crlf' end of line in index
local text = table.concat(stdout_feed, ''):gsub('\r\n', '\n') local text = table.concat(stdout_feed, ''):gsub('\r\n', '\n')
buf_set_ref_text(text) buf_set_ref_text(text)
end end)
process = vim.loop.spawn('jj', spawn_opts, on_exit)
M.jj_read_stream(stdout, stdout_feed) M.jj_read_stream(stdout, stdout_feed)
end) end)
@ -132,7 +129,7 @@ end
M.gen_source = function() M.gen_source = function()
local attach = function(buf_id) local attach = function(buf_id)
-- Try attaching to a buffer only once -- Try attaching to a buffer only once
if M.jj_cache[buf_id] ~= nil then if M.cache[buf_id] ~= nil then
return false return false
end end
-- - Possibly resolve symlinks to get data from the original repo -- - Possibly resolve symlinks to get data from the original repo
@ -141,13 +138,13 @@ M.gen_source = function()
return false return false
end end
M.jj_cache[buf_id] = {} M.cache[buf_id] = {}
M.jj_start_watching_tree_state(buf_id, path) M.jj_start_watching_tree_state(buf_id, path)
end end
local detach = function(buf_id) local detach = function(buf_id)
local cache = M.jj_cache[buf_id] local cache = M.cache[buf_id]
M.jj_cache[buf_id] = nil M.cache[buf_id] = nil
M.jj_invalidate_cache(cache) M.jj_invalidate_cache(cache)
end end

View file

@ -50,7 +50,7 @@ M.load = function()
-- load session (buffers, etc) as well as shada (marks) -- load session (buffers, etc) as well as shada (marks)
sessions.read(id) sessions.read(id)
vim.cmd('rshada') vim.cmd('rshada')
vim.notify('loaded jj session: ' .. id) Snacks.notify('loaded jj session: ' .. id)
end end
end) end)
else else

View file

@ -1,10 +1,10 @@
M = {} M = {}
M.marks = function() M.marks = function()
return { Snacks.picker.marks {
finder = 'vim_marks',
format = 'file',
['local'] = false, ['local'] = false,
global = true, on_show = function()
vim.cmd.delmarks { args = { '0-9' } }
end,
actions = { actions = {
markdel = function(picker) markdel = function(picker)
for _, item in ipairs(picker:selected()) do for _, item in ipairs(picker:selected()) do
@ -17,10 +17,42 @@ M.marks = function()
end, end,
}, },
win = { win = {
list = { input = {
keys = { ['dd'] = 'markdel' }, keys = { ['<c-x>'] = 'markdel' },
}, },
}, },
} }
end end
M.diagnostics = function(filter)
Snacks.picker.diagnostics {
filter = filter,
focus = 'list',
format = function(item, picker)
P = require('snacks.picker.format')
local ret = {} ---@type snacks.picker.Highlight[]
vim.list_extend(ret, P.filename(item, picker))
local diag = item.item ---@type vim.Diagnostic
if item.severity then
vim.list_extend(ret, P.severity(item, picker))
end
local message = diag.message
ret[#ret + 1] = { message }
Snacks.picker.highlight.markdown(ret)
ret[#ret + 1] = { ' ' }
if diag.source then
ret[#ret + 1] = { diag.source, 'SnacksPickerDiagnosticSource' }
ret[#ret + 1] = { ' ' }
end
if diag.code then
ret[#ret + 1] = { ('(%s)'):format(diag.code), 'SnacksPickerDiagnosticCode' }
ret[#ret + 1] = { ' ' }
end
return ret
end,
}
end
return M return M

View file

@ -1,5 +1,8 @@
return { return {
{ {
'neovim/nvim-lspconfig',
event = 'VeryLazy',
dependencies = {
'folke/trouble.nvim', 'folke/trouble.nvim',
event = 'VeryLazy', event = 'VeryLazy',
opts = { opts = {
@ -13,17 +16,7 @@ return {
type = 'split', type = 'split',
}, },
}, },
keys = {
{
'gre',
'<cmd>Trouble diagnostics toggle<CR>',
desc = 'Trouble diagnostics',
}, },
},
},
{
'neovim/nvim-lspconfig',
event = 'VeryLazy',
config = function() config = function()
vim.lsp.enable { vim.lsp.enable {
'nil_ls', 'nil_ls',
@ -40,23 +33,35 @@ return {
return return
end end
vim.keymap.set('n', 'grg', '<cmd>Trouble lsp toggle<CR>', { buffer = ev.buf, desc = 'Trouble LSP' }) vim.keymap.set('n', 'grg', '<cmd>Trouble lsp toggle<CR>', { buffer = ev.buf, desc = 'Trouble LSP' })
vim.keymap.set(
'n', vim.keymap.set('n', 'gO', function()
'gO', Snacks.picker.lsp_symbols { focus = 'list' }
'<cmd>Trouble lsp_document_symbols win.position=left<CR>', end, { buffer = ev.buf, desc = 'LSP symbols' })
{ buffer = ev.buf, desc = 'Trouble LSP symbols' } vim.keymap.set('n', '<C-]>', function()
)
vim.keymap.set('n', 'grd', function()
Snacks.picker.lsp_definitions { focus = 'list' } Snacks.picker.lsp_definitions { focus = 'list' }
end, { buffer = ev.buf, desc = 'LSP definition' }) end, { buffer = ev.buf, desc = 'LSP definition' })
vim.keymap.set('n', 'grt', function()
Snacks.picker.lsp_type_definitions { focus = 'list' }
end, { buffer = ev.buf, desc = 'LSP type definition' })
vim.keymap.set('n', 'grr', function() vim.keymap.set('n', 'grr', function()
Snacks.picker.lsp_references { focus = 'list' } Snacks.picker.lsp_references { focus = 'list' }
end, { buffer = ev.buf, desc = 'LSP definition' }) end, { buffer = ev.buf, desc = 'LSP refrences' })
vim.keymap.set('n', 'gri', function()
Snacks.picker.lsp_implementations { focus = 'list' }
end, { buffer = ev.buf, desc = 'LSP implementations' })
vim.keymap.set('n', 'grh', function() vim.keymap.set('n', 'grh', function()
vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled())
end, { buffer = ev.buf, desc = 'LSP hints toggle' }) end, { buffer = ev.buf, desc = 'LSP hints toggle' })
vim.keymap.set('n', 'grl', vim.lsp.codelens.run, { buffer = ev.buf, desc = 'vim.lsp.codelens.run()' }) vim.keymap.set('n', 'grl', vim.lsp.codelens.run, { buffer = ev.buf, desc = 'vim.lsp.codelens.run()' })
vim.keymap.set('n', 'gre', function()
require('plugins.lib.snacks').diagnostics { buf = true }
end, { buffer = ev.buf, desc = 'LSP buffer diagnostics' })
vim.keymap.set('n', 'grE', function()
require('plugins.lib.snacks').diagnostics { cwd = false }
end, { buffer = ev.buf, desc = 'LSP diagnostics' })
-- Auto-refresh code lenses -- Auto-refresh code lenses
if client.server_capabilities.codeLensProvider then if client.server_capabilities.codeLensProvider then
vim.api.nvim_create_autocmd({ 'InsertLeave', 'TextChanged' }, { vim.api.nvim_create_autocmd({ 'InsertLeave', 'TextChanged' }, {
@ -81,6 +86,7 @@ return {
'\\f', '\\f',
function() function()
vim.b.disable_autoformat = not vim.b.disable_autoformat vim.b.disable_autoformat = not vim.b.disable_autoformat
Snacks.notify(string.format('Buffer formatting disabled: %s', vim.b.disable_autoformat))
end, end,
mode = { 'n', 'x' }, mode = { 'n', 'x' },
desc = 'toggle buffer formatting', desc = 'toggle buffer formatting',
@ -89,6 +95,7 @@ return {
'\\F', '\\F',
function() function()
vim.g.disable_autoformat = not vim.g.disable_autoformat vim.g.disable_autoformat = not vim.g.disable_autoformat
Snacks.notify(string.format('Global formatting disabled: %s', vim.g.disable_autoformat))
end, end,
mode = { 'n', 'x' }, mode = { 'n', 'x' },
desc = 'toggle global formatting', desc = 'toggle global formatting',

View file

@ -50,6 +50,17 @@ return {
require('mini.tabline').setup { require('mini.tabline').setup {
tabpage_section = 'right', tabpage_section = 'right',
show_icons = false, show_icons = false,
format = function(buf_id, label) -- show global marks in tab
local default = MiniTabline.default_format(buf_id, label)
for _, mark in ipairs(vim.fn.getmarklist()) do
if mark.pos[1] == buf_id then
if mark.mark:match("^'[A-Z]$") then
return ' [' .. mark.mark:sub(2) .. ']' .. default
end
end
end
return default
end,
} }
require('mini.statusline').setup { require('mini.statusline').setup {
content = { content = {
@ -175,15 +186,10 @@ return {
width_preview = 50, width_preview = 50,
}, },
} }
vim.keymap.set( vim.keymap.set('n', '<leader>nc', function()
'n',
'<leader>nc',
function()
files.open(vim.api.nvim_buf_get_name(0), false) -- open current buffer's dir files.open(vim.api.nvim_buf_get_name(0), false) -- open current buffer's dir
files.reveal_cwd() files.reveal_cwd()
end, end, { desc = 'minifiles open' })
{ desc = 'minifiles open' }
)
vim.api.nvim_create_autocmd('User', { vim.api.nvim_create_autocmd('User', {
pattern = 'MiniFilesBufferCreate', pattern = 'MiniFilesBufferCreate',
callback = function(args) callback = function(args)

View file

@ -37,7 +37,7 @@ return {
}, },
smart = { smart = {
multi = { multi = {
require('plugins.lib.snacks').marks(), 'marks',
{ source = 'buffers', current = false }, { source = 'buffers', current = false },
'recent', 'recent',
{ source = 'files', hidden = true }, { source = 'files', hidden = true },
@ -178,8 +178,7 @@ return {
{ {
'<leader>fm', '<leader>fm',
function() function()
vim.cmd.delmarks { args = { '0-9' } } require('plugins.lib.snacks').marks()
Snacks.picker.pick(require('plugins.lib.snacks').marks())
end, end,
desc = 'pick global marks', desc = 'pick global marks',
}, },

View file

@ -32,12 +32,10 @@ return {
goto_next_start = { goto_next_start = {
[']a'] = '@parameter.inner', [']a'] = '@parameter.inner',
[']f'] = '@function.outer', [']f'] = '@function.outer',
[']t'] = '@statement.outer',
}, },
goto_previous_start = { goto_previous_start = {
['[a'] = '@parameter.inner', ['[a'] = '@parameter.inner',
['[f'] = '@function.outer', ['[f'] = '@function.outer',
['[t'] = '@statement.outer',
}, },
}, },
swap = { swap = {