在vim中绑定一个键来执行多个表达式映射


nnoremap <expr> <C-b> ':set bg='.(&bg=='dark' ? "light" : "dark")."<cr>"
nnoremap <expr> <C-b> ':!'.(&bg=='dark' ? "dark" : "light")."<cr>"

都是单独工作的,但是当我将键绑定设置为

nnoremap <expr> <C-b> ':set bg='.(&bg=='dark' ? "light" : "dark")."<cr>" | ':!'.(&bg=='dark' ? "dark" : "light")."<cr>"

只执行第一个。如何使keybind同时执行这两个命令?

通过添加<expr>修饰符,您告诉Vim映射的整个右侧是一个表达式,但中间的<bar>打破了表达式。

这意味着您的第二个表达式(有条件地执行外部命令)必须以某种方式与第一个表达式融合。在这种特殊情况下,有几种方法可以做到这一点,但最简单的是将两者连接起来,而不是用<bar>:

分隔它们。
nnoremap <expr> <C-b> ':set bg='.(&bg=='dark' ? "light" : "dark")."<cr>".':!'.(&bg=='dark' ? "dark" : "light")."<cr>"

你也可以有一个单一的三元条件。

但是这一行字太长了。这通常是将不可维护的逻辑转换为可读函数开始有意义的地方:

function! ToggleBackground()
    let toggles = { "dark": "light", "light": "dark" }
    let &background = toggles[&background]
    call system(toggles[&background])
endfunction
nnoremap <C-b> <Cmd>call ToggleBackground()<CR>

相关内容

  • 没有找到相关文章

最新更新