En resumen
Hay algunas formas de hacer esto, de las cuales la mayoría se han sugerido, pero pensé en resumirlas con dos más:
- Vimrc por directorio: tiene la desventaja de que Vim debe iniciarse en el directorio correcto: si su proyecto está dentro
~/project1y lo tiene ~/project1/.vim.customy lo hacecd ~ ; vim project1/file.c , no se encontrarán las configuraciones personalizadas.
- Modelines: muy eficaz, pero tiene la desventaja de tener que agregarlos a todos los archivos (y recuerde agregarlos a los archivos nuevos)
- Autocomandos específicos del directorio: esto es muy efectivo
- Busque un encabezado específico en el archivo (ver más abajo): este es el que más he usado en el pasado cuando trabajaba para diferentes empresas o en proyectos con nombres claros
- Vimrc por directorio que se comprueba cuando se abre el archivo (ver más abajo). Otro bastante fácil de implementar, especialmente si el código de su proyecto está todo en un solo lugar.
Buscando un encabezado
En muchas organizaciones, hay un encabezado estándar (con un aviso de derechos de autor y el nombre del proyecto, etc.) en la parte superior de cada archivo fuente. Si este es el caso, puede hacer que Vim escanee automáticamente las primeras (por ejemplo) 10 líneas del archivo en busca de una palabra clave. Si lo encuentra, puede cambiar su configuración. Modifiqué esto para hacerlo más simple que el formulario que uso (que hace muchas otras cosas), pero cree un ~/.vim/after/filetype.vim(si aún no tiene uno) y agregue algo como esto:
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
Siempre que se abre un archivo de cualquier tipo y se establece el tipo de archivo (la au FileType *línea), ConfigureFiletypesse llama a la función. Esto verifica si el tipo de archivo está en la lista de tipos de archivos asociados con el grupo actual (GROUPNAME), en este caso 'c', 'cpp', 'vhdl' o 'c.doxygen'. Si es así, llama a CheckForGROUPNAMECode (), que lee las primeras 10 líneas del archivo y si contienen GROUPNAME, realiza alguna personalización. Además de configurar las pestañas de expansión o lo que sea, esto también cambia la barra de estado para mostrar claramente el nombre del grupo para que sepa que ha funcionado de un vistazo.
Comprobación de la configuración al abrir
Al igual que la sugerencia de JS Bangs, tener un archivo de configuración personalizado puede ser útil. Sin embargo, en lugar de cargarlo en vimrc, considere algo como esto, que verificará cuando se abra un archivo .c para un .vim.custom en el mismo directorio que el archivo .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