aboutsummaryrefslogtreecommitdiff
path: root/lua/extregs/init.lua
diff options
context:
space:
mode:
authorJosh Rahm <rahm@josher.dev>2026-10-18 15:49:48 -0600
committerJosh Rahm <rahm@josher.dev>2026-10-18 15:49:48 -0600
commit7b15a3a4b4fb4dc6be5d53a22c20d68f8181d68b (patch)
treed3e08937bc78441a2f3d64ad6935337cf6d9b0be /lua/extregs/init.lua
downloadextregs.nvim-main.tar.gz
extregs.nvim-main.tar.bz2
extregs.nvim-main.zip
[extregs] initial commit.HEADmain
added a bunch of useful extregs
Diffstat (limited to 'lua/extregs/init.lua')
-rw-r--r--lua/extregs/init.lua72
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