mirror of
https://github.com/ThePrimeagen/harpoon.git
synced 2025-07-13 17:40:25 +00:00
feat(save): set save upon every change instead on exit.
there has been several times in which I lose my entire mark list because i am not saving upon change, but instead on end.
This commit is contained in:
parent
d8adc4825f
commit
94763cb387
10
README.md
10
README.md
@ -132,12 +132,20 @@ Here is the set of global settings and their default values.
|
|||||||
|
|
||||||
require("harpoon").setup({
|
require("harpoon").setup({
|
||||||
global_settings = {
|
global_settings = {
|
||||||
save_on_toggle = false
|
save_on_toggle = false,
|
||||||
|
save_on_change = true,
|
||||||
},
|
},
|
||||||
... your other configs ...
|
... your other configs ...
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
* `save_on_toggle` will set the marks upon calling `toggle` on the ui, instead
|
||||||
|
of require `:w`.
|
||||||
|
* `save_on_change` will save the harpoon file upon every change. If you don't
|
||||||
|
enable this option (on by default) harpoon will not save any changes to your
|
||||||
|
file. It is very unreliable to save your harpoon on exit (at least that is
|
||||||
|
what I have found).
|
||||||
|
|
||||||
#### Preconfigured Terminal Commands
|
#### Preconfigured Terminal Commands
|
||||||
These are project specific commands that you wish to execute on the regular.
|
These are project specific commands that you wish to execute on the regular.
|
||||||
|
|
||||||
|
@ -130,7 +130,10 @@ M.setup = function(config)
|
|||||||
|
|
||||||
local complete_config =
|
local complete_config =
|
||||||
merge_tables(
|
merge_tables(
|
||||||
{projects = {} , global_settings = {["save_on_toggle"] = false}},
|
{projects = {} , global_settings = {
|
||||||
|
["save_on_toggle"] = false,
|
||||||
|
["save_on_change"] = true,
|
||||||
|
}},
|
||||||
expand_dir(c_config),
|
expand_dir(c_config),
|
||||||
expand_dir(u_config),
|
expand_dir(u_config),
|
||||||
expand_dir(config))
|
expand_dir(config))
|
||||||
|
@ -1,7 +1,26 @@
|
|||||||
local harpoon = require('harpoon')
|
local harpoon = require('harpoon')
|
||||||
local utils = require('harpoon.utils')
|
local utils = require('harpoon.utils')
|
||||||
|
|
||||||
|
-- I think that I may have to organize this better. I am not the biggest fan
|
||||||
|
-- of procedural all the things
|
||||||
local M = {}
|
local M = {}
|
||||||
|
local callbacks = {}
|
||||||
|
|
||||||
|
-- I am trying to avoid over engineering the whole thing. We will likely only
|
||||||
|
-- need one event emitted
|
||||||
|
local function emit_changed()
|
||||||
|
if not callbacks["changed"] then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if harpoon.get_global_settings().save_on_change then
|
||||||
|
harpoon.save()
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, cb in pairs(callbacks) do
|
||||||
|
cb()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local function filter_empty_string(list)
|
local function filter_empty_string(list)
|
||||||
local next = {}
|
local next = {}
|
||||||
@ -14,6 +33,17 @@ local function filter_empty_string(list)
|
|||||||
return next
|
return next
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function get_first_empty_slot()
|
||||||
|
for idx = 1, M.get_length() do
|
||||||
|
local filename = M.get_marked_file_name(idx)
|
||||||
|
if filename == "" then
|
||||||
|
return idx
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return M.get_length() + 1
|
||||||
|
end
|
||||||
|
|
||||||
local function get_buf_name(id)
|
local function get_buf_name(id)
|
||||||
if id == nil then
|
if id == nil then
|
||||||
return utils.normalize_path(vim.fn.bufname(vim.fn.bufnr()))
|
return utils.normalize_path(vim.fn.bufname(vim.fn.bufnr()))
|
||||||
@ -112,22 +142,17 @@ M.add_file = function(file_name_or_buf_id)
|
|||||||
|
|
||||||
validate_buf_name(buf_name)
|
validate_buf_name(buf_name)
|
||||||
|
|
||||||
for idx = 1, M.get_length() do
|
local found_idx = get_first_empty_slot()
|
||||||
local filename = M.get_marked_file_name(idx)
|
harpoon.get_mark_config().marks[found_idx] = create_mark(buf_name)
|
||||||
if filename == "" then
|
M.remove_empty_tail(false)
|
||||||
harpoon.get_mark_config().marks[idx] = create_mark(buf_name)
|
emit_changed();
|
||||||
|
|
||||||
M.remove_empty_tail()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
table.insert(harpoon.get_mark_config().marks, create_mark(buf_name))
|
|
||||||
M.remove_empty_tail()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
M.remove_empty_tail = function()
|
-- dont_emit_on_changed should only be used internally
|
||||||
|
M.remove_empty_tail = function(_emit_on_changed)
|
||||||
|
_emit_on_changed = _emit_on_changed == nil or _emit_on_changed
|
||||||
local config = harpoon.get_mark_config()
|
local config = harpoon.get_mark_config()
|
||||||
|
local found = false
|
||||||
|
|
||||||
for i = M.get_length(), 1, -1 do
|
for i = M.get_length(), 1, -1 do
|
||||||
local filename = M.get_marked_file_name(i)
|
local filename = M.get_marked_file_name(i)
|
||||||
@ -137,8 +162,13 @@ M.remove_empty_tail = function()
|
|||||||
|
|
||||||
if filename == "" then
|
if filename == "" then
|
||||||
table.remove(config.marks, i)
|
table.remove(config.marks, i)
|
||||||
|
found = found or _emit_on_changed
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if found then
|
||||||
|
emit_changed()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
M.store_offset = function()
|
M.store_offset = function()
|
||||||
@ -157,6 +187,8 @@ M.store_offset = function()
|
|||||||
-- TODO: Developer logs?
|
-- TODO: Developer logs?
|
||||||
print("M.store_offset#pcall failed:", res)
|
print("M.store_offset#pcall failed:", res)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
emit_changed()
|
||||||
end
|
end
|
||||||
|
|
||||||
M.rm_file = function(file_name_or_buf_id)
|
M.rm_file = function(file_name_or_buf_id)
|
||||||
@ -168,11 +200,13 @@ M.rm_file = function(file_name_or_buf_id)
|
|||||||
end
|
end
|
||||||
|
|
||||||
harpoon.get_mark_config().marks[idx] = create_mark("")
|
harpoon.get_mark_config().marks[idx] = create_mark("")
|
||||||
M.remove_empty_tail()
|
M.remove_empty_tail(false)
|
||||||
|
emit_changed()
|
||||||
end
|
end
|
||||||
|
|
||||||
M.clear_all = function()
|
M.clear_all = function()
|
||||||
harpoon.get_mark_config().marks = {}
|
harpoon.get_mark_config().marks = {}
|
||||||
|
emit_changed()
|
||||||
end
|
end
|
||||||
|
|
||||||
--- ENTERPRISE PROGRAMMING
|
--- ENTERPRISE PROGRAMMING
|
||||||
@ -199,7 +233,7 @@ M.set_current_at = function(idx)
|
|||||||
|
|
||||||
-- Remove it if it already exists
|
-- Remove it if it already exists
|
||||||
if M.valid_index(current_idx) then
|
if M.valid_index(current_idx) then
|
||||||
config.marks[current_idx] = ""
|
config.marks[current_idx] = create_mark("")
|
||||||
end
|
end
|
||||||
|
|
||||||
config.marks[idx] = create_mark(buf_name)
|
config.marks[idx] = create_mark(buf_name)
|
||||||
@ -209,6 +243,8 @@ M.set_current_at = function(idx)
|
|||||||
config.marks[i] = create_mark("")
|
config.marks[i] = create_mark("")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
emit_changed()
|
||||||
end
|
end
|
||||||
|
|
||||||
M.to_quickfix_list = function()
|
M.to_quickfix_list = function()
|
||||||
@ -243,6 +279,7 @@ M.set_mark_list = function(new_list)
|
|||||||
end
|
end
|
||||||
|
|
||||||
config.marks = new_list
|
config.marks = new_list
|
||||||
|
emit_changed()
|
||||||
end
|
end
|
||||||
|
|
||||||
M.toggle_file = function(file_name_or_buf_id)
|
M.toggle_file = function(file_name_or_buf_id)
|
||||||
@ -263,5 +300,14 @@ M.get_current_index = function()
|
|||||||
return M.get_index_of(vim.fn.bufname(vim.fn.bufnr()))
|
return M.get_index_of(vim.fn.bufname(vim.fn.bufnr()))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
M.on = function(event, cb)
|
||||||
|
if not callbacks[event] then
|
||||||
|
callbacks[event] = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(callbacks[event], cb)
|
||||||
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,73 +0,0 @@
|
|||||||
" TODO: Make this vim compatible.
|
|
||||||
|
|
||||||
" How to do this but much better?
|
|
||||||
let g:win_ctrl_buf_list = [0, 0, 0, 0]
|
|
||||||
|
|
||||||
fun! Harpoon_GotoTerminal(ctrlId)
|
|
||||||
if (a:ctrlId > 9) || (a:ctrlId < 0)
|
|
||||||
echo "CtrlID must be between 0 - 9"
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
let contents = g:win_ctrl_buf_list[a:ctrlId]
|
|
||||||
if type(l:contents) != v:t_list
|
|
||||||
" Create the terminal
|
|
||||||
exe has("nvim") ? "terminal" : "terminal ++curwin"
|
|
||||||
call Harpoon_SetTerminal(a:ctrlId)
|
|
||||||
end
|
|
||||||
let contents = g:win_ctrl_buf_list[a:ctrlId]
|
|
||||||
if type(l:contents) != v:t_list
|
|
||||||
echo "Unable to create a terminal or find the terminal's information."
|
|
||||||
end
|
|
||||||
|
|
||||||
let bufh = l:contents[1]
|
|
||||||
if !bufexists(bufh)
|
|
||||||
" Create the terminal
|
|
||||||
exe has("nvim") ? "terminal" : "terminal ++curwin"
|
|
||||||
call Harpoon_SetTerminal(a:ctrlId)
|
|
||||||
endif
|
|
||||||
|
|
||||||
let contents = g:win_ctrl_buf_list[a:ctrlId]
|
|
||||||
let bufh = l:contents[1]
|
|
||||||
exe "b" . l:bufh
|
|
||||||
endfun
|
|
||||||
|
|
||||||
fun! Harpoon_SetTerminal(ctrlId)
|
|
||||||
if &buftype != "terminal"
|
|
||||||
echo "You must be in a terminal to execute this command"
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if (a:ctrlId > 9) || (a:ctrlId < 0)
|
|
||||||
echo "CtrlID must be between 0 - 3"
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
let g:win_ctrl_buf_list[a:ctrlId] = [has_key(b:, "terminal_job_id") ? b:terminal_job_id : 0, bufnr()]
|
|
||||||
endfun
|
|
||||||
|
|
||||||
fun! Harpoon_SendTerminalCommand(ctrlId, command)
|
|
||||||
if (a:ctrlId > 9) || (a:ctrlId < 0)
|
|
||||||
echo "CtrlID must be between 0 - 9"
|
|
||||||
return
|
|
||||||
end
|
|
||||||
let contents = g:win_ctrl_buf_list[a:ctrlId]
|
|
||||||
if type(l:contents) != v:t_list
|
|
||||||
echo "No terminal created, sorry for not creating this in the background..."
|
|
||||||
call Harpoon_GotoTerminal(a:ctrlId)
|
|
||||||
end
|
|
||||||
let contents = g:win_ctrl_buf_list[a:ctrlId]
|
|
||||||
if type(l:contents) != v:t_list
|
|
||||||
echo "Unable to send command to terminal"
|
|
||||||
end
|
|
||||||
|
|
||||||
if has("nvim")
|
|
||||||
let job_id = l:contents[0]
|
|
||||||
call chansend(l:job_id, a:command)
|
|
||||||
else
|
|
||||||
let bufh = l:contents[1]
|
|
||||||
call term_sendkeys(l:bufh, a:command)
|
|
||||||
endif
|
|
||||||
endfun
|
|
||||||
|
|
||||||
highlight default HarpoonWindow ctermbg=none
|
|
||||||
highlight default HarpoonBorder ctermbg=none ctermfg=white
|
|
@ -1,10 +1,4 @@
|
|||||||
fun! HarpoonLeave()
|
|
||||||
lua require('harpoon.mark').store_offset()
|
|
||||||
lua require('harpoon').save()
|
|
||||||
endfun
|
|
||||||
|
|
||||||
augroup THE_PRIMEAGEN_HARPOON
|
augroup THE_PRIMEAGEN_HARPOON
|
||||||
autocmd!
|
autocmd!
|
||||||
autocmd VimLeavePre * :call HarpoonLeave()
|
|
||||||
autocmd BufLeave * :lua require('harpoon.mark').store_offset()
|
autocmd BufLeave * :lua require('harpoon.mark').store_offset()
|
||||||
augroup END
|
augroup END
|
||||||
|
Loading…
x
Reference in New Issue
Block a user