Vim 命令模式百分比扩展

Vim 命令模式百分比扩展

我在 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为测试缓冲区自动定义这一点。我绝对建议以这种方式实现自动化。

相关内容