Vim has been my primary text editor for more than 15 years, but even though I use it on a daily basis, my configuration hasn’t changed much over time. When I set up a new workstation, I stumbled upon the filetype plugin that I wasn’t aware of. Using this plugin, you can import different vim configuration files depending on the type of the file you’re editing.
My configuration has always been modularized, but until recently, I used the low-level autocmd feature to config source files depending on the type of the file I was editing. Here’s how it looked in my vimrc
:
autocmd BufNewFile,BufRead *.[ch] source ~/.vim/vimrc-c autocmd BufNewFile,BufRead *.py source ~/.vim/vimrc-python autocmd BufNewFile,BufRead *.xml source ~/.vim/vimrc-xml autocmd BufNewFile,BufRead *.html source ~/.vim/vimrc-html ...
I was able to clean that up a bit using the filetype plugin. But first, the plugin needs to be enabled in the main vimrc
file:
filetype plugin on
The plugin uses file type detection that may also scan the beginning of the file to figure out its type. The built-in detection routines are more robust than my simple file name checks.
For each type of file you work with, you place a configuration file in ~/.vim/after/ftplugin/TYPE.vim
, where TYPE
is one of vim’s supported file types. You can get the full list from $VIMRUNTIME/ftplugin/
. Run ":echo $VIMRUNTIME" in vim if you don’t know the location of vim’s runtime directory (on my system, it’s /usr/share/vim/vim74/
).
When programming Python, for example, I don’t ever want to use tab characters, and I indent code blocks using four spaces. To make this happen, I created the file ~/.vim/after/ftplugin/python.vim
with the following content:
set tabstop=8 set shiftwidth=4 set softtabstop=4 set expandtab
There’s a lot more to the filetype plugin than discussed here. See the documentation for more advanced use cases, like writing your own autodetection mechanisms.