feat: add option for view to follow cursor (#1727)

* feat: add option for custom entry view to follow cursor

Creates an option to allow the custom entries
view to follow the user's cursor as they type.

To enable, set
```lua
require("cmp").setup({
  view = {
    entries = {
      follow_cursor = true
    }
  }
})
```

Original source at 7569056388

Closes #1660

Co-authored-by: lvimuser <109605931+lvimuser@users.noreply.github.com>

* doc: add view.follow_cursor option to docs

---------

Co-authored-by: lvimuser <109605931+lvimuser@users.noreply.github.com>
This commit is contained in:
mcauley-penney 2024-03-30 23:46:16 -07:00 committed by GitHub
parent 97dc716fc9
commit 7aa3f71932
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 14 additions and 2 deletions

View file

@ -686,6 +686,13 @@ view.docs.auto_open~
Specify whether to show the docs_view when selecting an item.
*cmp-config.view.follow_cursor*
view.follow_cursor*
`boolean`
Specify whether the pmenu should follow the current position of the cursor
as the user types. `false` by default.
*cmp-config.window.{completion,documentation}.border*
window.{completion,documentation}.border~
`string | string[] | nil`

View file

@ -97,6 +97,7 @@ return function()
entries = {
name = 'custom',
selection_order = 'top_down',
follow_cursor = false,
},
docs = {
auto_open = true,

View file

@ -184,6 +184,7 @@ cmp.ItemField = {
---@class cmp.CustomEntriesViewConfig
---@field name 'custom'
---@field selection_order 'top_down'|'near_cursor'
---@field follow_cursor boolean
---@class cmp.NativeEntriesViewConfig
---@field name 'native'

View file

@ -161,9 +161,12 @@ custom_entries_view.open = function(self, offset, entries)
height = height ~= 0 and height or #self.entries
height = math.min(height, #self.entries)
local delta = 0
if not config.get().view.entries.follow_cursor then
local cursor_before_line = api.get_cursor_before_line()
delta = vim.fn.strdisplaywidth(cursor_before_line:sub(self.offset))
end
local pos = api.get_screen_cursor()
local cursor_before_line = api.get_cursor_before_line()
local delta = vim.fn.strdisplaywidth(cursor_before_line:sub(self.offset))
local row, col = pos[1], pos[2] - delta - 1
local border_info = window.get_border_info({ style = completion })