Folder specific settings in Vim

If you are like me, you have a structured filesystem for your different jobs. E.g. one for your own projects, one for customers, one for learnings, etc. This allows you to set specific options within Vim related to the projects or customers. E.g. if typo3 uses tabs instead of spaces you can configure that for Projects/typo3/**. And if you want to ignore certain folders like build within Sphinx installations, but not within e.g. typo3 projects, you can do it like the following.

My structure looks like the following:

~/Projects
├── docker
│   ├── jenkins
│   ├── phpcs
│   └── t3-sphinx
├── flow
│   ├── Quickstart
│   ├── docs
│   ├── flow-development-collection
│   └── tutorial
├── opensource
│   └── PHP_CodeSniffer.wiki
├── own
│   ├── sphinx
│   └── website
├── typo3
│   ├── docs
│   ├── extensions
│   └── tools
└── work
    ├── one-company
    │   ├── customer
    │   ├── packages
    │   └── typo3-extensions
    └── one-customer
        ├── example_t3_extension
        └── example_t3_installation

Current structure of Vim configuration

First let me show you my setup of Vim configuration. The main goal is to keep all files small and structure the settings. Therefore I’ve created a new folder configs where further files are used to group options, e.g. for mappings or plugins. The folder structure looks like:

 ~/.vim
 ├── after
 │   └── ftplugin
 ├── autoload
 ├── bundle
 ├── colors
 ├── configs
 |   ├── autocommands
 |   │   ├── apache.vim
 |   │   ├── basics.vim
 |   │   ├── typo3.vim
 |   │   ├── vdebug.vim
 |   │   └── vim.vim
 |   ├── folderspecific
 |   │   ├── one-customer.vim
 |   │   └── sphinx.vim
 |   └── plugins
 |       ├── ctrlp.vim
 |       ├── nerdtree.vim
 |       ├── php-getter-setters.vim
 |       ├── plantuml.vim
 |       ├── syntastic.vim
 |       ├── tagbar.vim
 |       ├── undotree.vim
 |       └── vdebug.vim
 ├── ftdetect
 ├── sessions
 ├── snippets
 ├── spell
 ├── syntax
 └── view

And the files are included from within my ~/.vimrc:

    " Load plugin configurations
    runtime! configs/plugins/*.vim
    " Load path specific configuration to override everything else
    runtime! configs/folderspecific/*.vim
    " Load at last, as this are modes like "day" or "present" which will
    " overwrite all existing configuration
    runtime! configs/modes/*.vim

nmap <leader>sp :call <SID>SynStack()<CR>

This way I can place further configuration in the files and don’t mess up my main ~/.vimrc. The configs/folderspecific/*.vim contains the configurations for specific folders. As Projects are nothing more then folders in my setup, it can be as specific as for one projects, one file or just one customer.

Example of specific configuration

The setup for sphinx looks like ~/.vim/configs/folderspecific/sphinx.vim:

" Special configuration for sphinx documentations
augroup sphinxFolder
    autocmd!
    " Ignore build folder for grepping
    autocmd BufRead,BufNewFile **/Projects/own/website/*,**/sphinx/*,**/Documentation/* execute ':let g:ctrlp_user_command = g:dsiepmann_user_command . " --ignore \"build\""'
augroup END

This allows me to exclude the build folder from ctrlp Plugin search. But just for the matching folders.

And for a customer with PHP and PSR-2 it looks like ~/.vim/configs/folderspecific/one-customer.vim:

" Special configuration for customer with PSR-2
augroup customerwithpsr2
    autocmd!
    " Define PSR2 for PHP Code Sniffer as default
    autocmd BufRead,BufNewFile **/one-customer/* execute ":let g:syntastic_php_phpcs_args='--report=csv --standard=PSR2'"
augroup END

Source

The hint to use autocmd was given on Stackoverflow. There are also other ways, as often, like plugins or the built in exrc. All of them are mentioned on Stackoverflow.