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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
-- The following is extracted and modified from plenary.vnim by
-- TJ Devries. It is not a stable API, and is expected to change
--
local api = vim.api
local function apply_defaults(original, defaults)
if original == nil then
original = {}
end
original = vim.deepcopy(original)
for k, v in pairs(defaults) do
if original[k] == nil then
original[k] = v
end
end
return original
end
local win_float = {}
win_float.default_options = {}
function win_float.default_opts(options)
options = apply_defaults(options, { percentage = 0.9 })
local width = math.floor(vim.o.columns * options.percentage)
local height = math.floor(vim.o.lines * options.percentage)
local top = math.floor(((vim.o.lines - height) / 2))
local left = math.floor((vim.o.columns - width) / 2)
local opts = {
relative = 'editor',
row = top,
col = left,
width = width,
height = height,
style = 'minimal',
border = {
{ ' ', 'NormalFloat' },
{ ' ', 'NormalFloat' },
{ ' ', 'NormalFloat' },
{ ' ', 'NormalFloat' },
{ ' ', 'NormalFloat' },
{ ' ', 'NormalFloat' },
{ ' ', 'NormalFloat' },
{ ' ', 'NormalFloat' },
},
}
opts.border = options.border and options.border
return opts
end
--- Create window that takes up certain percentags of the current screen.
---
--- Works regardless of current buffers, tabs, splits, etc.
--@param col_range number | Table:
-- If number, then center the window taking up this percentage of the screen.
-- If table, first index should be start, second_index should be end
--@param row_range number | Table:
-- If number, then center the window taking up this percentage of the screen.
-- If table, first index should be start, second_index should be end
function win_float.percentage_range_window(col_range, row_range, options)
options = apply_defaults(options, win_float.default_options)
local win_opts = win_float.default_opts(options)
win_opts.relative = 'editor'
local height_percentage, row_start_percentage
if type(row_range) == 'number' then
assert(row_range <= 1)
assert(row_range > 0)
height_percentage = row_range
row_start_percentage = (1 - height_percentage) / 3
elseif type(row_range) == 'table' then
height_percentage = row_range[2] - row_range[1]
row_start_percentage = row_range[1]
else
error(string.format("Invalid type for 'row_range': %p", row_range))
end
win_opts.height = math.ceil(vim.o.lines * height_percentage)
win_opts.row = math.ceil(vim.o.lines * row_start_percentage)
win_opts.border = options.border or 'none'
local width_percentage, col_start_percentage
if type(col_range) == 'number' then
assert(col_range <= 1)
assert(col_range > 0)
width_percentage = col_range
col_start_percentage = (1 - width_percentage) / 2
elseif type(col_range) == 'table' then
width_percentage = col_range[2] - col_range[1]
col_start_percentage = col_range[1]
else
error(string.format("Invalid type for 'col_range': %p", col_range))
end
win_opts.col = math.floor(vim.o.columns * col_start_percentage)
win_opts.width = math.floor(vim.o.columns * width_percentage)
local bufnr = options.bufnr or api.nvim_create_buf(false, true)
local win_id = api.nvim_open_win(bufnr, true, win_opts)
api.nvim_win_set_option(win_id, 'winhl', 'FloatBorder:LspInfoBorder')
for k, v in pairs(win_float.default_options) do
if k ~= 'border' then
vim.opt_local[k] = v
end
end
api.nvim_win_set_buf(win_id, bufnr)
api.nvim_win_set_option(win_id, 'cursorcolumn', false)
api.nvim_buf_set_option(bufnr, 'tabstop', 2)
api.nvim_buf_set_option(bufnr, 'shiftwidth', 2)
return {
bufnr = bufnr,
win_id = win_id,
}
end
return win_float
|