From 0eef922692e9061d130d72c00e51bf023b234142 Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Sun, 21 Aug 2022 23:29:47 -0600 Subject: feat(usermarks): add usermarks to f_has list --- src/nvim/eval/funcs.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index 9c3c859771..9f851653eb 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -3660,6 +3660,7 @@ static void f_has(typval_T *argvars, typval_T *rettv, FunPtr fptr) "title", "user-commands", // was accidentally included in 5.4 "user_commands", + "usermarks", "vartabs", "vertsplit", "vimscript-1", -- cgit From 692ea0603a9fd20be5ce61293dd85ff8bb31ad26 Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Sun, 21 Aug 2022 23:43:52 -0600 Subject: feat(usermarks): add runtime files for usermarks --- runtime/autoload/usermark.vim | 7 +++++ runtime/lua/vim/usermark.lua | 65 +++++++++++++++++++++++++++++++++++++++++++ runtime/plugin/usermark.vim | 1 + 3 files changed, 73 insertions(+) create mode 100644 runtime/autoload/usermark.vim create mode 100644 runtime/lua/vim/usermark.lua create mode 100644 runtime/plugin/usermark.vim 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 -- cgit From 323eef76ee869dab24a925f5df8a7aefac5e3597 Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Mon, 22 Aug 2022 00:08:04 -0600 Subject: feat(usermarks) fix bugs with usermarks runtime --- runtime/autoload/usermark.vim | 8 ++++++-- runtime/lua/vim/usermark.lua | 25 ++++++++++++++----------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/runtime/autoload/usermark.vim b/runtime/autoload/usermark.vim index 4e0c56a9ea..02c76d5ffd 100644 --- a/runtime/autoload/usermark.vim +++ b/runtime/autoload/usermark.vim @@ -2,6 +2,10 @@ lua vim.usermark = require('vim.usermark') -function! userreg#func(action, mark) abort - return v:lua.vim.usermark.fn(a:action, a:mark) +function! usermark#func(action, mark) abort + let ret = v:lua.vim.usermark.fn(a:action, a:mark) + + echo "Returning: " . string(ret) + + return ret endfunction diff --git a/runtime/lua/vim/usermark.lua b/runtime/lua/vim/usermark.lua index ca5b9a3a72..0d1ec0ae0f 100644 --- a/runtime/lua/vim/usermark.lua +++ b/runtime/lua/vim/usermark.lua @@ -4,7 +4,7 @@ -- -- The default handler behaves just as a normal register would. -local vim = assert("vim") +local vim = assert(vim) local usermark = {} -- Returns a "default handler" which behaves like normal global marks. When a @@ -26,10 +26,13 @@ function usermark._default_handler() local file = vim.fn.expand("%:p") self.content = { - line: r, - col: c, - file: file + line = r; + col = c; } + + if file ~= '' then + self.content.file = file + end end return d @@ -44,22 +47,22 @@ usermark._marktable = {} -- 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() + if not usermark._marktable[mark] then + usermark._marktable[mark] = usermark._default_handler() end if action == "get" then - usermark._marktable[register]:get(mark) - return nil + return usermark._marktable[mark]:get(mark) else - return usermark._marktable[register]:set(mark) + usermark._marktable[mark]:set(mark) + return nil 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 +function usermark.register_handler(mark, handler) + usermark._marktable[mark] = handler end return usermark -- cgit From 9e40b6e9e1bc67f2d856adb837ee64dd0e25b717 Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Mon, 22 Aug 2022 00:26:23 -0600 Subject: feat(usermarks) remove echo statement from usermark.vim --- runtime/autoload/usermark.vim | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/runtime/autoload/usermark.vim b/runtime/autoload/usermark.vim index 02c76d5ffd..b1b4113d1a 100644 --- a/runtime/autoload/usermark.vim +++ b/runtime/autoload/usermark.vim @@ -3,9 +3,5 @@ lua vim.usermark = require('vim.usermark') function! usermark#func(action, mark) abort - let ret = v:lua.vim.usermark.fn(a:action, a:mark) - - echo "Returning: " . string(ret) - - return ret + return v:lua.vim.usermark.fn(a:action, a:mark) endfunction -- cgit