Vim中ESC键映射关闭COC弹出菜单失效问题排查与解决
问题原因
Vim对插入模式下的<ESC>有原生高优先级处理:按下ESC时,Vim会立即触发插入模式退出动作,此时表达式映射里的pumvisible()判断还未执行,Coc弹出菜单已随插入模式退出而关闭,导致pumvisible()永远返回false,映射直接执行默认的ESC退出动作。
解决方案
以下两种方式均可实现需求:
方式一:利用Vim原生快捷键关闭菜单
使用Vim原生的<C-e>快捷键(用于关闭弹出菜单)替代Coc函数调用,确保在插入模式下优先执行菜单关闭动作:
inoremap <expr><ESC> pumvisible() ? "\<C-e>" : "\<ESC>"
- 第一次按ESC:若弹出菜单可见,
<C-e>会关闭菜单并保持插入模式 - 第二次按ESC:菜单已关闭,执行默认ESC动作退出插入模式
方式二:使用Coc专属判断逻辑
用Coc提供的coc#pum#visible()判断菜单状态,结合feedkeys确保动作在插入模式下执行:
inoremap <silent><expr> <ESC> coc#pum#visible() ? feedkeys(coc#pum#cancel(), 'n') : "\<ESC>"
该方式更贴合Coc生态,能精准识别Coc弹出菜单的状态。
内容的提问来源于stack exchange,提问作者Lex
相关产品推荐
相关产品推荐

