2013-05-20 163 views
1

目前我的vimrc具有以下主要映射:VIM函数外部调用

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> 

不过,我想将它们整合成具有行VS文件相同的键盘映射(二)功能,我已经试过以下但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> 

任何想法?

回答

3

添加括号你的函数调用:

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

除了在地图命令。你的功能有一些问题太:

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

+1对'nnoremap '。我还建议如果'filetype'没有正确设置为'cucubmer'或'rspec'来使用像这样的自动命令'autocmd BufNewFile,BufRead * _spec.rb set filetype = cucumber'。通过'set filetype?'检查文件类型。正确设置文件类型不仅仅是语法高亮。它也会让你访问':make'。如果需要,你可以直接通过':compiler cucumber'或者':'编译器rspec'来设置编译器。我建议学习使用'quickfix'列表来遍历':make'结果。 –

+0

我已经完全重新编写了命令,但是我一定会看看文件类型特定的加载,谢谢。 – HaaR