我处理一个包含各种代码样式的大型代码库(制表符与空格等)。对于间距问题,我想根据文件的路径自动执行一些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吮吸)。
有人发现了我做错的事情吗?
答案 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|