Skip to content

Commit a7ee523

Browse files
committed
feat: better documentation window positioning
1 parent 15e808b commit a7ee523

File tree

2 files changed

+29
-10
lines changed

2 files changed

+29
-10
lines changed

lua/blink/cmp/config.lua

+9-2
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,15 @@
4040
--- @field direction_priority ("n" | "s")[]
4141
--- @field preselect boolean
4242

43+
--- @class DocumentationDirectionPriorityConfig
44+
--- @field autocomplete_north ("n" | "s" | "e" | "w")[]
45+
--- @field autocomplete_south ("n" | "s" | "e" | "w")[]
46+
---
4347
--- @class DocumentationConfig
4448
--- @field min_width number
4549
--- @field max_width number
4650
--- @field max_height number
47-
--- @field direction_priority ("n" | "s" | "e" | "w")[]
51+
--- @field direction_priority DocumentationDirectionPriorityConfig
4852
--- @field auto_show boolean
4953
--- @field debounce_ms number
5054
--- @field delay_ms number
@@ -89,7 +93,10 @@ local config = {
8993
min_width = 10,
9094
max_width = 60,
9195
max_height = 20,
92-
direction_priority = { 'e', 'w', 's', 'n' },
96+
direction_priority = {
97+
autocomplete_north = { 'e', 'w', 'n', 's' },
98+
autocomplete_south = { 'e', 'w', 's', 'n' },
99+
},
93100
auto_show = true,
94101
delay_ms = 0,
95102
debounce_ms = 100,

lua/blink/cmp/windows/documentation.lua

+20-8
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ function docs.setup()
1717
autocomplete.listen_on_position_update(function()
1818
if autocomplete.win:get_win() then docs.update_position() end
1919
end)
20-
autocomplete.listen_on_select(function(item) docs.show_item(item) end)
20+
if config.windows.documentation.auto_show then
21+
autocomplete.listen_on_select(function(item) docs.show_item(item) end)
22+
end
2123
autocomplete.listen_on_close(function() docs.win:close() end)
2224

2325
return docs
@@ -66,12 +68,15 @@ function docs.update_position()
6668
local autocomplete_winnr = autocomplete.win:get_win()
6769
if not autocomplete_winnr then return end
6870
local autocomplete_win_config = vim.api.nvim_win_get_config(autocomplete_winnr)
69-
local function set_config(opts)
70-
vim.api.nvim_win_set_config(winnr, { relative = 'win', win = autocomplete_winnr, row = opts.row, col = opts.col })
71-
end
7271

7372
local screen_width = vim.api.nvim_win_get_width(0)
7473
local screen_height = vim.api.nvim_win_get_height(0)
74+
local cursor_screen_row = vim.fn.screenrow()
75+
76+
local autocomplete_win_is_up = autocomplete_win_config.row - cursor_screen_row < 0
77+
local direction_priority = autocomplete_win_is_up
78+
and config.windows.documentation.direction_priority.autocomplete_north
79+
or config.windows.documentation.direction_priority.autocomplete_south
7580

7681
local height = vim.api.nvim_win_get_height(winnr)
7782
local width = vim.api.nvim_win_get_width(winnr)
@@ -81,22 +86,29 @@ function docs.update_position()
8186
local space_left = autocomplete_win_config.col > width
8287
local space_right = screen_width - autocomplete_win_config.width - autocomplete_win_config.col > width
8388

84-
for _, direction in ipairs(config.windows.documentation.direction_priority) do
89+
local function set_config(opts)
90+
vim.api.nvim_win_set_config(winnr, { relative = 'win', win = autocomplete_winnr, row = opts.row, col = opts.col })
91+
end
92+
for _, direction in ipairs(direction_priority) do
8593
if direction == 'n' and space_above then
86-
if autocomplete_win_config.row >= 0 then
94+
if autocomplete_win_is_up then
8795
set_config({ row = -height, col = 0 })
8896
else
8997
set_config({ row = -1 - height, col = 0 })
9098
end
9199
return
92100
elseif direction == 's' and space_below then
93-
set_config({ row = autocomplete_win_config.height, col = 0 })
101+
if autocomplete_win_is_up then
102+
set_config({ row = 1 + autocomplete_win_config.height, col = 0 })
103+
else
104+
set_config({ row = autocomplete_win_config.height, col = 0 })
105+
end
94106
return
95107
elseif direction == 'e' and space_right then
96108
set_config({ row = 0, col = autocomplete_win_config.width })
97109
return
98110
elseif direction == 'w' and space_left then
99-
set_config({ row = 0, col = -width })
111+
set_config({ row = 0, col = -1 - width })
100112
return
101113
end
102114
end

0 commit comments

Comments
 (0)