1

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

if (absolute_path.match(".*/kernel")) then 
   use_tabs()
else if (abslute_path.match(".*/someuserspace_folder/*")) then
   use_spaces()
end

谷歌搜索这个主题让我创造了这个科学怪人:

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)。

有人在我做错的事情中发现了一些明显的东西吗?

4

1 回答 1

1

我认为您需要做的就是逃避|with \|

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|
于 2013-08-06T04:13:51.063 回答