vim功能外部呼叫

时间:2013-05-20 11:50:10

标签: function rspec cucumber vim

目前我的vimrc具有以下键映射:

map <leader>m :w\|!clear && rspec --drb %<cr>
map <leader>k :w\|!clear && rspec --drb %:<C-r>=line('.')<CR><cr>
map <leader>c :w\|:!clear && cucumber --drb -r ./features %<cr>
map <leader>x :w\|!clear && cucumber --drb -r ./features %:<C-r>=line('.')<CR><cr>

但是我想将它们合并为(两个)具有相同的行与文件的键映射的函数,我尝试了以下但是Vim抱怨缺少括号:

function! TestCurrentLine()
  let spec = '*_spec\.rb'
  if !(expand("%") =~ spec)
    :!clear && cucumber --drb -r ./features %:<C-r>=line('.')<CR>
  else
    :!clear && rspec --drb %:<C-r>=line('.')<CR>
  end
endfunction

function! TestCurrentFile()
  let spec = '*_spec\.rb'
  if !(expand("%") =~ spec)
    :!clear && cucumber --drb -r ./features %
  else
    :!clear && rspec --drb %
  end
endfunction

map <leader>m :w\|call TestCurrentFile<cr>
map <leader>k :w\|call TestCurrentLine<cr>

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

除了map命令中遗漏的()之外。你的功能也存在一些问题:

  • !clear您不需要领先:
  • '*_spec\.rb'应该是一个正则表达式。但领先的*没有任何意义。你想拥有.*_spe.....?使用.*_spec\.rb$'
  • 也会更好
  • 直接将%传递给您的shell命令并非100%安全。 (如果您的缓冲区名称有特殊的字符或空格)。你可以使用内置shellescape()函数。例如,shellescape(@%,1)(那么您需要"execute"来执行命令)
  • 考虑在某个缓冲区(<buffer>)中仅为某些文件类型(通过autocmd)创建那些映射,同样在创建映射时,请考虑“nore”。

答案 1 :(得分:3)

在函数调用中添加括号:

map <leader>m :w\|call TestCurrentFile()<cr>
map <leader>k :w\|call TestCurrentLine()<cr>