harpoon icon indicating copy to clipboard operation
harpoon copied to clipboard

[Harpoon2] Remove files from list when using telescope picker (and possibly also reorder them..?)

Open lukeemhigh opened this issue 1 year ago • 6 comments

What issue are you having that you need harpoon to solve? It would be nice to use the Telescope picker to also remove files from the list, and possibly also perform some other list operations, such as rearrange file order.

Why doesn't the current config help? Currently it is only possible to remove a specific file from a harpoon list with require('harpoon'):list():remove() if the file is the currently opened buffer, or editing the list via harpoon.ui

What proposed api changes are you suggesting? It would be nice being able to call the remove function specifying an index, something like require('harpoon'):list():remove(n). This would make it possible to write more complex telescope pickers with added functionality

lukeemhigh avatar Jan 21 '24 10:01 lukeemhigh

I believe this already exists, as can be seen in lua/telescope/_extensions/marks.lua, with the default keybindings seen below:

return function(opts)
    opts = opts or {}

    pickers
        .new(opts, {
            prompt_title = "harpoon marks",
            finder = generate_new_finder(),
            sorter = conf.generic_sorter(opts),
            previewer = conf.grep_previewer(opts),
            attach_mappings = function(_, map)
                map("i", "<c-d>", delete_harpoon_mark)
                map("n", "<c-d>", delete_harpoon_mark)

                map("i", "<c-p>", move_mark_up)
                map("n", "<c-p>", move_mark_up)

                map("i", "<c-n>", move_mark_down)
                map("n", "<c-n>", move_mark_down)
                return true
            end,
        })
        :find()
end

theKnightsOfRohan avatar Jan 22 '24 16:01 theKnightsOfRohan

I mean, not really. The telescope extension you suggested is for marks, not for harpoon files. What I'm talking about is the telescope picker found in the README for Harpoon2

local harpoon = require('harpoon')
harpoon:setup({})

-- basic telescope configuration
local conf = require("telescope.config").values
local function toggle_telescope(harpoon_files)
    local file_paths = {}
    for _, item in ipairs(harpoon_files.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 = conf.file_previewer({}),
        sorter = conf.generic_sorter({}),
    }):find()
end

vim.keymap.set("n", "<C-e>", function() toggle_telescope(harpoon:list()) end,
    { desc = "Open harpoon window" })

I tried the telescope extension you suggested and it works, providing most of the functionality I requested, but then, why is the code above mentioned in the README section for Telescope?

lukeemhigh avatar Jan 23 '24 20:01 lukeemhigh

I mean, not really. The telescope extension you suggested is for marks, not for harpoon files. What I'm talking about is the telescope picker found in the README for Harpoon2 ...

I don't think that there's a difference, in your context!?

I tried the telescope extension you suggested and it works, providing most of the functionality I requested, but then, why is the code above mentioned in the README section for Telescope?

I think it's just meant as an example, not a solution!?

You could try out PR #512! Maybe it behaves a little more as you'd expect?! It sounds like, it does everything that you mentioned here!?

Also, you can use require("harpoon"):list():remove_at(n), to remove an entry in the harpoon-list ;)

kimabrandt-flx avatar Feb 04 '24 21:02 kimabrandt-flx

This should work


local function toggle_telescope(harpoon_files)
    local finder = function()
        local paths = {}
        for _, item in ipairs(harpoon_files.items) do
            table.insert(paths, item.value)
        end

        return require("telescope.finders").new_table({
            results = paths,
        })
    end

    require("telescope.pickers").new({}, {
        prompt_title = "Harpoon",
        finder = finder(),
        previewer = false,
        sorter = require("telescope.config").values.generic_sorter({}),
        layout_config = {
            height = 0.4,
            width = 0.5,
            prompt_position = "top",
            preview_cutoff = 120,
        },
        attach_mappings = function(prompt_bufnr, map)
            map("i", "<C-d>", function()
                local state = require("telescope.actions.state")
                local selected_entry = state.get_selected_entry()
                local current_picker = state.get_current_picker(prompt_bufnr)

                table.remove(harpoon_files.items, selected_entry.index)
                current_picker:refresh(finder())
            end)
            return true
        end,
    }):find()
end

ochollat avatar Apr 25 '24 06:04 ochollat

You are not using the plugin as it is designed to be used. You can delete anything from the list by just clicking dd as you normally would in vim. You can re-arrange by highlighting and moving the line up or do the same way you re-arrange a line on Vim.

kirubeltadesse avatar Jul 10 '24 13:07 kirubeltadesse

I appreciate your perspective. In the tech world, we all have opinions on various subjects. However, it's important to understand that using a plugin differently doesn't necessarily mean it's being used 'wrong'.

@kirubeltadesse

ochollat avatar Jul 10 '24 15:07 ochollat