Коротко
Є декілька способів зробити це, з яких пропонувались більшість, але я думав підсумувати їх двома додатковими:
- Vimrc для кожного каталогу - має той недолік, що Vim потрібно запускати у правильному каталозі: якщо ваш проект є,
~/project1а у вас є ~/project1/.vim.customі є cd ~ ; vim project1/file.c, користувацькі налаштування не будуть знайдені.
- Modelines - дуже ефективний, але має недолік необхідності додавати їх у всі файли (і пам’ятати про додавання їх до нових файлів)
- Спеціальні автокоманди каталогу - це дуже ефективно
- Шукайте певний заголовок у файлі (див. Нижче) - це той, який я найбільше використовував раніше, коли працював у різних компаніях або над чітко названими проектами
- 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, він виконує певну настройку. Окрім встановлення розширень або будь-чого іншого, це також змінює рядок стану, щоб чітко відображати назву групи, щоб ви знали, що це працює з першого погляду.
Перевірка конфігурації під час відкриття
Як і пропозиція JS Bangs, наявність власного конфігураційного файлу може бути корисним. Однак замість того, щоб завантажувати його у vimrc, розгляньте щось подібне, яке перевірить, коли файл .c відкривається для .vim.custom в тому ж каталозі, що і файл .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