Using Google Closure style + linter with Vim
I've started working in some projects that build upon Google Closure's framework. Trying to do things properly proper, and hoping to avoid messing with my Vim configuration, I installed Sublime Text and configured it to use Closure's style and linter, but I was constantly fighting with Sublime Text and didn't feel comfortable with it at all.
So I decided to invest a little bit of time in tweaking Vim to make it work with these style rules but at the same time not to destroy my configuration.
Before I detail how I did it, compare the two configurations:
- My default configuration was: tabs when pressing TAB, four space indentation, and JSHint.
- Closure requires: spaces, two spaces indentation, a maximum of 80 character lines, and gjslint (its own linter).
As you can see, they are the total opposite. How could I do this without adding 'hint' headers to every file specifying which settings to use? I finally devised this simple solution: I created a function to enter "Closure mode"! Whenever I need to write Closure-compliant code, I exit insert mode and type
:call UseClosureStyle()
That executes the function that changes everything:
function! UseClosureStyle()
set tabstop=2
set softtabstop=2
set shiftwidth=2
set expandtab
" add a visual guide line at the 80th column
set textwidth=80
set colorcolumn=+1
hi ColorColumn guibg=#eeeeee ctermbg=246
" tell syntastic to use gjslint for checking JavaScript's syntax
let g:syntastic_javascript_checkers = [ 'gjslint' ]
endfunction
Once that is run, my Vim is "ruined", i.e. my whitespace settings are lost and I'd need to change each value manually back to where they were if I wanted to edit some code in "my style". That, or open a new instance of Vim.
There's evidently room for improvement: abstract the function even more so I can toggle between both configurations (mine and Closure's), and map it to a certain keystroke combination, and even show a message in the status bar saying what is the current configuration, so if you have any idea of how to do that, feel free to experiment with the code :-)