| @ -1,11 +0,0 @@ | |||||
| return { | |||||
| "greggh/claude-code.nvim", | |||||
| dependencies = { | |||||
| "nvim-lua/plenary.nvim", -- Required for git operations | |||||
| }, | |||||
| config = function() | |||||
| require("claude-code").setup() | |||||
| vim.keymap.set('n', '<leader>CC', '<cmd>ClaudeCode<CR>', { desc = 'Toggle Claude Code' }) | |||||
| end | |||||
| } | |||||
| @ -1,93 +0,0 @@ | |||||
| return { | |||||
| "mfussenegger/nvim-dap", | |||||
| dependencies = { | |||||
| "rcarriga/nvim-dap-ui", | |||||
| "theHamsta/nvim-dap-virtual-text", | |||||
| }, | |||||
| config = function() | |||||
| local dap = require("dap") | |||||
| local dapui = require('dapui') | |||||
| -- Setup DAP UI with explicit configuration | |||||
| dapui.setup() | |||||
| dap.adapters.php = { | |||||
| type = 'executable', | |||||
| command = vim.fn.stdpath('data') .. '/mason/bin/php-debug-adapter', | |||||
| } | |||||
| -- Get the correct project paths (make this global so keys can access it) | |||||
| _G.get_project_paths = function() | |||||
| local cwd = vim.fn.getcwd() | |||||
| -- Check if we're in the project root (where docker-compose.yml is) | |||||
| if vim.fn.filereadable(cwd .. "/docker-compose.yml") == 1 then | |||||
| return { | |||||
| project_root = cwd, | |||||
| api_path = cwd .. "/app/api", | |||||
| docker_path = "/var/www" | |||||
| } | |||||
| -- Check if we're in the app/api directory | |||||
| elseif string.match(cwd, "app/api$") then | |||||
| local project_root = string.gsub(cwd, "/app/api$", "") | |||||
| return { | |||||
| project_root = project_root, | |||||
| api_path = cwd, | |||||
| docker_path = "/var/www" | |||||
| } | |||||
| else | |||||
| -- Fallback - assume we're somewhere in the project | |||||
| return { | |||||
| project_root = cwd, | |||||
| api_path = cwd, | |||||
| docker_path = "/var/www" | |||||
| } | |||||
| end | |||||
| end | |||||
| local paths = _G.get_project_paths() | |||||
| -- PHP configurations | |||||
| dap.configurations.php = { | |||||
| { | |||||
| name = "🚀 Jack Laravel - Listen for Xdebug", | |||||
| type = "php", | |||||
| request = "launch", | |||||
| port = 9003, | |||||
| pathMappings = { | |||||
| [paths.docker_path] = paths.api_path, | |||||
| }, | |||||
| hostname = "0.0.0.0", | |||||
| log = true, | |||||
| xdebugSettings = { | |||||
| max_children = 512, | |||||
| max_data = 1024, | |||||
| max_depth = 4, | |||||
| }, | |||||
| }, | |||||
| { | |||||
| name = "🌐 Jack Laravel - Web Request Debug", | |||||
| type = "php", | |||||
| request = "launch", | |||||
| port = 9003, | |||||
| pathMappings = { | |||||
| ["/var/www"] = paths.api_path, | |||||
| }, | |||||
| hostname = "0.0.0.0", | |||||
| -- Pre-configure for Laravel routes | |||||
| breakMode = "request", | |||||
| } | |||||
| } | |||||
| end, | |||||
| keys = { | |||||
| { "<leader>DD", function() require("dap").continue() end, desc = "Start Laravel Debug" }, | |||||
| { "<leader>Ds", function() require("dap").step_over() end, desc = "Step Over" }, | |||||
| { "<leader>Di", function() require("dap").step_into() end, desc = "Step Into" }, | |||||
| { "<leader>Do", function() require("dap").step_out() end, desc = "Step Out" }, -- Fixed: was "Ds" twice | |||||
| { "<leader>bp", function() require("dap").toggle_breakpoint() end, desc = "Toggle Breakpoint" }, | |||||
| { "<leader>bP", function() require("dap").set_breakpoint(vim.fn.input("Breakpoint condition: ")) end, desc = "Conditional Breakpoint" }, | |||||
| { "<leader>dr", function() require("dap").repl.open() end, desc = "Open REPL" }, | |||||
| { "<leader>dl", function() require("dap").run_last() end, desc = "Run Last" }, | |||||
| { "<leader>du", function() require("dapui").toggle() end, desc = "Toggle DAP UI" }, | |||||
| }, | |||||
| } | |||||
| @ -1,10 +0,0 @@ | |||||
| return { | |||||
| "m4xshen/hardtime.nvim", | |||||
| enabled = false, | |||||
| lazy = false, | |||||
| dependencies = { | |||||
| "MunifTanjim/nui.nvim", | |||||
| "rcarriga/nvim-notify", | |||||
| }, | |||||
| opts = {}, | |||||
| } | |||||
| @ -1,26 +0,0 @@ | |||||
| return { | |||||
| "rcarriga/nvim-notify", | |||||
| event = "VeryLazy", | |||||
| opts = { | |||||
| background_colour = "#000000", | |||||
| fps = 30, | |||||
| icons = { | |||||
| DEBUG = "", | |||||
| ERROR = "", | |||||
| INFO = "", | |||||
| TRACE = "✎", | |||||
| WARN = "" | |||||
| }, | |||||
| level = 2, | |||||
| minimum_width = 50, | |||||
| render = "default", | |||||
| stages = "fade_in_slide_out", | |||||
| timeout = 5000, | |||||
| top_down = true | |||||
| }, | |||||
| config = function(_, opts) | |||||
| local notify = require("notify") | |||||
| notify.setup(opts) | |||||
| vim.notify = notify | |||||
| end, | |||||
| } | |||||
| @ -0,0 +1,270 @@ | |||||
| return { | |||||
| "folke/snacks.nvim", | |||||
| priority = 1000, | |||||
| lazy = false, | |||||
| opts = { | |||||
| -- Dashboard/Starter | |||||
| dashboard = { enabled = false }, | |||||
| -- Notification system (replaces nvim-notify) | |||||
| notifier = { | |||||
| enabled = true, | |||||
| timeout = 5000, | |||||
| width = { min = 50, 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.INFO, | |||||
| icons = { | |||||
| error = " ", | |||||
| warn = " ", | |||||
| info = " ", | |||||
| debug = " ", | |||||
| trace = "✎ ", | |||||
| }, | |||||
| style = "compact", | |||||
| }, | |||||
| -- File picker (replaces telescope) | |||||
| picker = { | |||||
| enabled = true, | |||||
| -- Performance optimizations | |||||
| show_delay = 0, -- Show picker immediately (default is 5000ms) | |||||
| limit_live = 5000, -- Reduce live search limit for better performance | |||||
| matcher = { | |||||
| frecency = false, -- Disable frecency for faster startup (enable if you want recency scoring) | |||||
| cwd_bonus = false, -- Disable for better performance | |||||
| history_bonus = false, -- Disable for better performance | |||||
| }, | |||||
| formatters = { | |||||
| file = { | |||||
| filename_first = true, | |||||
| }, | |||||
| }, | |||||
| win = { | |||||
| input = { | |||||
| keys = { | |||||
| ["<C-n>"] = { "list_down", mode = { "i", "n" } }, | |||||
| ["<C-p>"] = { "list_up", mode = { "i", "n" } }, | |||||
| ["<C-j>"] = { "history_next", mode = { "i", "n" } }, | |||||
| ["<C-k>"] = { "history_prev", mode = { "i", "n" } }, | |||||
| ["<C-q>"] = { "qflist", mode = { "i", "n" } }, | |||||
| ["<C-c>"] = { "close", mode = { "i", "n" } }, | |||||
| }, | |||||
| }, | |||||
| }, | |||||
| sources = { | |||||
| files = { | |||||
| hidden = true, | |||||
| follow = true, | |||||
| -- Let snacks auto-detect fd (fastest) or fallback to rg/find | |||||
| }, | |||||
| grep = { | |||||
| hidden = true, | |||||
| follow = true, | |||||
| }, | |||||
| }, | |||||
| }, | |||||
| -- Quickfile (fast file operations) | |||||
| quickfile = { enabled = true }, | |||||
| -- Statuscolumn enhancements | |||||
| statuscolumn = { | |||||
| enabled = true, | |||||
| left = { "mark", "sign" }, -- priority of signs on the left (high to low) | |||||
| right = { "fold", "git" }, -- priority of signs on the right (high to low) | |||||
| folds = { | |||||
| open = false, -- show open fold icons | |||||
| git_hl = false, -- use Git Signs hl for fold icons | |||||
| }, | |||||
| git = { | |||||
| -- patterns to match Git signs | |||||
| patterns = { "GitSign", "MiniDiffSign" }, | |||||
| }, | |||||
| refresh = 50, -- refresh at most every 50ms | |||||
| }, | |||||
| -- Word highlighting | |||||
| words = { enabled = true }, | |||||
| -- Styling for inputs | |||||
| input = { enabled = true }, | |||||
| -- Scrolling | |||||
| scroll = { enabled = false }, | |||||
| -- Indent guides | |||||
| indent = { enabled = false }, | |||||
| -- Scope highlighting | |||||
| scope = { enabled = true }, | |||||
| -- Git integration with blame | |||||
| git = { | |||||
| enabled = true, | |||||
| }, | |||||
| gitbrowse = { | |||||
| enabled = true, | |||||
| }, | |||||
| -- Rename with LSP | |||||
| rename = { enabled = true }, | |||||
| -- Terminal | |||||
| terminal = { enabled = true }, | |||||
| -- Zen mode | |||||
| zen = { enabled = false }, | |||||
| -- Dim inactive windows | |||||
| dim = { enabled = false }, | |||||
| -- Better quickfix | |||||
| quickfix = { enabled = true }, | |||||
| -- Scratch buffer | |||||
| scratch = { enabled = true }, | |||||
| -- Toggle options | |||||
| toggle = { enabled = true }, | |||||
| -- Profiler | |||||
| profiler = { enabled = false }, | |||||
| -- Debugging helpers | |||||
| debug = { enabled = false }, | |||||
| -- Treesitter scope | |||||
| treesitter = { enabled = true }, | |||||
| }, | |||||
| keys = { | |||||
| -- File navigation (replacing telescope keybindings) | |||||
| { "<leader>p", function() Snacks.picker.smart() end, desc = "Find project files" }, | |||||
| { "<leader>ff", function() Snacks.picker.grep() end, desc = "Live grep" }, | |||||
| { "<leader>fg", function() Snacks.picker.grep() end, desc = "Live grep" }, | |||||
| { "<leader>fr", function() Snacks.picker.resume() end, desc = "Resume last picker" }, | |||||
| { "<leader>fb", function() Snacks.picker.buffers() end, desc = "Find buffers" }, | |||||
| { "<leader>fo", function() Snacks.picker.recent() end, desc = "Find recent files" }, | |||||
| { "<leader>fc", function() Snacks.picker.commands() end, desc = "Find commands" }, | |||||
| -- Search | |||||
| { | |||||
| "<leader>fw", | |||||
| function() | |||||
| Snacks.picker.grep_word() | |||||
| end, | |||||
| desc = "Grep word under cursor" | |||||
| }, | |||||
| { | |||||
| "<leader>fW", | |||||
| function() | |||||
| local word = vim.fn.expand("<cWORD>") | |||||
| Snacks.picker.grep({ search = word }) | |||||
| end, | |||||
| desc = "Grep WORD under cursor" | |||||
| }, | |||||
| { | |||||
| "<leader>fw", | |||||
| function() | |||||
| local mode = vim.fn.mode() | |||||
| if mode == 'v' or mode == 'V' then | |||||
| vim.cmd('noau normal! "vy"') | |||||
| local text = vim.fn.getreg('v') | |||||
| vim.fn.setreg('v', {}) | |||||
| text = string.gsub(text, "\n", "") | |||||
| if #text > 0 then | |||||
| Snacks.picker.grep({ search = text }) | |||||
| else | |||||
| Snacks.picker.grep() | |||||
| end | |||||
| end | |||||
| end, | |||||
| mode = "v", | |||||
| desc = "Grep selection" | |||||
| }, | |||||
| { | |||||
| "<leader>fF", | |||||
| function() | |||||
| local word = vim.fn.expand("<cword>") | |||||
| Snacks.picker.files({ search = word }) | |||||
| end, | |||||
| desc = "Find file with name under cursor" | |||||
| }, | |||||
| -- Git | |||||
| { "<leader>gb", function() Snacks.picker.git_branches() end, desc = "Git branches" }, | |||||
| { "<leader>gc", function() Snacks.picker.git_log() end, desc = "Git commits" }, | |||||
| { "<leader>gs", function() Snacks.picker.git_status() end, desc = "Git status" }, | |||||
| { "<leader>gbl", function() Snacks.git.blame_line() end, desc = "Git blame line" }, | |||||
| -- LSP | |||||
| { "<leader>ds", function() Snacks.picker.lsp_symbols() end, desc = "Document symbols" }, | |||||
| { "<leader>ws", function() Snacks.picker.lsp_symbols({ symbols = "workspace" }) end, desc = "Workspace symbols" }, | |||||
| { "<leader>dws", function() Snacks.picker.lsp_symbols({ symbols = "workspace" }) end, desc = "Dynamic workspace symbols" }, | |||||
| { "gd", function() Snacks.picker.lsp_definitions() end, desc = "Go to definition" }, | |||||
| { "gr", function() Snacks.picker.lsp_references() end, desc = "Go to references" }, | |||||
| { "gI", function() Snacks.picker.lsp_implementations() end, desc = "Go to implementation" }, | |||||
| -- Utilities | |||||
| { "<leader>fs", function() Snacks.picker.spelling() end, desc = "Spell suggestions" }, | |||||
| { "<leader>fm", function() Snacks.picker.marks() end, desc = "Marks" }, | |||||
| { "<leader>fh", function() Snacks.picker.command_history() end, desc = "Command history" }, | |||||
| { "<leader>fH", function() Snacks.picker.help() end, desc = "Help tags" }, | |||||
| { "<leader>fk", function() Snacks.picker.keymaps() end, desc = "Keymaps" }, | |||||
| { "<leader>:", function() Snacks.picker.commands() end, desc = "Commands" }, | |||||
| -- Quickfix | |||||
| { "<leader>fq", function() Snacks.picker.qflist() end, desc = "Quickfix list" }, | |||||
| { "<leader>fl", function() Snacks.picker.loclist() end, desc = "Location list" }, | |||||
| -- Diagnostics | |||||
| { "<leader>fd", function() Snacks.picker.diagnostics() end, desc = "Diagnostics" }, | |||||
| -- Additional snacks features | |||||
| { "<leader>gg", function() Snacks.lazygit() end, desc = "Lazygit" }, | |||||
| { "<leader>gf", function() Snacks.lazygit.log_file() end, desc = "Lazygit log (current file)" }, | |||||
| { "<leader>gl", function() Snacks.lazygit.log() end, desc = "Lazygit log" }, | |||||
| { "<leader>un", function() Snacks.notifier.hide() end, desc = "Dismiss notifications" }, | |||||
| { "<leader>nh", function() Snacks.notifier.show_history() end, desc = "Notification history" }, | |||||
| { "<c-/>", function() Snacks.terminal() end, desc = "Toggle terminal", mode = { "n", "t" } }, | |||||
| { "<c-_>", function() Snacks.terminal() end, desc = "Toggle terminal (which_key)", mode = { "n", "t" } }, | |||||
| { "]]", function() Snacks.words.jump(vim.v.count1) end, desc = "Next reference", mode = { "n", "t" } }, | |||||
| { "[[", function() Snacks.words.jump(-vim.v.count1) end, desc = "Prev reference", mode = { "n", "t" } }, | |||||
| { "<leader>N", function() Snacks.notifier.show_history() end, desc = "Notification history" }, | |||||
| { "<leader>bd", function() Snacks.bufdelete() end, desc = "Delete buffer" }, | |||||
| { "<leader>cR", function() Snacks.rename.rename_file() end, desc = "Rename file" }, | |||||
| { "<leader>gB", function() Snacks.gitbrowse() end, desc = "Git browse" }, | |||||
| { "<leader>S", function() Snacks.profiler.scratch() end, desc = "Profiler scratch buffer" }, | |||||
| }, | |||||
| init = function() | |||||
| -- Setup notification handler immediately | |||||
| vim.notify = function(msg, level, opts) | |||||
| return Snacks.notifier.notify(msg, level, opts) | |||||
| end | |||||
| vim.api.nvim_create_autocmd("User", { | |||||
| pattern = "VeryLazy", | |||||
| callback = function() | |||||
| -- Create some toggle keymaps | |||||
| Snacks.toggle.option("spell", { name = "Spelling" }):map("<leader>us") | |||||
| Snacks.toggle.option("wrap", { name = "Wrap" }):map("<leader>uw") | |||||
| Snacks.toggle.option("relativenumber", { name = "Relative Number" }):map("<leader>uL") | |||||
| Snacks.toggle.diagnostics():map("<leader>ud") | |||||
| Snacks.toggle.line_number():map("<leader>ul") | |||||
| Snacks.toggle.option("conceallevel", { off = 0, on = vim.o.conceallevel > 0 and vim.o.conceallevel or 2 }) | |||||
| :map("<leader>uc") | |||||
| Snacks.toggle.treesitter():map("<leader>uT") | |||||
| Snacks.toggle.option("background", { off = "light", on = "dark", name = "Dark Background" }):map( | |||||
| "<leader>ub") | |||||
| Snacks.toggle.inlay_hints():map("<leader>uh") | |||||
| Snacks.toggle.indent():map("<leader>ug") | |||||
| Snacks.toggle.dim():map("<leader>uD") | |||||
| end, | |||||
| }) | |||||
| end, | |||||
| } | |||||
| @ -1,263 +0,0 @@ | |||||
| return { | |||||
| "nvim-telescope/telescope.nvim", | |||||
| cmd = "Telescope", | |||||
| dependencies = { | |||||
| "nvim-lua/plenary.nvim", | |||||
| "nvim-tree/nvim-web-devicons", | |||||
| "debugloop/telescope-undo.nvim", | |||||
| "nvim-telescope/telescope-ui-select.nvim", | |||||
| { "nvim-telescope/telescope-fzf-native.nvim", build = "make" }, | |||||
| "nvim-telescope/telescope-live-grep-args.nvim", | |||||
| }, | |||||
| config = function() | |||||
| local telescope = require("telescope") | |||||
| local actions = require("telescope.actions") | |||||
| local builtin = require("telescope.builtin") | |||||
| local previewers = require("telescope.previewers") | |||||
| local previewers_utils = require("telescope.previewers.utils") | |||||
| -- Configuration constants | |||||
| local MAX_FILE_SIZE = 100000 | |||||
| -- Enable line numbers in telescope previews | |||||
| vim.api.nvim_create_autocmd('User', { | |||||
| pattern = 'TelescopePreviewerLoaded', | |||||
| callback = function() | |||||
| vim.wo.number = true | |||||
| end, | |||||
| }) | |||||
| -- Truncate large files in preview to improve performance | |||||
| local function truncate_large_files(filepath, bufnr, opts) | |||||
| opts = opts or {} | |||||
| filepath = vim.fn.expand(filepath) | |||||
| vim.uv.fs_stat(filepath, function(_, stat) | |||||
| if not stat then return end | |||||
| if stat.size > MAX_FILE_SIZE then | |||||
| local cmd = { "head", "-c", tostring(MAX_FILE_SIZE), filepath } | |||||
| previewers_utils.job_maker(cmd, bufnr, opts) | |||||
| else | |||||
| previewers.buffer_previewer_maker(filepath, bufnr, opts) | |||||
| end | |||||
| end) | |||||
| end | |||||
| -- Cache git status to avoid repeated system calls | |||||
| local is_inside_work_tree = {} | |||||
| local function smart_project_files() | |||||
| local cwd = vim.fn.getcwd() | |||||
| if is_inside_work_tree[cwd] == nil then | |||||
| vim.fn.system("git rev-parse --is-inside-work-tree") | |||||
| is_inside_work_tree[cwd] = vim.v.shell_error == 0 | |||||
| end | |||||
| local opts = is_inside_work_tree[cwd] | |||||
| and { show_untracked = true, hidden = true } | |||||
| or {} | |||||
| local picker = is_inside_work_tree[cwd] | |||||
| and builtin.git_files | |||||
| or builtin.find_files | |||||
| picker(opts) | |||||
| end | |||||
| -- Visual selection live grep | |||||
| local function grep_string_visual() | |||||
| vim.cmd('noau normal! "vy"') | |||||
| local text = vim.fn.getreg('v') | |||||
| vim.fn.setreg('v', {}) | |||||
| text = string.gsub(text, "\n", "") | |||||
| if #text > 0 then | |||||
| builtin.live_grep({ default_text = text }) | |||||
| else | |||||
| builtin.live_grep() | |||||
| end | |||||
| end | |||||
| -- Telescope setup | |||||
| telescope.setup({ | |||||
| defaults = { | |||||
| file_sorter = require("telescope.sorters").get_fzy_sorter, | |||||
| color_devicons = true, | |||||
| buffer_previewer_maker = truncate_large_files, | |||||
| initial_mode = "insert", | |||||
| selection_strategy = "reset", | |||||
| sorting_strategy = "ascending", | |||||
| path_display = { "truncate" }, | |||||
| layout_config = { | |||||
| prompt_position = "top", | |||||
| horizontal = { | |||||
| preview_width = 0.6, | |||||
| }, | |||||
| vertical = { | |||||
| mirror = false, | |||||
| }, | |||||
| }, | |||||
| -- Modern borderchars | |||||
| borderchars = { "─", "│", "─", "│", "╭", "╮", "╯", "╰" }, | |||||
| -- Performance optimizations | |||||
| use_less = true, | |||||
| set_env = { COLORTERM = "truecolor" }, | |||||
| mappings = { | |||||
| i = { | |||||
| ["<C-n>"] = actions.move_selection_next, | |||||
| ["<C-p>"] = actions.move_selection_previous, | |||||
| ["<C-j>"] = actions.cycle_history_next, | |||||
| ["<C-k>"] = actions.cycle_history_prev, | |||||
| ["<C-q>"] = actions.smart_send_to_qflist + actions.open_qflist, | |||||
| ["<C-u>"] = false, -- Clear prompt | |||||
| ["<C-c>"] = actions.close, -- Close prompt | |||||
| }, | |||||
| n = { | |||||
| ["q"] = actions.close, | |||||
| }, | |||||
| }, | |||||
| }, | |||||
| pickers = { | |||||
| diagnostics = { | |||||
| initial_mode = "normal", | |||||
| layout_config = { | |||||
| preview_cutoff = 9999, | |||||
| }, | |||||
| }, | |||||
| buffers = { | |||||
| sort_mru = true, | |||||
| sort_lastused = true, | |||||
| mappings = { | |||||
| i = { | |||||
| ["<C-d>"] = actions.delete_buffer, | |||||
| }, | |||||
| n = { | |||||
| ["dd"] = actions.delete_buffer, | |||||
| }, | |||||
| }, | |||||
| }, | |||||
| find_files = { | |||||
| hidden = true, | |||||
| find_command = { "rg", "--files", "--hidden", "--glob", "!**/.git/*" }, | |||||
| }, | |||||
| }, | |||||
| extensions = { | |||||
| undo = { | |||||
| side_by_side = true, | |||||
| layout_strategy = "vertical", | |||||
| layout_config = { | |||||
| preview_height = 0.8, | |||||
| }, | |||||
| mappings = { | |||||
| i = { | |||||
| ["<CR>"] = require("telescope-undo.actions").restore, | |||||
| }, | |||||
| n = { | |||||
| ["<CR>"] = require("telescope-undo.actions").restore, | |||||
| ["y"] = require("telescope-undo.actions").yank_additions, | |||||
| ["Y"] = require("telescope-undo.actions").yank_deletions, | |||||
| ["u"] = require("telescope-undo.actions").restore, | |||||
| }, | |||||
| }, | |||||
| }, | |||||
| fzf = { | |||||
| fuzzy = true, | |||||
| override_generic_sorter = true, | |||||
| override_file_sorter = true, | |||||
| case_mode = "smart_case", | |||||
| }, | |||||
| live_grep_args = { | |||||
| auto_quoting = true, | |||||
| mappings = { | |||||
| i = { | |||||
| ["<C-k>"] = require("telescope-live-grep-args.actions").quote_prompt(), | |||||
| ["<C-i>"] = require("telescope-live-grep-args.actions").quote_prompt({ postfix = " --iglob " }), | |||||
| }, | |||||
| }, | |||||
| }, | |||||
| ["ui-select"] = { | |||||
| require("telescope.themes").get_dropdown(), | |||||
| }, | |||||
| }, | |||||
| }) | |||||
| -- Load extensions | |||||
| telescope.load_extension("fzf") | |||||
| telescope.load_extension("undo") | |||||
| telescope.load_extension("ui-select") | |||||
| telescope.load_extension("live_grep_args") | |||||
| -- Keymaps | |||||
| local function map(mode, lhs, rhs, desc) | |||||
| vim.keymap.set(mode, lhs, rhs, { desc = desc, noremap = true, silent = true }) | |||||
| end | |||||
| -- File navigation | |||||
| map("n", "<leader>ff", function() | |||||
| require("telescope").extensions.live_grep_args.live_grep_args() | |||||
| end, "Live grep with args") | |||||
| map("n", "<leader>fg", function() | |||||
| require("plugins.telescope.multigrep").live_multgrep() | |||||
| end, "Live multigrep") | |||||
| map("n", "<leader>p", smart_project_files, "Find project files") | |||||
| map("n", "<leader>fr", builtin.resume, "Resume last telescope") | |||||
| map("n", "<leader>fb", builtin.buffers, "Find buffers") | |||||
| map("n", "<leader>fo", builtin.oldfiles, "Find recent files") | |||||
| map("n", "<leader>fc", builtin.commands, "Find commands") | |||||
| -- Search | |||||
| map("n", "<leader>fw", function() | |||||
| builtin.grep_string({ search = vim.fn.expand("<cword>") }) | |||||
| end, "Grep word under cursor") | |||||
| map("n", "<leader>fW", function() | |||||
| builtin.grep_string({ search = vim.fn.expand("<cWORD>") }) | |||||
| end, "Grep WORD under cursor") | |||||
| map("v", "<leader>fw", grep_string_visual, "Grep selection") | |||||
| map("n", "<leader>fF", function() | |||||
| builtin.find_files({ search_file = vim.fn.expand("<cword>") }) | |||||
| end, "Find file with name under cursor") | |||||
| -- Git | |||||
| map("n", "<leader>gb", function() | |||||
| builtin.git_branches({ | |||||
| attach_mappings = function(_, map_func) | |||||
| map_func("i", "<C-d>", actions.git_delete_branch) | |||||
| map_func("n", "<C-d>", actions.git_delete_branch) | |||||
| return true | |||||
| end, | |||||
| }) | |||||
| end, "Git branches") | |||||
| map("n", "<leader>gc", builtin.git_commits, "Git commits") | |||||
| -- LSP | |||||
| map("n", "<leader>ds", builtin.lsp_document_symbols, "Document symbols") | |||||
| map("n", "<leader>ws", builtin.lsp_workspace_symbols, "Workspace symbols") | |||||
| map("n", "<leader>dws", builtin.lsp_dynamic_workspace_symbols, "Dynamic workspace symbols") | |||||
| -- Utilities | |||||
| map("n", "<leader>fu", "<cmd>Telescope undo<cr>", "Undo history") | |||||
| map("n", "<leader>fs", builtin.spell_suggest, "Spell suggestions") | |||||
| map("n", "<leader>fm", builtin.marks, "Marks") | |||||
| map("n", "<leader>fh", builtin.command_history, "Command history") | |||||
| map("n", "<leader>fH", builtin.help_tags, "Help tags") | |||||
| -- Quickfix | |||||
| map("n", "<leader>fq", builtin.quickfix, "Quickfix list") | |||||
| map("n", "<leader>fQ", builtin.quickfixhistory, "Quickfix history") | |||||
| end, | |||||
| } | |||||
| @ -1,58 +0,0 @@ | |||||
| local pickers = require("telescope.pickers") | |||||
| local finders = require("telescope.finders") | |||||
| local make_entry = require("telescope.make_entry") | |||||
| local conf = require("telescope.config").values | |||||
| local M = {} | |||||
| M.live_multgrep = function (opts) | |||||
| opts = opts or {} | |||||
| opts.cwd = opts.cwd or vim.uv.cwd() | |||||
| local finder = finders.new_async_job({ | |||||
| command_generator = function (prompt) | |||||
| if not prompt or prompt == "" then | |||||
| return nil | |||||
| end | |||||
| local pieces = vim.split(prompt, " ") | |||||
| local args = { "rg" } | |||||
| if pieces[1] then | |||||
| table.insert(args, "-e") | |||||
| table.insert(args, pieces[1]) | |||||
| end | |||||
| if pieces[2] then | |||||
| table.insert(args, "-g") | |||||
| table.insert(args, pieces[2]) | |||||
| end | |||||
| ---@diagnostic disable-next-line: deprecated | |||||
| return vim.iter({ | |||||
| args, | |||||
| { | |||||
| "--color=never", | |||||
| "--no-heading", | |||||
| "--with-filename", | |||||
| "--line-number", | |||||
| "--column", | |||||
| "--smart-case", | |||||
| "--hidden", | |||||
| } | |||||
| }):flatten():totable() | |||||
| end, | |||||
| entry_maker = make_entry.gen_from_vimgrep(opts), | |||||
| cwd = opts.cwd | |||||
| }) | |||||
| pickers.new(opts, { | |||||
| debounce = 100, | |||||
| prompt_title = "Multi Grep", | |||||
| finder = finder, | |||||
| previewer = conf.grep_previewer(opts), | |||||
| sorter = require("telescope.sorters").empty(), | |||||
| }):find() | |||||
| end | |||||
| return M | |||||
| @ -1,48 +0,0 @@ | |||||
| return { | |||||
| "folke/trouble.nvim", | |||||
| event = { "BufReadPre", "BufNewFile" }, | |||||
| opts = {}, | |||||
| cmd = "Trouble", | |||||
| keys = { | |||||
| { | |||||
| "<leader>xx", | |||||
| "<cmd>Trouble diagnostics toggle<cr>", | |||||
| desc = "Diagnostics (Trouble)", | |||||
| }, | |||||
| { | |||||
| "<leader>xX", | |||||
| "<cmd>Trouble diagnostics toggle filter.buf=0<cr>", | |||||
| desc = "Buffer Diagnostics (Trouble)", | |||||
| }, | |||||
| { | |||||
| "<leader>xj", | |||||
| "<cmd>Trouble diagnostics next<cr>", | |||||
| desc = "Diagnostics Next (Trouble)", | |||||
| }, | |||||
| { | |||||
| "<leader>xk", | |||||
| "<cmd>Trouble diagnostics prev<cr>", | |||||
| desc = "Diagnostics Previous (Trouble)", | |||||
| }, | |||||
| { | |||||
| "<leader>cs", | |||||
| "<cmd>Trouble symbols toggle focus=false<cr>", | |||||
| desc = "Symbols (Trouble)", | |||||
| }, | |||||
| { | |||||
| "<leader>cl", | |||||
| "<cmd>Trouble lsp toggle focus=false win.position=right<cr>", | |||||
| desc = "LSP Definitions / references / ... (Trouble)", | |||||
| }, | |||||
| { | |||||
| "<leader>xL", | |||||
| "<cmd>Trouble loclist toggle<cr>", | |||||
| desc = "Location List (Trouble)", | |||||
| }, | |||||
| { | |||||
| "<leader>xQ", | |||||
| "<cmd>Trouble qflist toggle<cr>", | |||||
| desc = "Quickfix List (Trouble)", | |||||
| }, | |||||
| }, | |||||
| } | |||||
| @ -1,18 +0,0 @@ | |||||
| return { | |||||
| "mbbill/undotree", | |||||
| event = "VeryLazy", | |||||
| config = function() | |||||
| if vim.fn.has("persistent_undo") == 0 then | |||||
| return | |||||
| end | |||||
| local target_path = vim.fn.expand("~/.cache/nvim/undodir/") | |||||
| if vim.fn.isdirectory(target_path) == 0 then | |||||
| vim.fn.mkdir(target_path, "p", "0700") | |||||
| end | |||||
| vim.opt.undodir = target_path | |||||
| vim.opt.undofile = true | |||||
| end, | |||||
| } | |||||