Neovim plugin improving access to clipboard history (mirror)
at main 103 lines 2.8 kB view raw
1local M = {} 2 3local initialized = false 4 5function M.ensure_initialized() 6 if initialized then 7 return 8 end 9 10 local state = require("yankbank.state") 11 local persistence = require("yankbank.persistence") 12 13 -- enable persistence based on opts (needs to be called before autocmd setup) 14 local yanks, reg_types, pins = persistence.setup() 15 state.init(yanks, reg_types, pins, state.get_opts()) 16 initialized = true 17end 18 19--- wrapper function for main plugin functionality 20local function show_yank_bank() 21 M.ensure_initialized() 22 23 local state = require("yankbank.state") 24 local menu = require("yankbank.menu") 25 26 -- set up menu keybinds from defaults and state.get_opts().keymaps 27 menu.setup() 28 29 local persistence = require("yankbank.persistence") 30 local yanks = persistence.get_yanks() or state.get_yanks() 31 state.set_yanks(yanks) 32 33 -- initialize buffer and populate bank 34 local buf_data = menu.create_and_fill_buffer() 35 if not buf_data then 36 return 37 end 38 39 -- open popup window 40 buf_data.win_id = menu.open_window(buf_data) 41 42 -- set popup keybinds 43 menu.set_keymaps(buf_data) 44end 45 46-- plugin setup 47---@param opts? table 48function M.setup(opts) 49 -- default plugin options 50 local default_opts = { 51 max_entries = 10, 52 sep = "-----", 53 focus_gain_poll = false, 54 num_behavior = "prefix", 55 registers = { 56 yank_register = "+", 57 }, 58 keymaps = {}, 59 persist_type = nil, 60 db_path = nil, 61 bind_indices = nil, 62 pickers = {}, 63 } 64 65 -- merge opts with default options table 66 local merged_opts = vim.tbl_deep_extend("keep", opts or {}, default_opts) 67 68 -- store config in state module (lazy loaded when needed) 69 local state = require("yankbank.state") 70 state.set_opts(merged_opts) 71 72 -- create user command 73 vim.api.nvim_create_user_command("YankBank", function() 74 show_yank_bank() 75 end, { desc = "Show Recent Yanks" }) 76 77 -- create clipboard autocmds 78 require("yankbank.clipboard").setup_yank_autocmd() 79 80 -- Bind 1-n if `bind_indices` is set to a string 81 if merged_opts.bind_indices then 82 for i = 1, merged_opts.max_entries do 83 vim.keymap.set("n", merged_opts.bind_indices .. i, function() 84 M.ensure_initialized() 85 require("yankbank.helpers").smart_paste( 86 state.get_yanks()[i], 87 state.get_reg_types()[i], 88 true 89 ) 90 end, { 91 noremap = true, 92 silent = true, 93 desc = "Paste YankBank entry " .. i, 94 }) 95 end 96 end 97 98 if merged_opts.pickers.snacks then 99 require("yankbank.pickers.snacks").setup() 100 end 101end 102 103return M