1

目前我的 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>

有任何想法吗?

4

2 回答 2

4

除了()在你的地图命令中错过。你的函数也有一些问题:

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

在函数调用中添加括号:

map <leader>m :w\|call TestCurrentFile()<cr>
map <leader>k :w\|call TestCurrentLine()<cr>
于 2013-05-20T11:52:44.030 回答