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>