如何用nmap为Vim关闭所有quickfix窗口的命令设置快捷键并解决报错?
解决Vim快捷键关闭Quickfix/Locationlist窗口的错误问题
我来帮你搞定这个问题!你遇到的E749和E488错误,根源是快捷键的写法不对——你没必要把命令存到寄存器@a里,而且原写法的语法也有问题,导致Vim解析命令时出错。
错误原因拆解
- E488: Trailing characters:你用
:let @a = "..."的方式赋值寄存器,但字符串里的双引号、空格没有正确处理,Vim把后面的内容当成了多余的命令行字符。 - E749: empty buffer:这是寄存器操作引发的副作用,因为你没有实际执行关闭窗口的命令,反而做了不必要的寄存器赋值,导致Vim处理空缓冲区时出错。
正确的快捷键写法
直接把关闭窗口的命令绑定到<S-q>即可,推荐两种可靠的写法:
写法1:用<Cmd>执行命令(推荐)
<Cmd>是Vim里专门用来在映射中执行Ex命令的方式,不会进入命令行模式,避免很多语法问题:
nmap <S-q> <Cmd>windo if &buftype == 'quickfix' || &buftype == 'locationlist' | lclose | endif<CR>
写法2:用execute转义字符串
如果需要处理字符串中的引号,用execute包裹命令并转义单引号:
nmap <S-q> :execute 'windo if &buftype == ''quickfix'' || &buftype == ''locationlist'' | lclose | endif'<CR>
优化:添加静默执行避免报错
如果普通窗口执行lclose会弹出错误提示,可以加上silent!忽略这些无关错误:
nmap <S-q> <Cmd>silent! windo if &buftype == 'quickfix' || &buftype == 'locationlist' | lclose | endif<CR>
验证效果
保存init.vim后重启Vim,按<S-q>(Shift+q)就能一次性关闭所有打开的quickfix和locationlist窗口了。
内容的提问来源于stack exchange,提问作者Illia Danko
相关产品推荐
相关产品推荐

