forked from zbirenbaum/copilot.lua
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinit.lua
More file actions
129 lines (112 loc) · 3.62 KB
/
init.lua
File metadata and controls
129 lines (112 loc) · 3.62 KB
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
local logger = require("copilot.logger")
local config = require("copilot.config")
local M = {}
local previous_keymaps = {}
---@param mode string
---@param key string
---@param action function
---@param desc string
---@param bufnr integer
function M.register_keymap(mode, key, action, desc, bufnr)
if not key then
return
end
if not mode or not action then
logger.error("Invalid parameters to register_keymap" .. vim.inspect({ mode, key, action, desc, bufnr }))
return
end
vim.keymap.set(mode, key, function()
action()
end, {
desc = desc,
silent = true,
buffer = bufnr,
})
end
---@param mode string
---@param key string
---@param action function: boolean
---@param desc string
---@param bufnr integer
function M.register_keymap_with_passthrough(mode, key, action, desc, bufnr)
if not key then
return
end
if not mode or not action then
logger.error("Invalid parameters to register_keymap_with_passthrough" .. vim.inspect({ mode, key, action, desc }))
return
end
local keymap_key = bufnr .. ":" .. mode .. ":" .. key
-- Save any existing mapping for this key
local existing = vim.fn.maparg(key, mode, false, true)
if existing then
if existing.rhs and existing.rhs ~= "" then
previous_keymaps[keymap_key] = { type = "rhs", value = existing.rhs }
logger.trace("Saved existing keymap for " .. keymap_key .. ": " .. existing.rhs)
elseif existing.callback then
previous_keymaps[keymap_key] = { type = "callback", value = existing.callback }
logger.trace("Saved existing keymap callback for " .. keymap_key)
else
previous_keymaps[keymap_key] = nil
logger.trace("No existing keymap for " .. keymap_key)
end
else
previous_keymaps[keymap_key] = nil
logger.trace("No existing keymap for " .. keymap_key)
end
vim.keymap.set(mode, key, function()
logger.trace("Keymap triggered for " .. keymap_key)
if action() then
logger.trace("Action handled the keymap for " .. keymap_key)
return "<Ignore>"
else
local prev = previous_keymaps[keymap_key]
if prev then
if prev.type == "rhs" then
logger.trace("Passing through to previous keymap for " .. keymap_key .. ": " .. prev.value)
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(prev.value, true, false, true), mode, true)
elseif prev.type == "callback" then
logger.trace("Passing through to previous keymap callback for " .. keymap_key)
prev.value()
end
return "<Ignore>"
end
logger.trace("No previous keymap to pass through for " .. keymap_key)
return key
end
end, {
desc = desc,
expr = true,
silent = true,
buffer = bufnr,
})
end
---@param mode string
---@param key string|false
---@param bufnr integer
function M.unset_keymap_if_exists(mode, key, bufnr)
if not key then
return
end
local ok, err = pcall(vim.api.nvim_buf_del_keymap, bufnr, mode, key)
if not ok then
local suggestion_keymaps = config.suggestion.keymap or {}
local nes_keymaps = config.nes.keymap or {}
local panel_keymaps = config.panel.keymap or {}
local found = false
for _, tbl in ipairs({ suggestion_keymaps, nes_keymaps, panel_keymaps }) do
for _, v in pairs(tbl) do
if v == key then
if found then
logger.error("Keymap " .. key .. " is used for two different actions, please review your configuration.")
return
else
found = true
end
end
end
end
logger.error("Could not unset keymap for " .. mode .. " " .. key .. ", bufnr " .. bufnr .. ": " .. err)
end
end
return M