2

背景:我一直在使用此映射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运行之前存储的文件路径
4

2 回答 2

3

只需将当前文件名(最好使用完整的绝对路径以免受对当前目录的更改;:p修饰符会这样做)在变量中,然后插入变量而不是%via <C-r>

: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>

PS:我使用:noremap,因为这通常更安全,应该是首选,除非你真的需要重新映射。

于 2012-09-25T09:31:39.823 回答
1
execute ":nnoremap ,t :! bundle exec ruby ".shellescape(expand('%:p'))."<CR>"

创建一个,t映射,该映射将在执行时对当前文件执行您的测试。

但每次你这样做,你都会失去前一个,t。我不确定这就是你想要做的。

于 2012-09-25T09:34:05.940 回答