目前我的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>
有什么想法吗?
答案 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>