Neovim plugin improving access to clipboard history (mirror)
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