如何在vim autocmd中编写一个从文件名中排除字符串的模式

时间:2012-07-20 22:30:22

标签: vim autocmd

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

E.g。为所有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)下即可。只要打开spec文件,常规ruby文件就会丢失* .rb映射。

2 个答案:

答案 0 :(得分:1)

在这种情况下,反转autocommands并添加<buffer>可以获得所需的行为,即:

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

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

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

另外,如果您将action2设置为逗号:,那么您的映射应如下所示:

<Leader>

答案 1 :(得分:0)

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

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

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