我在 Vim 中的典型日常工作流程涉及两个垂直窗格;左边是生产代码,右边是测试。
我经常切换语言(和测试框架),所以我喜欢在每个会话中创建一个新的映射来运行我的测试代码。假设我正在做一些 Ruby 项目,并且我正在开发一个类lib/importer.rb
。随附的规范位于 中spec/lib/importer_spec.rb
。
为了创建运行规范的映射,我将重点关注显示规范的窗格,然后输入以下内容:
:nnoremap -g :!rspec %<cr>
注意:我使用连字符/减号作为我的引导键。
这有效,但前提是当我点击 时 spec 窗格处于焦点状态-g。如果 production 窗格处于焦点状态并且我点击了映射,rspec将尝试运行生产代码,但这没有意义。
为了解决这个问题,我可以将绝对路径写入 spec 文件:
:nnoremap -g :!rspec spec/lib/importer_spec.rb<cr>
虽然写起来有点麻烦,但这种方法是可行的。
在读的时候实用 Vim昨晚,我意识到在命令模式下您可以使用%
扩展 - 您写入%
然后点击tab,百分比将被替换为当前聚焦窗格中文件的绝对路径。
如果我这样做:
:!rspec %
…然后点击tab,我得到了这个:
:!rspec spec/lib/importer_spec.rb
这太棒了!但是,如果我这样做:
:nnoremap -g :!rspec %
…然后点击tab,我得到了这个:
:nnoremap -g :!rspec %^I
我是个好人,我纳税。为什么这种事会发生在我身上?
答案1
默认情况下,命令补全在映射中无法识别(并记录在宏中)。您可以在 obscure 选项中定义替代键'wildcharm'
并使用它。但是,可以以更简单、更直接的方式插入当前文件名。无需补全%
,只需通过 插入等效的 Vimscript 表达式即可<C-r>
:
:nnoremap -g :!rspec <C-r>=expand('%')<cr><cr>
PS:妥善处理全部文件名种类,另外使用shellescape()
:
:nnoremap -g :!rspec <C-r>=shellescape(expand('%'), 1)<cr><cr>
PPS:我希望你不是每次都手动输入映射,而是使用文件类型插件或者:autocmd
为测试缓冲区自动定义这一点。我绝对建议以这种方式实现自动化。