This commit is contained in:
hrsh7th
2021-11-03 02:29:06 +09:00
parent 3b4d3ceab1
commit c67ed9d8bc
5 changed files with 35 additions and 44 deletions

View File

@@ -1,3 +1,4 @@
local mapping = require('cmp.config.mapping')
local cache = require('cmp.utils.cache')
local keymap = require('cmp.utils.keymap')
local misc = require('cmp.utils.misc')
@@ -91,9 +92,11 @@ end
---@return cmp.ConfigSchema
config.normalize = function(c)
if c.mapping then
local normalized = {}
for k, v in pairs(c.mapping) do
c.mapping[keymap.normalize(k)] = v
normalized[keymap.normalize(k)] = mapping(v, { 'i' })
end
c.mapping = normalized
end
return c
end

View File

@@ -1,35 +1,14 @@
local api = require('cmp.utils.api')
local mapping
mapping = setmetatable({}, {
__call = function(_, invoke, modes)
if type(invoke) == 'function' then
return {
invoke = function(...)
invoke(...)
end,
modes = modes or { 'i' },
__type = 'mapping',
}
elseif type(invoke) == 'table' then
if invoke.__type == 'mapping' then
local map = {}
for _, mode in ipairs(modes or { 'i' }) do
map[mode] = invoke
end
return map
end
return invoke
else
return mapping(function(fallback)
if api.is_insert_mode() and invoke.i then
return invoke.i(fallback)
elseif api.is_cmdline_mode() and invoke.c then
return invoke.c(fallback)
elseif api.is_select_mode() and invoke.s then
return invoke.s(fallback)
elseif api.is_visual_mode() and invoke.x then
return invoke.x(fallback)
else
fallback()
end
end, vim.tbl_keys(invoke))
end
end
end,
})

View File

@@ -104,14 +104,10 @@ end
---Keypress handler
core.on_keymap = function(self, keys, fallback)
for key, action in pairs(config.get().mapping) do
if keymap.equals(key, keys) then
if type(action) == 'function' then
action(fallback)
else
action.invoke(fallback)
end
return
local mode = api.get_mode()
for key, mapping in pairs(config.get().mapping) do
if keymap.equals(key, keys) and mapping[mode] then
return mapping[mode](fallback)
end
end
@@ -139,14 +135,8 @@ end
---Prepare completion
core.prepare = function(self)
for keys, action in pairs(config.get().mapping) do
if type(action) == 'function' then
action = {
modes = { 'i' },
action = action,
}
end
for _, mode in ipairs(action.modes) do
for keys, mapping in pairs(config.get().mapping) do
for mode in pairs(mapping) do
keymap.listen(mode, keys, function(...)
self:on_keymap(...)
end)

View File

@@ -50,6 +50,7 @@ cmp.ItemField.Menu = 'menu'
---@field public __call fun(c: cmp.ConfigSchema)
---@field public buffer fun(c: cmp.ConfigSchema)
---@field public global fun(c: cmp.ConfigSchema)
---@field public cmdline fun(type: string, c: cmp.ConfigSchema)
---@class cmp.SourceBaseApiParams
---@field public option table
@@ -59,6 +60,12 @@ cmp.ItemField.Menu = 'menu'
---@field public offset number
---@field public completion_context lsp.CompletionContext
---@class cmp.Mapping
---@field public i nil|function(fallback: function): void
---@field public c nil|function(fallback: function): void
---@field public x nil|function(fallback: function): void
---@field public s nil|function(fallback: function): void
---@class cmp.ConfigSchema
---@field private revision number
---@field public enabled fun():boolean|boolean
@@ -69,7 +76,7 @@ cmp.ItemField.Menu = 'menu'
---@field public sorting cmp.SortingConfig
---@field public formatting cmp.FormattingConfig
---@field public snippet cmp.SnippetConfig
---@field public mapping table<string, fun(core: cmp.Core, fallback: function)>
---@field public mapping table<string, cmp.Mapping>
---@field public sources cmp.SourceConfig[]
---@field public experimental cmp.ExperimentalConfig

View File

@@ -1,5 +1,17 @@
local api = {}
api.get_mode = function()
if api.is_insert_mode() then
return 'i'
elseif api.is_visual_mode() then
return 'x'
elseif api.is_select_mode() then
return 's'
elseif api.is_cmdline_mode() then
return 'c'
end
end
api.is_insert_mode = function()
return vim.tbl_contains({
'i',