0

我想为具有相同后缀的文件定义不同的映射。

例如,为所有 ruby​​ 文件定义一个通用映射,只为 rspec 文件定义一个不同的映射:

au BufNewFile,BufRead *_spec.rb map <Leader>t :w!<cr>:!rspec %<cr>
au BufNewFile,BufRead *.rb map <Leader>t :w!<cr>:!rspec %:r_spec.rb<cr>

上述解决方案在我的机器上不起作用,因为第二个au“覆盖”了第一个。

这种写法可以au吗?

更新:如果我只打开一个缓冲区,只需将最具体的(规范)一个放在通用的一个(rb)下面就可以了。一旦我打开一个规范文件,常规 ruby​​ 文件的 *.rb 映射就会丢失。

4

2 回答 2

1

在这种情况下,反转autocommands和添加<buffer>应该会让您获得所需的行为,即:

au BufNewFile,BufRead *.rb      map <buffer> ,t action2
au BufNewFile,BufRead *_spec.rb map <buffer> ,t action1

此排序将实现正确的每个文件名映射。

但是您应该注意,打开*_spec.rb文件时,两个 map命令都会运行:action1 action2. 这对于某些命令可能是不希望的。

此外,如果您设置<Leader>为 comma: ,,那么您的映射应如下所示:

au BufNewFile,BufRead *.rb      map <buffer> <Leader>t action2
au BufNewFile,BufRead *_spec.rb map <buffer> <Leader>t action1
于 2012-07-20T22:36:52.260 回答
0

最后做一个更具体的。换句话说,颠倒这两个命令的顺序。

au BufNewFile,BufRead *.rb map <buffer> ,t action2
au BufNewFile,BufRead *_spec.rb map <buffer> ,t action1

一个命令仍然覆盖另一个命令,但这样可以达到您想要的效果。请注意,您可能希望使用更具体的地图nmap,例如 或更好nnoremap,这样您就不会在其他模式下遇到此地图的问题。

于 2012-07-20T22:32:51.830 回答