Отступ Javascript в VIM

Я пытаюсь получить VIM с отступом Javascript с '=' и связанными с ним командами. Когда я пытаюсь сделать автоматический отступ, например:

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

Результат довольно абсурден:

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

Я установил set syntax=javascript, и я установил filetype в:

filetype detection:ON  plugin:ON  indent:ON

Хотя я пробовал каждую перестановку этого. Я пробовал каждую перестановку smartindent, autoindent и cindent, но ничто, кажется, не имеет правильного эффекта от предоставления Vim ожидаемого отступа. Я установил tabstop=4.

Я установил javascript.vim и IndentAnything, хотя они, похоже, не имеют никакого эффекта.

Я был бы очень благодарен за любые предложения относительно того, как получить Vim, отступающий должным образом в JavaScript.

Ответы

Ответ 1

О, человек, я просто потратил пару часов, выяснив ту же проблему.

Если у вас есть filetype indent on (что вы делаете), то где-то в файле может быть задано несколько разных параметров отступов. Если вы используете verbose set <option>?, вы можете увидеть, где он установлен и на что он установлен:

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

По умолчанию вы ожидаете увидеть только cindent, заданный файлом отступа по умолчанию:

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

Где $VIMRUNTIME - путь, который вы получаете при запуске :echo $VIMRUNTIME.

Все остальные не будут установлены, если вы не включите их (в вашем vimrc или плагине).

Для меня у меня был плагин (eclim), который устанавливал identexpr и вызывал эту проблему:

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

Ответ 2

Добавление двух закрывающих фигурных скобок и выбор всего блока с помощью vi{ обеспечит правильный автоматический отступ для меня в gvim 7.2 без плагинов. Возможно, вам захочется узнать, запутан ли ошибочный плагин, запустив vim с флагом --noplugins в командной строке. и повторите попытку.

Ответ 3

У меня была такая же проблема некоторое время назад, и решение было плагином "vim-javascript". Это пакет JavaScript для vim, предоставляющий плагины синтаксиса и отступа.

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

Установка очень проста.

Если вы используете pathogen, выполните следующие действия:

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

Если вы используете vundle, используйте следующие шаги:

Добавьте следующую строку в файл vimrc:

Plugin "pangloss/vim-javascript"

И установите его:

:so ~/.vimrc
:PluginInstall

Ответ 4

Я ненавижу говорить что-то бесполезное, как "Это работает для меня", но это так. Даже с отсутствием в моем .vimrc и всех плагинах я получаю правильный отступ.

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

Вы пытались загрузить vim с помощью переключателя --noplugins и временно переместить/переименовать свой .vimrc, чтобы убедиться, что он все еще не работает? Я подозреваю, что другой параметр в вашем .vimrc или другом плагине может вызвать конфликт.

Ответ 5

Для меня это работает (не очень полезное утверждение, я знаю;-)). Я полагаю, что тип файла не обнаружен правильно.

Что делает

 :set filetype

говорят? Он должен сообщать "javascript".

[EDIT] Подсказка: обратите внимание, что есть опция "filetype" и команда под названием filetype. Чтобы получить справку по опции, выполните: help 'filetype' для команды do: help: filetype.

Ответ 6

У меня были проблемы на днях с MacVim 7.2 и Lua файлом, который не был бы отступом правильно - даже после использования set syntax, set filetype и filetype indent on он не отступал от файла правильно.

Я обнаружил добавление:

filetype plugin indent on

в мой файл .gvimrc решил проблему, по крайней мере, для меня. YMMV.

Ответ 7

Для меня наличие более одного символа (символ перед символом "{" в той же строке, казалось, изменило алгоритм отступа, используемый "=". Удаление одного из "(" казалось, исправить "= для всех частей файла, кроме других областей областей" {...}", которые также имели несколько "(" в строке открытия.

Я использую vim 7.4 в lubuntu