В итоге
Есть несколько способов сделать это, большинство из которых было предложено, но я подумал, что резюмирую их двумя дополнительными:
- 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 рассмотрите что-то вроде этого, которое будет проверять, когда файл .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