Neovim plugin improving access to clipboard history (mirror)
at main 106 lines 2.9 kB view raw
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