harpoon icon indicating copy to clipboard operation
harpoon copied to clipboard

[Feature request] ability to disable cycling

Open pmielle opened this issue 1 year ago • 11 comments

hey, I think it would be useful to be able to disable cycling when using nav_next() and nav_prev().

For example: if I have 4 harpoons and I am currently at the 4th one, I would like nav_next() to do nothing. Same thing for nav_prev() on nav(1)

I know it would make sense for some of my workflows where I tend to go deeper and deeper into a codebase, setting checkpoints along the way

thanks for the hard work!

pmielle avatar Nov 29 '23 22:11 pmielle

hey,

I think it would be useful to be able to disable cycling when using nav_next() and nav_prev().

For example: if I have 4 harpoons and I am currently at the 4th one, I would like nav_next() to do nothing. Same thing for nav_prev() on nav(1)

I know it would make sense for some of my workflows where I tend to go deeper and deeper into a codebase, setting checkpoints along the way

thanks for the hard work!

What about using tag stack instead?

catgoose avatar Nov 29 '23 23:11 catgoose

Thank you for your answer! disclaimer: I am not familiar with tag stacks

I like harpoon because I manually set which file I want to keep in my save list and which one I don't. If I understand correctly, tab stack keeps track of every jump I make unconditionally.. which is not exactly what I would like to have. And on top of that, I would guess that tab stacks do not persist when closing and opening back vim, but maybe I'm wrong here

but I get what you mean: tab stacks solve the "go deeper and deeper into a codebase"-thing I described. Still, I tend to prefer harpoon for the reasons I mentioned above

pmielle avatar Nov 30 '23 07:11 pmielle

@pmielle i am not really understanding this

how would you envision this working? would there be a harpoon function you would call to go into this "don't change state" mode? i am just unsure if i want to support this but i want to understand it.

ThePrimeagen avatar Nov 30 '23 18:11 ThePrimeagen

oh no no no. I would just like to have a setting to prevent harpoon to loop back to the beginning of the list when hitting nav_next() on the last item. Sorry if I'm not making myself clear (I'm french..)

pmielle avatar Nov 30 '23 18:11 pmielle

oh yes! i see i see. this makes perfect sense. that seems like a reason able option

i am now releasing Harpoon2 as the new harpoon (interface change, but TONS of new power + less features (which gives more options for more features))

ThePrimeagen avatar Nov 30 '23 18:11 ThePrimeagen

ooh awesome! looking forward to it. thanks for your feedback + for your content in general!

pmielle avatar Nov 30 '23 18:11 pmielle

i am going to reopen this issue and implement it in settings object for harpoon 2

ThePrimeagen avatar Dec 04 '23 20:12 ThePrimeagen

@pmielle this issue can be closed, my PR to include this was merged some weeks ago.

mwishoff avatar Dec 21 '23 19:12 mwishoff

That's weird. This setting has no effect for me. My harpoon2 will not wrap.

I'm on NVIM v0.10.0 and my config is this:

return {
  "ThePrimeagen/harpoon",
  lazy = false,
  branch = "harpoon2",
  init = function()
    local harpoon = require("harpoon")
    harpoon:setup({
      settings = {
        save_on_toggle = true,
        ui_nav_wrap = true,
      },
    })

    -- harpoon append file to list
    vim.keymap.set("n", "<leader>ha", function()
      harpoon:list():append()
    end)
    -- harpoon menu toggle
    vim.keymap.set("n", "<leader>hh", function()
      harpoon.ui:toggle_quick_menu(harpoon:list())
    end)

    -- Toggle previous & next buffers stored within Harpoon list
    vim.keymap.set("n", "<C-PageUp>", function()
      harpoon:list():prev()
    end, { desc = "Previous harpooned file" })
    vim.keymap.set("n", "<C-PageDown>", function()
      harpoon:list():next()
    end, { desc = "Next harpooned file" })

    -- direct harpoon files
    vim.keymap.set("n", "<leader>1", function()
      harpoon:list():select(1)
    end, { desc = "Switch to harpoon 1" })
    vim.keymap.set("n", "<leader>2", function()
      harpoon:list():select(2)
    end, { desc = "Switch to harpoon 2" })
    vim.keymap.set("n", "<leader>3", function()
      harpoon:list():select(3)
    end, { desc = "Switch to harpoon 3" })

    vim.keymap.set("n", "<leader>4", function()
      harpoon:list():select(4)
    end, { desc = "Switch to harpoon 4" })
    vim.keymap.set("n", "<leader>5", function()
      harpoon:list():select(5)
    end, { desc = "Switch to harpoon 5" })
    vim.keymap.set("n", "<leader>6", function()
      harpoon:list():select(6)
    end, { desc = "Switch to harpoon 6" })

    vim.keymap.set("n", "<leader>7", function()
      harpoon:list():select(7)
    end, { desc = "Switch to harpoon 7" })
    vim.keymap.set("n", "<leader>8", function()
      harpoon:list():select(8)
    end, { desc = "Switch to harpoon 8" })
    vim.keymap.set("n", "<leader>9", function()
      harpoon:list():select(9)
    end, { desc = "Switch to harpoon 9" })

    -- 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", "<leader>fh", function()
      toggle_telescope(harpoon:list())
    end, { desc = "Harpoon files" })
  end,
  dependencies = { "nvim-lua/plenary.nvim", "nvim-telescope/telescope.nvim" },
}

lpanebr avatar Jan 02 '24 21:01 lpanebr

@lpanebr it looks like the attribute was deleted in another PR that was merged, I'm assuming by mistake. #461 PR was opened to put it back in.

mwishoff avatar Jan 02 '24 21:01 mwishoff

Edit: Cycling stopped working for list:next() and list:prev(), so I fixed it in #562 :)

Cycling works as expected and does not wrap by default, but can be enabled by passing an option to the list():next({}) and list():prev({}) methods:

require("harpoon"):list():next({ ui_nav_wrap = true })
require("harpoon"):list():prev({ ui_nav_wrap = true })

kimabrandt-flx avatar Apr 06 '24 20:04 kimabrandt-flx