return { 'theprimeagen/harpoon', branch = 'harpoon2', keys = { { 'a', desc = 'Harpoon: Add file' }, { '', desc = 'Harpoon: Toggle menu' }, { '', desc = 'Harpoon: Select 1' }, { '', desc = 'Harpoon: Select 2' }, { '', desc = 'Harpoon: Select 3' }, { '', desc = 'Harpoon: Select 4' }, { '', desc = 'Harpoon: Prev' }, { '', desc = 'Harpoon: Next' }, }, dependencies = { 'nvim-lua/plenary.nvim' }, config = function() local harpoon = require('harpoon') -- local actions = require('telescope.actions') -- local action_state = require('telescope.actions.state') -- local conf = require('telescope.config').values harpoon:setup({ settings = { save_on_toggle = true, sync_on_ui_close = true, key = function() return vim.loop.cwd() or 'global' end, }, }) -- Telescope integration -- local function toggle_telescope() -- local list = harpoon:list() -- local file_paths = {} -- -- for _, item in ipairs(list.items) do -- table.insert(file_paths, item.value) -- end -- -- require('telescope.pickers') -- .new({}, { -- prompt_title = 'Harpoon', -- finder = require('telescope.finders').new_table({ -- results = file_paths, -- }), -- previewer = false, -- sorter = conf.generic_sorter({}), -- layout_config = { -- width = 0.5, -- height = 0.5, -- prompt_position = 'top', -- }, -- layout_strategy = 'vertical', -- attach_mappings = function(prompt_bufnr, map) -- map('i', '', function() -- local selection = action_state.get_selected_entry() -- if not selection then -- return -- end -- -- local target = selection[1] -- for _, item in ipairs(harpoon:list().items) do -- if item.value == target then -- harpoon:list():remove(item) -- break -- end -- end -- actions.close(prompt_bufnr) -- toggle_telescope() -- end) -- return true -- end, -- }) -- :find() -- end vim.keymap.set('n', 'a', function() local harpoon = require('harpoon') -- Check if we're in an oil buffer if vim.fn.expand('%:p'):sub(1, 6) == 'oil://' then local ok_oil, oil = pcall(require, 'oil') if not ok_oil then vim.notify('Oil not found', vim.log.levels.WARN) return end local entry = oil.get_cursor_entry() if not entry or not entry.name then vim.notify('No valid entry selected in Oil', vim.log.levels.INFO) return end local full_path = oil.get_current_dir() .. entry.name local stat = vim.loop.fs_stat(full_path) if not stat or stat.type ~= 'file' then vim.notify('Selected entry is not a file: ' .. full_path, vim.log.levels.INFO) return end harpoon:list():add({ value = entry.name, context = { filename = entry.name, cwd = oil.get_current_dir() or 'global' }, }) vim.notify('Added ' .. entry.name .. ' to harpoon', vim.log.levels.INFO) return end -- Regular file buffer harpoon:list():add() end, { desc = 'Harpoon: Add file to list (if not already present)' }) vim.keymap.set('n', '', function() harpoon.ui:toggle_quick_menu(harpoon:list()) end, { desc = 'Harpoon: Toggle quick menu' }) vim.keymap.set('n', '', function() harpoon:list():select(1) end) vim.keymap.set('n', '', function() harpoon:list():select(2) end) vim.keymap.set('n', '', function() harpoon:list():select(3) end) vim.keymap.set('n', '', function() harpoon:list():select(4) end) vim.keymap.set('n', '', function() harpoon:list():prev() end) vim.keymap.set('n', '', function() harpoon:list():next() end) end, }