-- image provided by Bob Rust
This is not fully baked, though used by several people. If you experience any issues, see some improvement you think would be amazing, or just have some feedback for harpoon (or me), make an issue!
:bnext
& :bprev
are getting too repetitive, alternate file doesn't quite cut it, etc etc.vim-plug
in this example)
Plug 'nvim-lua/plenary.nvim' " don't forget to add this one if you don't have it yet!
Plug 'ThePrimeagen/harpoon'
here we'll explain how to wield the power of the harpoon:
you mark files you want to revisit later on
:lua require("harpoon.mark").add_file()
view all project marks with:
:lua require("harpoon.ui").toggle_quick_menu()
you can go up and down the list, enter, delete or reorder. q
and <ESC>
exit and save the menu
you also can switch to any mark without bringing up the menu, use the below with the desired mark index
:lua require("harpoon.ui").nav_file(3) -- navigates to file 3
you can also cycle the list in both directions
:lua require("harpoon.ui").nav_next() -- navigates to next mark
:lua require("harpoon.ui").nav_prev() -- navigates to previous mark
from the quickmenu, open a file in: a vertical split with control+v, a horizontal split with control+x, a new tab with control+t
this works like file navigation except that if there is no terminal at the specified index a new terminal is created.
lua require("harpoon.term").gotoTerminal(1) -- navigates to term 1
commands can be sent to any terminal
lua require("harpoon.term").sendCommand(1, "ls -La") -- sends ls -La to tmux window 1
further more commands can be stored for later quick
lua require('harpoon.cmd-ui').toggle_quick_menu() -- shows the commands menu
lua require("harpoon.term").sendCommand(1, 1) -- sends command 1 to term 1
tmux is supported out of the box and can be used as a drop-in replacement to normal terminals
by simply switching 'term' with 'tmux'
like so
lua require("harpoon.tmux").gotoTerminal(1) -- goes to the first tmux window
lua require("harpoon.tmux").sendCommand(1, "ls -La") -- sends ls -La to tmux window 1
lua require("harpoon.tmux").sendCommand(1, 1) -- sends command 1 to tmux window 1
sendCommand
and goToTerminal
also accept any valid tmux pane identifier.
lua require("harpoon.tmux").gotoTerminal("{down-of}") -- focus the pane directly below
lua require("harpoon.tmux").sendCommand("%3", "ls") -- send a command to the pane with id '%3'
Once you switch to a tmux window you can always switch back to neovim, this is a little bash script that will switch to the window which is running neovim.
In your tmux.conf
(or anywhere you have keybinds), add this
bind-key -r G run-shell "path-to-harpoon/harpoon/scripts/tmux/switch-back-to-nvim"
1st register harpoon as a telescope extension
require("telescope").load_extension('harpoon')
currently only marks are supported in telescope
:Telescope harpoon marks
if configuring harpoon is desired it must be done through harpoons setup function
require("harpoon").setup({ ... })
here are all the available global settings with their default values
global_settings = {
-- sets the marks upon calling `toggle` on the ui, instead of require `:w`.
save_on_toggle = false,
-- saves the harpoon file upon every change. disabling is unrecommended.
save_on_change = true,
-- sets harpoon to run the command immediately as it's passed to the terminal when calling `sendCommand`.
enter_on_sendcmd = false,
-- closes any tmux windows harpoon that harpoon creates when you close Neovim.
tmux_autoclose_windows = false,
-- filetypes that you want to prevent from adding to the harpoon list menu.
excluded_filetypes = { "harpoon" },
-- set marks specific to each git branch inside git repository
mark_branch = false,
-- enable tabline with harpoon marks
tabline = false,
tabline_prefix = " ",
tabline_suffix = " ",
}
to preconfigure terminal commands for later use
projects = {
-- Yes $HOME works
["$HOME/personal/vim-with-me/server"] = {
term = {
cmds = {
"./env && npx ts-node src/index.ts"
}
}
}
}
harpoon.log
within the nvim cache path (:echo stdpath("cache")
)trace
, debug
, info
, warn
, error
, or fatal
. warn
is defaultvim.g.harpoon_log_level
(must be before setup()
)HARPOON_LOG=debug nvim
takes precedence over vim.g.harpoon_log_level
.warn
.they serve a similar purpose however harpoon marks differ in a few key ways:
Sometimes the default width of 60
is not wide enough.
The following example demonstrates how to configure a custom width by setting
the menu's width relative to the current window's width.
require("harpoon").setup({
menu = {
width = vim.api.nvim_win_get_width(0) - 4,
}
})
By default, the tabline will use the default theme of your theme. You can customize by editing the following highlights:
Example to make it cleaner:
vim.cmd('highlight! HarpoonInactive guibg=NONE guifg=#63698c')
vim.cmd('highlight! HarpoonActive guibg=NONE guifg=white')
vim.cmd('highlight! HarpoonNumberActive guibg=NONE guifg=#7aa2f7')
vim.cmd('highlight! HarpoonNumberInactive guibg=NONE guifg=#7aa2f7')
vim.cmd('highlight! TabLineFill guibg=NONE guifg=white')
Result:
For questions about Harpoon, there's a #harpoon channel on the Primeagen's Discord server.