2

如何vim有条件地映射一个序列以运行两个外部程序中的任何一个,这样屏幕不会被清除以显示该else子句?

例如:

: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
4

2 回答 2

9

您可以使用表达式映射( :help map-expr)

:nnoremap <expr> <c-m> filereadable('Makefile') ? ':make<CR>' : ':!ls<CR>'

笔记:

  • 你应该使用:noremap; 它使映射不受重新映射和递归的影响。
  • <C-m><CR>与;相同 目前无法区分两者;更好地使用不同的键。有关更多信息,请参阅此答案
于 2013-04-03T07:58:29.000 回答
3

你需要map <expr>

例如:

nnoremap <expr> <c-t> line('.')>=6? ':!ls<cr>' : ':!seq 10<cr>'

在你的例子中:

:nnoremap <expr> <c-m> filereadable('Makefile') ? ':make<CR>' : ':!ls<CR>'

详细信息:

:h :map-<expr> 

请注意,如果您 map <c-m>Enter也将遵循该映射。除非您打算这样做,否则最好使用另一个组合键。

于 2013-04-03T08:01:03.340 回答