Javascript indentation in VIM

Brian M. Hunt picture Brian M. Hunt · Jul 11, 2010 · Viewed 12.4k times · Source

I'm trying to get VIM to indent Javascript with the '=' and related commands. When I try to auto indent the following, for example:

   new function($) {
     $.fn.setCursorPosition = function(pos) { 
       if ($(this).setSelectionRange) {
         $(this).setSelectionRange(pos, pos);
       } else if ($(this).createTextRange) {
         var range = $(this).createTextRange();
         range.collapse(true);
         range.moveEnd('character', pos);
         range.moveStart('character', pos);
         range.select();
       }

The result is the rather absurd:

       new function($) {
       $.fn.setCursorPosition = function(pos) {
       if ($(this).setSelectionRange) {
       $(this).setSelectionRange(pos, pos);
       } else if ($(this).createTextRange) {
       var range = $(this).createTextRange();
       range.collapse(true);
       range.moveEnd('character', pos);
       range.moveStart('character', pos);
       range.select();
       }

I've set set syntax=javascript, and I've set filetype to:

filetype detection:ON  plugin:ON  indent:ON

Though I've tried every permutation of this. I've tried every permutation of smartindent, autoindent, and cindent, but nothing seems to have the correct effect of giving Vim the expected indentation. I've set tabstop=4.

I've installed javascript.vim, and IndentAnything, though they don't seem to have any effect.

I'd be very grateful for any suggestions as to how to get Vim indenting properly in JavaScript.

Answer

Dean picture Dean · Sep 7, 2013

Oh man, I just spent a couple of hours figuring out the same problem.

If you have filetype indent on (which you do), then a few different indent settings may be set by a file somewhere. If you use verbose set <option>? you can see where it's being set and what it's set to:

:verbose set autoindent?
:verbose set cindent?
:verbose set smartindent?
:verbose set indentexpr?

By default, you'd only expect to see cindent set by the default indent file:

cindent
Last set from $VIMRUNTIME/indent/javascript.vim

Where $VIMRUNTIME is the path you get when you run :echo $VIMRUNTIME.

All of the others wouldn't be set unless you enable them (in your vimrc or a plugin).

For me, I had a plugin (eclim) that was setting identexpr and causing this issue:

identexpr=EclimGetJavascriptIndent(V:lnum)
Last set from ~/.vim/bundle/eclim/indent/javascript.vim