如何在VIM中编写条件映射?

9
我想要执行nnoremap Q :q!<cr>nnnoremap Q :bd<CR>,如何将这两个绑定混合起来?我理想中的情况是使Q绑定能够智能地知道我们是否在缓冲区中以及是否是窗口中的最后一个缓冲区。
1个回答

16

map <expr> (:h map-<expr>) 是你的朋友。

nnoremap <expr> Q yourConditionExpression ? ':q!<cr>':':bd<cr>'

以上面

yourConditionExpression

可以是一个布尔表达式,例如3>0,也可以是返回布尔值的函数。您可以将检查逻辑放在那里。


好主意。但是这似乎只在读取.vimrc文件时调用了yourConditionExpression一次。例如,如果映射是nnoremap <expr> <F12> MyFunc == 0() ? ':Yep' : 'Nope',那么一旦读取键绑定,按下F12始终返回相同的结果,即使执行:echom MyFunc()返回不同的结果。 - Brent Faust
@BrentFaust 尝试使用 nnoremap <expr> <F12> MyFunc(),并让你的 MyFunc() 返回按键(字符)操作。虽然我没有测试过,但这应该不是问题,因为在我的设置中,函数中有 getchar(),如果它只被评估一次,它将无法工作。 - Kent
你是正确的 - 它总是调用该函数。只是我的函数中有错误需要更改焦点窗格:exe "normal! \<c-w>l" 在 noremap <expr> 中会出现错误 E523: Not allowed here - Brent Faust

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接