如何在有条件地映射vim中的序列以运行外部程序而不打印else子句

时间:2013-04-03 07:43:53

标签: vim

如何有条理地在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

2 个答案:

答案 0 :(得分:9)

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

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

注意:

  • You should use :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也将遵循该映射。除非你打算这样做,否则最好使用另一个组合键。