RFC: cmdline completion (#362)

* manual support dot-repeat

* cmdwin and terminal

* cmdline only

* Fix

* fix

* Improve

* Fix test

* Support macro

* disable cmdline for now

* Simplify

* fmt

* consume once

* Ignore = type

* cmdline

* fmt

* Improve

* update

* fmt

* Support incsearch

* fix

* Add api

* Avoid cmdline completion if the native_menu enabled

* fix for macro

* Improve

* fmt

* Insert-mode only by default

* Update

* avoid conflict

* Improve default mapping

* Fix

* fix

* similar to native

* Update

* Fix README.md

* Improve

* Use <afile>
This commit is contained in:
hrsh7th
2021-10-27 12:38:46 +09:00
committed by GitHub
parent b5899f05c5
commit cae2e8f48b
13 changed files with 263 additions and 109 deletions

View File

@@ -267,7 +267,7 @@ source.complete = function(self, ctx, callback)
completion_context = {
triggerKind = types.lsp.CompletionTriggerKind.TriggerForIncompleteCompletions,
}
elseif self.request_offset ~= offset then
elseif not vim.tbl_contains({ self.request_offset, self.offset }, offset) then
completion_context = {
triggerKind = types.lsp.CompletionTriggerKind.Invoked,
}
@@ -303,40 +303,37 @@ source.complete = function(self, ctx, callback)
option = self:get_config().opts,
completion_context = completion_context,
},
async.timeout(
self.complete_dedup(vim.schedule_wrap(function(response)
if #((response or {}).items or response or {}) > 0 then
debug.log(self:get_debug_name(), 'retrieve', #(response.items or response))
local old_offset = self.offset
local old_entries = self.entries
self.complete_dedup(vim.schedule_wrap(misc.once(function(response)
if #((response or {}).items or response or {}) > 0 then
debug.log(self:get_debug_name(), 'retrieve', #(response.items or response))
local old_offset = self.offset
local old_entries = self.entries
self.status = source.SourceStatus.COMPLETED
self.incomplete = response.isIncomplete or false
self.entries = {}
for i, item in ipairs(response.items or response) do
if (misc.safe(item) or {}).label then
local e = entry.new(ctx, self, item)
self.entries[i] = e
self.offset = math.min(self.offset, e:get_offset())
end
self.status = source.SourceStatus.COMPLETED
self.incomplete = response.isIncomplete or false
self.entries = {}
for i, item in ipairs(response.items or response) do
if (misc.safe(item) or {}).label then
local e = entry.new(ctx, self, item)
self.entries[i] = e
self.offset = math.min(self.offset, e:get_offset())
end
self.revision = self.revision + 1
if #self:get_entries(ctx) == 0 then
self.offset = old_offset
self.entries = old_entries
self.revision = self.revision + 1
end
else
debug.log(self:get_debug_name(), 'continue', 'nil')
if completion_context.triggerKind == types.lsp.CompletionTriggerKind.TriggerCharacter then
self:reset()
end
self.status = prev_status
end
callback()
end)),
2000
)
self.revision = self.revision + 1
if #self:get_entries(ctx) == 0 then
self.offset = old_offset
self.entries = old_entries
self.revision = self.revision + 1
end
else
debug.log(self:get_debug_name(), 'continue', 'nil')
if completion_context.triggerKind == types.lsp.CompletionTriggerKind.TriggerCharacter then
self:reset()
end
self.status = prev_status
end
callback()
end)))
)
return true
end