基于绝对路径+文件名的规则

时间:2013-08-06 03:32:39

标签: vim scripting

我处理一个包含各种代码样式的大型代码库(制表符与空格等)。对于间距问题,我想根据文件的路径自动执行一些vim设置。理想情况下,我想做一些像

这样的事情
if (absolute_path.match(".*/kernel")) then 
   use_tabs()
else if (abslute_path.match(".*/someuserspace_folder/*")) then
   use_spaces()
end

关于这个主题的Google搜索让我创造了这个弗兰肯斯坦:

function! SetIndentSpaces()
        set tabstop=4
        set shiftwidth=4
        set expandtab
        echo "Using spaces for indentation"
endfunction

function! SetIndentTabs()
        set tabstop=8
        set shiftwidth=8
        set noexpandtab
        echo "Using tabs for indentation"
endfunction

autocmd BufEnter,BufRead */kernel/*.\(c|h\) call SetIndentTabs() 
autocmd BufEnter,BufRead */userpace_code/*.\(cpp|c|h\) call SetIndentSpaces()

但是,我没有看到我的触发器被调用。我猜我的正则表达式是错误的,但我找不到任何方法验证它(读:我在vim吮吸)。

有人发现了我做错的事情吗?

1 个答案:

答案 0 :(得分:1)

我认为您需要做的就是使用|转义\|

autocmd BufEnter,BufRead */kernel/*.\(c\|h\) call SetIndentTabs() 
autocmd BufEnter,BufRead */userpace_code/*.\(cpp\|c\|h\) call SetIndentSpaces()

此外,您应该将set softtabstop=8(或4)添加到缩进功能中。通常你想要tabstop,shiftwidth和softtabstop是相同的。


根据:h file-pattern(和Ingo Karkat),您应该使用以下行代替

autocmd BufEnter,BufRead */kernel/*.{c,h} call SetIndentTabs() 
autocmd BufEnter,BufRead */userpace_code/*.{cpp,c,h} call SetIndentSpaces()

文件模式匹配使用的模式

                            *file-pattern*
The pattern is interpreted like mostly used in file names:
    { } like \( \) in a |pattern|
    ,   inside { }: like \| in a |pattern|