summaryrefslogtreecommitdiff
path: root/plugin/mark.lua
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/mark.lua')
-rw-r--r--plugin/mark.lua54
1 files changed, 54 insertions, 0 deletions
diff --git a/plugin/mark.lua b/plugin/mark.lua
new file mode 100644
index 0000000..dd3baa6
--- /dev/null
+++ b/plugin/mark.lua
@@ -0,0 +1,54 @@
+-- Implementation of middle mark. This mark is always in the middle of the
+-- viewport.
+
+local api = vim.api
+
+-- Compatibility check.
+if not api.nvim_call_function('has', {'usermarks'}) then
+ return nil
+end
+
+local usermark = require("vim.usermark")
+
+-- The middle mark is on the middle of the screen.
+local middle_mark = {}
+function middle_mark.get(self)
+ local topline = vim.api.nvim_call_function('line', {'w0'})
+ local bottomline = vim.api.nvim_call_function('line', {'w$'})
+
+ return math.floor((topline + bottomline) / 2)
+end
+
+-- Setting the middle mark sets the current cusor line to the middle of the
+-- window. Principally this is the same as z.
+function middle_mark.set(self)
+ api.nvim_command('norm z.')
+end
+
+-- The top mark is the first line on the window. Right now scrolloff is ignored,
+-- but maybe it shouldn't be.
+local top_mark = {}
+function top_mark.get(self)
+ return vim.api.nvim_call_function('line', {'w0'})
+end
+-- Setting the top mark move the current line to the top. Principally this is
+-- the same mas z<cr>
+function top_mark.set(self)
+ api.nvim_command('norm z<cr>')
+end
+
+-- Setting the bottom mark moves the current line to the bottom. Principally
+-- this is the same as z-
+local bottom_mark = {}
+function bottom_mark.get(self)
+ return vim.api.nvim_call_function('line', {'w$'})
+end
+-- Setting the bottom mark doesn't do anything.
+function bottom_mark.set(self)
+ api.nvim_command('norm z-')
+end
+
+-- Register all the marks with their respective characters.
+usermark.register_handler('-', middle_mark)
+usermark.register_handler('+', top_mark)
+usermark.register_handler('_', bottom_mark)