我现在已经映射了一个快捷方式,因此我可以运行当前测试文件的php。当我开发时,我将窗口分成两部分:一方面我继续测试,另一方面我保留生产代码。如果我在测试文件上,感谢
:map <leader>t :!vendor/bin/phpunit %<cr>
我可以运行当前的phpunit
测试。 %
代表当前文件。我希望能够运行测试文件,当我使用生产代码时也是如此。例如:
- src/Foo/Bar/ProductionCode.php
- test/Foo/Bar/ProductionCodeTest.php
我可以映射
<leader>t
这样我才能从ProdutionCode.php
开始测试?我每次都需要做的是Ctrl+w Ctrl+w <leader>t
。我只想运行<leader>t
命令。有人能帮助我吗?
测试的命名空间反映了生产的命名空间。我认为一个好主意可能就像
:map <leader>t :!vendor/bin/phpunit TESTFILE<cr>
其中TESTFILE
就像这个伪代码:
if current file ends with Test.php
return %
else
fileName = % " src/Foo/Bar/ProductionCode.php
" src/Foo/Bar/ProductionCodeTest.php
" test/Foo/Bar/ProductionCodeTest.php
return fileName
endif
function! RunPhpUnit()
let l:filename = expand('%')
if l:filename !~# 'Test\.php$'
let l:filename=substitute(l:filename, '\.php$', 'Test.php', '')
endif
let l:filename=substitute(l:filename, 'code\/classes', 'spec\/unit', '')
return ':!vendor/bin/phpunit ' . l:filename . "\<CR>"
endfunction
:noremap <expr> <leader>t RunPhpUnit()
答案 0 :(得分:2)
是的,这可以做到。对于文件名中的简单替换,您可以使用:help filename-modifiers
下列出的修饰符,例如将src
转换为test
:
:noremap <leader>t :!vendor/bin/phpunit %:s?src?test?<cr>
对于更复杂的逻辑(似乎你需要它),你可以使用:help :map-expression
然后使用条件来按下文件名:
function! RunPhpUnit()
let l:filename = expand('%')
if l:filename !~# 'Test\.php$'
call substitute(l:filename, '\.php$', 'Test.php', '')
endif
call substitute(l:filename, 'src', 'test', '')
return ':!vendor/bin/phpunit ' . l:filename . "\<CR>"
endfunction
:noremap <expr> <leader>t RunPhpUnit()
PS:You should use :noremap
;它使映射不受重映射和递归的影响。