背景:我一直在使用这个映射map ,r :! bundle exec ruby %<CR>
来轻松运行我正在编辑的测试文件。不过我也这样做:
map ,t :! bundle exec ruby test/integration/some_integration_test.rb<CR>
这样我可以在处理其他文件时使用两个键来运行此特定集成测试。它有硬编码路径,当我移动到应用程序的其他区域时,我用另一个集成测试文件路径键入上面的命令。
如何制作自动创建此类映射的命令?
map ,T :map ,t :! bundle exec ruby %<CR>
无法正常工作,因为在创建映射时它不会扩展%,因此,t将始终运行当前文件(而我希望它在创建映射时运行我正在编辑的文件)。
[编辑]: 从答案中略微调整解决方案:
nnoremap ,r :! bundle exec ruby %<CR>
nnoremap ,T :let g:testfile = expand('%:p')
nnoremap ,t :! bundle exec ruby <C-r><C-r>=g:testfile<CR><CR>
,r
始终在光标,T
将当前文件路径保存在变量中以便稍后运行,t
运行先前存储的文件路径答案 0 :(得分:3)
只需在变量中保存当前文件名(最好使用完全绝对路径以免受当前目录的更改; :p
修饰符执行此操作),然后插入变量而不是{{1}通过%
:
<C-r>
PS:我使用:noremap ,r :let g:testfile = expand('%:p')<Bar>! bundle exec ruby %<CR>
:noremap ,t :! bundle exec ruby <C-r><C-r>=g:testfile<CR><CR>
,因为这通常更安全,应该是首选,除非您确实需要重新映射。
答案 1 :(得分:1)
execute ":nnoremap ,t :! bundle exec ruby ".shellescape(expand('%:p'))."<CR>"
创建一个,t
映射,该映射将在执行时对当前文件执行测试。
但每次你这样做都会失去之前的,t
。我不确定你想做什么。