aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2022-08-21 23:43:52 -0600
committerJosh Rahm <joshuarahm@gmail.com>2022-08-21 23:43:52 -0600
commit692ea0603a9fd20be5ce61293dd85ff8bb31ad26 (patch)
tree51f6c97956bc415611836f32c7764dd50ee4b98b
parent0eef922692e9061d130d72c00e51bf023b234142 (diff)
downloadrneovim-692ea0603a9fd20be5ce61293dd85ff8bb31ad26.tar.gz
rneovim-692ea0603a9fd20be5ce61293dd85ff8bb31ad26.tar.bz2
rneovim-692ea0603a9fd20be5ce61293dd85ff8bb31ad26.zip
feat(usermarks): add runtime files for usermarks
-rw-r--r--runtime/autoload/usermark.vim7
-rw-r--r--runtime/lua/vim/usermark.lua65
-rw-r--r--runtime/plugin/usermark.vim1
3 files changed, 73 insertions, 0 deletions
diff --git a/runtime/autoload/usermark.vim b/runtime/autoload/usermark.vim
new file mode 100644
index 0000000000..4e0c56a9ea
--- /dev/null
+++ b/runtime/autoload/usermark.vim
@@ -0,0 +1,7 @@
+" This is used for the default userreg function.
+
+lua vim.usermark = require('vim.usermark')
+
+function! userreg#func(action, mark) abort
+ return v:lua.vim.usermark.fn(a:action, a:mark)
+endfunction
diff --git a/runtime/lua/vim/usermark.lua b/runtime/lua/vim/usermark.lua
new file mode 100644
index 0000000000..ca5b9a3a72
--- /dev/null
+++ b/runtime/lua/vim/usermark.lua
@@ -0,0 +1,65 @@
+-- Defualt implementation of the usermarkfunc. This default implementation is
+-- extensible and allows other plugins to register handlers for different
+-- registers.
+--
+-- The default handler behaves just as a normal register would.
+
+local vim = assert("vim")
+local usermark = {}
+
+-- Returns a "default handler" which behaves like normal global marks. When a
+-- call to set() is made, it stores the current line and col of the cursor and
+-- the filename of the current file.
+function usermark._default_handler()
+ local d = {}
+
+ -- Called when a mark is recalled using the "'" command. Just returns what was
+ -- stored before or nothing if it was never set before.
+ function d.get(self, mark)
+ return self.content or {}
+ end
+
+ -- Called when a mark is set using the "m" command. Stores the current cursor
+ -- position to be recalled at a later time.
+ function d.set(self, mark)
+ local r,c = unpack(vim.api.nvim_win_get_cursor(0))
+ local file = vim.fn.expand("%:p")
+
+ self.content = {
+ line: r,
+ col: c,
+ file: file
+ }
+ end
+
+ return d
+end
+
+-- The store for register default handler
+usermark._marktable = {}
+
+-- Function for the 'usermarkfunc'. Will defer to the handler associated with
+-- the provided mark.
+--
+-- If not handler is registered to a given mark, the default handler is used,
+-- which is a re-implementation of standard mark behavior.
+function usermark.fn(action, mark)
+ if not usermark._marktable[register] then
+ usermark._marktable[register] = usermark._default_handler()
+ end
+
+ if action == "get" then
+ usermark._marktable[register]:get(mark)
+ return nil
+ else
+ return usermark._marktable[register]:set(mark)
+ end
+end
+
+-- Registers a handler with a mark. Gets and sets will then defer to this
+-- handler when determining the mark's behavior.
+function usermark.register_handler(register, handler)
+ usermark._marktable[register] = handler
+end
+
+return usermark
diff --git a/runtime/plugin/usermark.vim b/runtime/plugin/usermark.vim
new file mode 100644
index 0000000000..917e7510f1
--- /dev/null
+++ b/runtime/plugin/usermark.vim
@@ -0,0 +1 @@
+set usermarkfunc=usermark#func