summaryrefslogtreecommitdiff
path: root/plugin/mark.lua
blob: dd3baa694682135870a7e1b59aa342314095b214 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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)