如何有条理地在vim
中映射序列以运行两个外部程序中的任何一个,以便屏幕不清除以显示else
子句?< / p>
例如:
:nmap <c-l> :if filereadable('Makefile')<CR>!make<CR>else<CR>!ls<CR>endif<CR>
ctrl
+ m
执行make
,但随后清除屏幕并在其底部打印以下内容:
: else
: !ls
: endif
Press ENTER or type command to continue
答案 0 :(得分:9)
您可以使用表达式映射(:help map-expr
)
:nnoremap <expr> <c-m> filereadable('Makefile') ? ':make<CR>' : ':!ls<CR>'
注意:
:noremap
;它使映射不受重映射和递归的影响。<C-m>
与<CR>
相同;目前没有办法区分这两者;更好地使用不同的键。有关详细信息,请参阅this answer。答案 1 :(得分:3)
您需要map <expr>
e.g:
nnoremap <expr> <c-t> line('.')>=6? ':!ls<cr>' : ':!seq 10<cr>'
在你的例子中:
:nnoremap <expr> <c-m> filereadable('Makefile') ? ':make<CR>' : ':!ls<CR>'
详细信息:
:h :map-<expr>
请注意,如果您映射<c-m>
,Enter
也将遵循该映射。除非你打算这样做,否则最好使用另一个组合键。