vim命令将键映射到映射键的命令

时间:2012-09-25 09:06:14

标签: vim

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

2 个答案:

答案 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。我不确定你想做什么。