diff --git a/lua/plugins/astrocore.lua b/lua/plugins/astrocore.lua index 2e0e27b..19ca867 100644 --- a/lua/plugins/astrocore.lua +++ b/lua/plugins/astrocore.lua @@ -155,7 +155,14 @@ return { }, ["L"] = { "BufferLineCycleNext", desc = "Next buffer" }, ["H"] = { "BufferLineCyclePrev", desc = "Previous buffer" }, - [""] = { "Neotree toggle reveal", desc = "Open Explorer (reveal current file)" }, + [""] = { + function() require("snacks").picker.git_files { transform = file_filter } end, + desc = "Find git files", + }, + ["e"] = { + function() require("snacks").picker.files { transform = file_filter } end, + desc = "Find files (cwd)", + }, [""] = { function() require("snacks").picker.smart() end, desc = "Find files", @@ -248,8 +255,6 @@ return { end, desc = "Find AI files", }, - ["p"] = { desc = "Find Package files" }, - ["m"] = { desc = "Find Module files" }, ["g"] = { desc = "Find by Group" }, ["gw"] = { function() @@ -294,8 +299,6 @@ return { desc = "Paste from system clipboard", }, [""] = { function() terminals.scratch_toggle() end, desc = "Open Scratch Terminal" }, - ["f"] = { "ClaudeCodeFocus", desc = "Toggle Claude Code" }, - [""] = { "OverseerRun", desc = "Run Overseer task" }, ["d"] = { function() with_trouble("diagnostics") end, desc = "Search diagnostics ( sends to Trouble)", @@ -313,8 +316,6 @@ return { desc = "Search LSP workspace symbols ( sends to Trouble)", }, - ["L"] = { "Leet", desc = "Open LeetCode" }, - ["u"] = { desc = "UI Toggles" }, ["ud"] = { function() require("snacks").toggle.diagnostics():toggle() end, @@ -404,10 +405,12 @@ return { [""] = { "wabd", desc = "Save, close buffer, and return to normal mode" }, }, v = { - [""] = { "Neotree toggle reveal", desc = "Open Explorer (reveal current file)" }, + [""] = { + function() require("snacks").picker.git_files { transform = file_filter } end, + desc = "Find git files", + }, [""] = { "wbd", desc = "Save and close buffer" }, [""] = { "wbd", desc = "Save and close buffer" }, - [""] = { "ClaudeCodeSend", desc = "Send selection to Claude Code" }, ["D"] = { function() vim.cmd 'normal! "vy' @@ -438,8 +441,10 @@ return { }, }, t = { - [""] = { "ClaudeCodeFocus", desc = "Toggle Claude Code" }, - [""] = { "Neotree toggle reveal", desc = "Open Explorer (reveal current file)" }, + [""] = { + function() require("snacks").picker.git_files { transform = file_filter } end, + desc = "Find git files", + }, [""] = { function() vim.cmd 'normal! "+p' end, desc = "Paste from system clipboard" }, ["f"] = { function() require("snacks").picker.buffers() end, diff --git a/lua/plugins/neotree.lua b/lua/plugins/neotree.lua index ed171f5..c9e468a 100644 --- a/lua/plugins/neotree.lua +++ b/lua/plugins/neotree.lua @@ -57,8 +57,6 @@ return { [""] = "clear_filter", [""] = "open_and_close_neotree", [""] = "open", - -- Claude Code: add file under cursor to context - [""] = function() vim.cmd "ClaudeCodeTreeAdd" end, -- Preview image under cursor via kitty's icat kitten ["p"] = "image_kitty", -- Git keybindings from astrocore diff --git a/lua/plugins/user.lua b/lua/plugins/user.lua index f73c27f..a4fdc53 100644 --- a/lua/plugins/user.lua +++ b/lua/plugins/user.lua @@ -1,119 +1,92 @@ +--- User plugins: cursor animation and snacks.nvim (picker + dashboard) customization --- You can also add or configure plugins by creating files in this `plugins/` folder --- PLEASE REMOVE THE EXAMPLES YOU HAVE NO INTEREST IN BEFORE ENABLING THIS FILE --- Here are some examples: +-- Confirm action for file-opening pickers: +-- open in a vertical split by default, reuse the window when the buffer is +-- already visible in this tab, plain edit when the main window holds an +-- empty scratch buffer. Explicit edit-cmd keybinds ( split, +-- vsplit, tab) carry `action.cmd` and are passed through untouched. +local function vsplit_confirm(picker, item, action) + local actions = require "snacks.picker.actions" + if action.cmd then return actions.jump(picker, item, action) end + local path = item and item.file and require("snacks.picker.util").path(item) + if not (item and (item.buf or path)) then return actions.jump(picker, item, action) end + local buf = item.buf or vim.fn.bufadd(path) + local visible = false + for _, w in ipairs(vim.fn.win_findbuf(buf)) do + if + vim.api.nvim_win_get_tabpage(w) == vim.api.nvim_get_current_tabpage() + and vim.api.nvim_win_get_config(w).relative == "" + then + visible = true + break + end + end + local main_buf = picker.main and vim.api.nvim_win_is_valid(picker.main) and vim.api.nvim_win_get_buf(picker.main) + local main_empty = main_buf + and vim.api.nvim_buf_get_name(main_buf) == "" + and vim.bo[main_buf].buftype == "" + and not vim.bo[main_buf].modified + local cmd = (visible or main_empty) and "edit" or "vsplit" + return actions.jump(picker, item, vim.tbl_extend("force", {}, action, { cmd = cmd })) +end ---@type LazySpec return { -{ - "sphamba/smear-cursor.nvim", - opts = { + { "sphamba/smear-cursor.nvim", opts = {} }, - }, -}, - - -- customize dashboard options { "folke/snacks.nvim", opts = { + picker = { + jump = { reuse_win = true }, + -- vsplit-by-default only for file-opening pickers; location pickers + -- (lsp_*, lines, diagnostics, grep) keep the default in-window jump + sources = { + files = { confirm = vsplit_confirm }, + git_files = { confirm = vsplit_confirm }, + smart = { confirm = vsplit_confirm }, + recent = { confirm = vsplit_confirm }, + buffers = { confirm = vsplit_confirm }, + }, + }, dashboard = { - sections = { - { section = "header" }, - - { section = "keys", gap = 1, padding = 1 }, - { - pane = 2, - icon = " ", - desc = "Browse Repo", - padding = 1, - key = "b", - action = function() - Snacks.gitbrowse() - end, - }, - { - icon = " ", - desc = "Projects (ghq)", - padding = 1, - key = "p", - action = function() - local repos = vim.fn.systemlist("ghq list -p") - vim.ui.select(repos, { prompt = "Select repository" }, function(dir) - if not dir then return end - vim.cmd.cd(dir) - Snacks.picker.files() - end) - end, - }, - function() - local in_git = Snacks.git.get_root() ~= nil - local cmds = { - { - title = "Notifications", - cmd = "gh notify -s -a -n5", - action = function() - vim.ui.open("https://github.com/notifications") - end, - key = "N", - icon = " ", - height = 5, - enabled = true, - }, - { - title = "Open Issues", - cmd = "gh issue list -L 3", - key = "i", - action = function() - vim.fn.jobstart("gh issue list --web", { detach = true }) - end, - icon = " ", - height = 7, - }, - { - icon = " ", - title = "Open PRs", - cmd = "gh pr list -L 3", - key = "P", - action = function() - vim.fn.jobstart("gh pr list --web", { detach = true }) - end, - height = 7, - }, - { - icon = " ", - title = "Git Status", - cmd = "git --no-pager diff --stat -B -M -C", - height = 10, - }, - } - return vim.tbl_map(function(cmd) - return vim.tbl_extend("force", { - pane = 2, - section = "terminal", - enabled = in_git, - padding = 1, - ttl = 5 * 60, - indent = 3, - }, cmd) - end, cmds) - end, - { section = "startup" }, - }, - preset = { + enabled = true, + preset = { + -- "prdlk.nvim" in ansi_regular block style header = table.concat({ - " █████ ███████ ████████ ██████ ██████ ", - "██ ██ ██ ██ ██ ██ ██ ██", - "███████ ███████ ██ ██████ ██ ██", - "██ ██ ██ ██ ██ ██ ██ ██", - "██ ██ ███████ ██ ██ ██ ██████ ", - "", - "███  ██ ██  ██ ██ ███  ███", - "████  ██ ██  ██ ██ ████  ████", - "██ ██  ██ ██  ██ ██ ██ ████ ██", - "██  ██ ██  ██  ██  ██ ██  ██  ██", - "██   ████   ████   ██ ██      ██", + "██████ ██████ ██████ ██ ██ ██ ███ ██ ██ ██ ██ ███ ███", + "██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ████ ████", + "██████ ██████ ██ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ████ ██", + "██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██", + "██ ██ ██ ██████ ███████ ██ ██ ██ ██ ████ ████ ██ ██ ██", }, "\n"), }, + sections = { + { section = "header" }, + { section = "keys", gap = 1, padding = 1 }, + { + icon = " ", + desc = "Browse Repo", + padding = 1, + key = "b", + action = function() Snacks.gitbrowse() end, + }, + { + icon = " ", + desc = "Projects (ghq)", + padding = 1, + key = "p", + action = function() + local repos = vim.fn.systemlist "ghq list -p" + vim.ui.select(repos, { prompt = "Select repository" }, function(dir) + if not dir then return end + vim.cmd.cd(dir) + Snacks.picker.files() + end) + end, + }, + { section = "startup" }, + }, }, }, },