Neovim plugin improving access to clipboard history (mirror)
1local M = {}
2
3local state = require("yankbank.state")
4
5--- get a table containg a single yankbank entry by index
6---@param i integer
7---@return table
8function M.get_entry(i)
9 require("yankbank").ensure_initialized()
10 return {
11 yank_text = state.get_yanks()[i],
12 reg_type = state.get_reg_types()[i],
13 }
14end
15
16--- get a table containing all yankbank entries
17---@return table
18function M.get_all()
19 require("yankbank").ensure_initialized()
20 local out = {}
21 local yanks = state.get_yanks()
22 local reg_types = state.get_reg_types()
23 for i, v in ipairs(yanks) do
24 table.insert(out, {
25 yank_text = v,
26 reg_type = reg_types[i],
27 })
28 end
29 return out
30end
31
32--- add an entry to yankbank
33---@param yank_text string yank text to add to YANKS table
34---@param reg_type string register type "v", "V", or "^V" (visual, v-line, v-block respectively)
35---@param pin integer|boolean?
36function M.add_entry(yank_text, reg_type, pin)
37 require("yankbank").ensure_initialized()
38 require("yankbank.clipboard").add_yank(yank_text, reg_type, pin)
39end
40
41--- remove entry from yankbank by index
42---@param i integer index to remove
43function M.remove_entry(i)
44 require("yankbank").ensure_initialized()
45 local yanks = state.get_yanks()
46 local reg_types = state.get_reg_types()
47 local yank_text = table.remove(yanks, i)
48 local reg_type = table.remove(reg_types, i)
49 state.set_yanks(yanks)
50 state.set_reg_types(reg_types)
51
52 local opts = state.get_opts()
53 if opts.persist_type == "sqlite" then
54 require("yankbank.persistence.sql")
55 .data()
56 .remove_match(yank_text, reg_type)
57 end
58end
59
60--- pin entry to yankbank so that it won't be removed when its position exceeds the max number of entries
61---
62---@param i integer index to pin
63function M.pin_entry(i)
64 require("yankbank").ensure_initialized()
65 local pins = state.get_pins()
66 if i > #pins then
67 return
68 end
69
70 -- TODO: show pins differently in popup (could use different hl_groups for pinned entries?)
71 pins[i] = 1
72 state.set_pins(pins)
73
74 local opts = state.get_opts()
75 if opts.persist_type == "sqlite" then
76 return require("yankbank.persistence.sql")
77 .data()
78 .pin(state.get_yanks()[i], state.get_reg_types()[i])
79 end
80end
81
82--- unpin bank entry
83---
84---@param i integer index to unpin
85function M.unpin_entry(i)
86 require("yankbank").ensure_initialized()
87 local pins = state.get_pins()
88 if i > #pins then
89 return
90 end
91
92 -- TODO: update popup pin highlight
93 pins[i] = 0
94 state.set_pins(pins)
95
96 local opts = state.get_opts()
97 if opts.persist_type == "sqlite" then
98 return require("yankbank.persistence.sql")
99 .data()
100 .unpin(state.get_yanks()[i], state.get_reg_types()[i])
101 end
102end
103
104-- TODO: individual popup keymap setting functions
105
106return M