diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2022-08-21 23:43:52 -0600 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2022-08-21 23:43:52 -0600 |
commit | 692ea0603a9fd20be5ce61293dd85ff8bb31ad26 (patch) | |
tree | 51f6c97956bc415611836f32c7764dd50ee4b98b /runtime/lua/vim/usermark.lua | |
parent | 0eef922692e9061d130d72c00e51bf023b234142 (diff) | |
download | rneovim-692ea0603a9fd20be5ce61293dd85ff8bb31ad26.tar.gz rneovim-692ea0603a9fd20be5ce61293dd85ff8bb31ad26.tar.bz2 rneovim-692ea0603a9fd20be5ce61293dd85ff8bb31ad26.zip |
feat(usermarks): add runtime files for usermarks
Diffstat (limited to 'runtime/lua/vim/usermark.lua')
-rw-r--r-- | runtime/lua/vim/usermark.lua | 65 |
1 files changed, 65 insertions, 0 deletions
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 |