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 | |
parent | 0eef922692e9061d130d72c00e51bf023b234142 (diff) | |
download | rneovim-692ea0603a9fd20be5ce61293dd85ff8bb31ad26.tar.gz rneovim-692ea0603a9fd20be5ce61293dd85ff8bb31ad26.tar.bz2 rneovim-692ea0603a9fd20be5ce61293dd85ff8bb31ad26.zip |
feat(usermarks): add runtime files for usermarks
-rw-r--r-- | runtime/autoload/usermark.vim | 7 | ||||
-rw-r--r-- | runtime/lua/vim/usermark.lua | 65 | ||||
-rw-r--r-- | runtime/plugin/usermark.vim | 1 |
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 |