Vim中inoremap映射<up><down>与补全选择冲突,如何兼顾二者?
解决Vim插入模式折行导航与补全菜单按键冲突的方案
直接用表达式映射(<expr>)就能同时保留两个功能,核心思路是判断补全菜单是否可见,再决定按键的实际行为:
- 当补全菜单(popup menu)弹出时,让
<down>和<up>保持原生的候选遍历功能 - 当没有补全菜单时,继续使用
gj/gk实现折行后的屏幕行导航
替换你原来的映射,改成下面的配置:
inoremap <expr> <down> pumvisible() ? '<down>' : '<c-\><c-o>gj' inoremap <expr> <up> pumvisible() ? '<up>' : '<c-\><c-o>gk'
原理说明
Vim内置的pumvisible()函数会返回1(补全菜单可见)或0(不可见),表达式映射会根据这个返回值动态选择要执行的按键序列:
- 补全菜单弹出时,直接返回原生的
<down>/<up>,沿用:help popupmenu-keys里的默认行为 - 正常编辑状态下,执行你原来的
<c-\><c-o>gj/<c-\><c-o>gk,实现跨折行的屏幕行跳转
内容的提问来源于stack exchange,提问作者diffset
相关产品推荐
相关产品推荐

