总结
有几种方法可以做到这一点,其中大多数已经被建议,但我想我应该用两个额外的方法来总结它们:
- Per-directory vimrc - 缺点是 Vim 必须在正确的目录中启动:如果您的项目在
~/project1 并且您有 ~/project1/.vim.custom 并执行 cd ~ ; vim project1/file.c,将找不到自定义设置。
- 模型 - 非常有效,但缺点是需要将它们添加到所有文件中(并记得将它们添加到新文件中)
- 特定于目录的自动命令 - 这非常有效
- 扫描文件中的特定标题(见下文) - 这是我过去为不同公司或明确命名的项目工作时使用最多的标题
- 打开文件时检查每个目录的 vimrc(见下文)。另一个相当容易实现的方法,尤其是当您的项目代码都在一个地方时。
扫描标题
在许多组织中,每个源文件的顶部都有一个标准标题(带有版权声明和项目名称等)。如果是这种情况,您可以让 Vim 自动扫描文件的前(例如)10 行以查找关键字。如果找到它,它可以更改您的设置。我对其进行了修改,使其比我使用的表单更简单(它可以做很多其他事情),但是创建一个~/.vim/after/filetype.vim(如果你还没有的话)并添加如下内容:
au FileType * call <SID>ConfigureFiletypes(expand("<amatch>"))
" List of file types to customise
let s:GROUPNAMETypes = ['c', 'cpp', 'vhdl', 'c.doxygen']
func! <SID>CheckForGROUPNAMECode()
" Check if any of the first ten lines contain "GROUPNAME".
" Read the first ten lines into a variable
let header = getline(1)
for i in range(2, 10)
let header = header . getline(i)
endfor
if header =~ '\<GROUPNAME\>'
" Change the status line to make it clear which
" group we're using
setlocal statusline=%<%f\ (GROUPNAME)\ %h%m%r%=%-14.(%l,%c%V%)\ %P
" Do other customisation here
setlocal et
" etc
endif
endfunc
func! <SID>ConfigureFiletypes(filetype)
if index(s:GROUPNAMETypes, a:filetype) != -1
call <SID>CheckForGROUPNAMECode()
endif
endfunc
只要打开任何类型的文件并设置文件类型(au FileType * 行),就会调用 ConfigureFiletypes 函数。这将检查文件类型是否在与当前组 (GROUPNAME) 关联的文件类型列表中,在本例中为“c”、“cpp”、“vhdl”或“c.doxygen”。如果是,它调用 CheckForGROUPNAMECode(),它读取文件的前 10 行,如果它们包含 GROUPNAME,它会进行一些自定义。除了设置 expandtabs 或其他内容外,这还会更改状态栏以清楚地显示组名,以便您一眼就知道它的工作原理。
打开时检查配置
很像 JS Bangs 的建议,拥有一个自定义配置文件会很有用。但是,不要在 vimrc 中加载它,而是考虑这样的事情,它将检查何时为 .vim.custom 与 .c 文件在同一目录中打开 .c 文件。
au BufNewFile,BufRead *.c call CheckForCustomConfiguration()
function! CheckForCustomConfiguration()
" Check for .vim.custom in the directory containing the newly opened file
let custom_config_file = expand('%:p:h') . '/.vim.custom'
if filereadable(custom_config_file)
exe 'source' custom_config_file
endif
endfunction