diff options
| author | Josh Rahm <rahm@josher.dev> | 2026-10-18 15:49:48 -0600 |
|---|---|---|
| committer | Josh Rahm <rahm@josher.dev> | 2026-10-18 15:49:48 -0600 |
| commit | 7b15a3a4b4fb4dc6be5d53a22c20d68f8181d68b (patch) | |
| tree | d3e08937bc78441a2f3d64ad6935337cf6d9b0be /lua/extregs/init.lua | |
| download | extregs.nvim-main.tar.gz extregs.nvim-main.tar.bz2 extregs.nvim-main.zip | |
added a bunch of useful extregs
Diffstat (limited to 'lua/extregs/init.lua')
| -rw-r--r-- | lua/extregs/init.lua | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/lua/extregs/init.lua b/lua/extregs/init.lua new file mode 100644 index 0000000..b9dcbe1 --- /dev/null +++ b/lua/extregs/init.lua @@ -0,0 +1,72 @@ +local M = {} + +M.defaults = { + file = { path = (vim.env.XDG_RUNTIME_DIR or vim.fn.stdpath('state')) .. '/nvim.regfile' }, + ssh = { host = nil, path = '~/.local/state/nvim/regfile' }, + osc52 = { register = '+' }, + tmux = { buffer = nil }, + timestamp = { format = '%Y-%m-%dT%H:%M:%S%z' }, +} + +-- name, module, configuration section; registration semantics are (write, read). +local providers = { + { 'osc52', 'osc52', 'osc52' }, + { 'tmux', 'tmux', 'tmux' }, + { 'buffer', 'buffer' }, + { 'file.basename', 'file_basename' }, + { 'file.stem', 'file_stem' }, + { 'file.dirname', 'file_dirname' }, + { 'file.backed', 'file', 'file' }, + { 'ssh.backed', 'ssh', 'ssh' }, + { 'timestamp', 'timestamp', 'timestamp' }, + { 'uuid', 'uuid' }, +} + +local function notify(msg, level) + vim.schedule(function() + vim.notify('extregs.nvim: ' .. msg, level or vim.log.levels.ERROR) + end) +end + +local function guard(name, fn) + return function(...) + local ok, result = pcall(fn, ...) + if not ok then + notify(name .. ': ' .. tostring(result)) + return false + end + return result + end +end + +local function register(name, provider) + assert(type(provider.read) == 'function', name .. ': missing read()') + assert(type(provider.write) == 'function', name .. ': missing write()') + vim._extregs.register(name, + guard(name, function(reg) + if provider.readonly then + notify(name .. ' is read-only', vim.log.levels.WARN) + return false + end + return provider:write(reg) + end), + guard(name, function() return provider:read() end)) +end + +function M.setup(opts) + if vim.fn.has('extregs') ~= 1 or not (vim._extregs and vim._extregs.register) then + notify("requires a Neovim build with has('extregs') and vim._extregs.register") + return false + end + if M._initialized then return true end + local cfg = vim.tbl_deep_extend('force', vim.deepcopy(M.defaults), opts or {}) + for _, spec in ipairs(providers) do + local name, module, section = unpack(spec) + local provider = require('extregs.' .. module).get_provider(cfg[section] or {}) + register(name, provider) + end + M._initialized = true + return true +end + +return M |