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 :-)