mirror of
https://github.com/ThePrimeagen/harpoon.git
synced 2025-07-13 09:30:25 +00:00
137 lines
3.8 KiB
Lua
137 lines
3.8 KiB
Lua
local harpoon = require("harpoon")
|
|
local popup = require("popup")
|
|
local log = require("harpoon.dev").log
|
|
local term = require("harpoon.term")
|
|
|
|
local M = {}
|
|
|
|
Harpoon_cmd_win_id = nil
|
|
Harpoon_cmd_bufh = nil
|
|
|
|
local function close_menu(force_save)
|
|
force_save = force_save or false
|
|
local global_config = harpoon.get_global_settings()
|
|
|
|
if global_config.save_on_toggle or force_save then
|
|
require("harpoon.cmd-ui").on_menu_save()
|
|
end
|
|
|
|
vim.api.nvim_win_close(Harpoon_cmd_win_id, true)
|
|
|
|
Harpoon_cmd_win_id = nil
|
|
Harpoon_cmd_bufh = nil
|
|
end
|
|
|
|
local function create_window()
|
|
log.trace("_create_window()")
|
|
local config = harpoon.get_menu_config()
|
|
local width = config.width or 60
|
|
local height = config.height or 10
|
|
local borderchars = config.borderchars
|
|
or { "─", "│", "─", "│", "╭", "╮", "╯", "╰" }
|
|
local bufnr = vim.api.nvim_create_buf(false, false)
|
|
|
|
local Harpoon_cmd_win_id, win = popup.create(bufnr, {
|
|
title = "Harpoon Commands",
|
|
highlight = "HarpoonWindow",
|
|
line = math.floor(((vim.o.lines - height) / 2) - 1),
|
|
col = math.floor((vim.o.columns - width) / 2),
|
|
minwidth = width,
|
|
minheight = height,
|
|
borderchars = borderchars,
|
|
})
|
|
|
|
vim.api.nvim_win_set_option(
|
|
win.border.win_id,
|
|
"winhl",
|
|
"Normal:HarpoonBorder"
|
|
)
|
|
|
|
return {
|
|
bufnr = bufnr,
|
|
win_id = Harpoon_cmd_win_id,
|
|
}
|
|
end
|
|
|
|
local function is_white_space(str)
|
|
return str:gsub("%s", "") == ""
|
|
end
|
|
|
|
local function get_menu_items()
|
|
log.trace("_get_menu_items()")
|
|
local lines = vim.api.nvim_buf_get_lines(Harpoon_cmd_bufh, 0, -1, true)
|
|
local indices = {}
|
|
|
|
for _, line in pairs(lines) do
|
|
if not is_white_space(line) then
|
|
table.insert(indices, line)
|
|
end
|
|
end
|
|
|
|
return indices
|
|
end
|
|
|
|
M.toggle_quick_menu = function()
|
|
log.trace("cmd-ui#toggle_quick_menu()")
|
|
if
|
|
Harpoon_cmd_win_id ~= nil
|
|
and vim.api.nvim_win_is_valid(Harpoon_cmd_win_id)
|
|
then
|
|
close_menu()
|
|
return
|
|
end
|
|
|
|
local win_info = create_window()
|
|
local contents = {}
|
|
local global_config = harpoon.get_global_settings()
|
|
|
|
Harpoon_cmd_win_id = win_info.win_id
|
|
Harpoon_cmd_bufh = win_info.bufnr
|
|
|
|
for idx, cmd in pairs(harpoon.get_term_config().cmds) do
|
|
contents[idx] = cmd
|
|
end
|
|
|
|
vim.api.nvim_win_set_option(Harpoon_cmd_win_id, "number", true)
|
|
vim.api.nvim_buf_set_name(Harpoon_cmd_bufh, "harpoon-cmd-menu")
|
|
vim.api.nvim_buf_set_lines(Harpoon_cmd_bufh, 0, #contents, false, contents)
|
|
vim.api.nvim_buf_set_option(Harpoon_cmd_bufh, "filetype", "harpoon")
|
|
vim.api.nvim_buf_set_option(Harpoon_cmd_bufh, "buftype", "acwrite")
|
|
vim.api.nvim_buf_set_option(Harpoon_cmd_bufh, "bufhidden", "delete")
|
|
-- TODO: maybe vim.fn.input() can be used to implement some select_menu_item
|
|
-- vim.api.nvim_buf_set_keymap(
|
|
-- Harpoon_cmd_bufh,
|
|
-- "n",
|
|
-- "<CR>",
|
|
-- ":lua require('harpoon.cmd-ui').select_menu_item()<CR>",
|
|
-- {}
|
|
-- )
|
|
vim.cmd(
|
|
string.format(
|
|
"autocmd BufWriteCmd <buffer=%s> :lua require('harpoon.cmd-ui').on_menu_save()",
|
|
Harpoon_cmd_bufh
|
|
)
|
|
)
|
|
if global_config.save_on_change then
|
|
vim.cmd(
|
|
string.format(
|
|
"autocmd TextChanged,TextChangedI <buffer=%s> :lua require('harpoon.cmd-ui').on_menu_save()",
|
|
Harpoon_cmd_bufh
|
|
)
|
|
)
|
|
end
|
|
vim.cmd(
|
|
string.format(
|
|
"autocmd BufModifiedSet <buffer=%s> set nomodified",
|
|
Harpoon_cmd_bufh
|
|
)
|
|
)
|
|
end
|
|
|
|
M.on_menu_save = function()
|
|
log.trace("cmd-ui#on_menu_save()")
|
|
term.set_cmd_list(get_menu_items())
|
|
end
|
|
|
|
return M
|