Javascript indentation in VIM

天涯浪子 提交于 2019-12-02 23:02:33

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
Frederico Cabral

I had the same problem some time ago and the solution was the plugin "vim-javascript". It is JavaScript bundle for vim providing syntax and indent plugins.

https://github.com/pangloss/vim-javascript

The installation is very simple.

If you are using pathogen, use the follow steps:

  cd ~/.vim/bundle
  git clone https://github.com/pangloss/vim-javascript.git

If you are using vundle use the follow steps:

Add the follow line to your vimrc file:

Plugin "pangloss/vim-javascript"

And install it:

:so ~/.vimrc
:PluginInstall

Adding the two closing braces and selecting the entire block with vi{ provided proper automatic indentation for me in gvim 7.2 with no plugins. You may want to see if an errant plugin is messing it up by starting vim with the --noplugins flag on the command line. and try again.

I hate to say something unhelpful like "It works for me", but it does. Even with nothing in my .vimrc and all plugins off, I get the correct indentation.

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();
        }

Have you tried loading vim with the --noplugins switch and temporarily moving/renaming your .vimrc to see if it still doesn't work? I suspect another setting in your .vimrc or another plugin may be causing the conflict.

For me it works (not very helpful statement, I know ;-) ). I suppose that the filetype is not detected correctly.

What does

 :set filetype

say? It should report "javascript".

[EDIT] Hint: Please note that there is an option called 'filetype' and a command called :filetype. To get help for the option do :help 'filetype' for the command do :help :filetype.

I was having problems the other day with MacVim 7.2 and a Lua file that wouldn't indent correctly -- even after using set syntax, set filetype and filetype indent on, it wasn't indenting the file correctly.

I discovered adding:

filetype plugin indent on

to my .gvimrc file solved the issue, at least for me. YMMV.

For me the presence of more than one '(' character before the '{' character on the same line seemed to change the indentation algorithm used by '='. Removing one of the '(' seemed to fix '=' for all parts of the file except other scope regions '{...}' which also had multiple '(' on the opening line.

I'm using vim 7.4 in lubuntu

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!