Отступ 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.


person Brian M. Hunt    schedule 11.07.2010    source источник
comment
Боковое примечание: установка javascript.vim и IndentAnything решила проблему для меня, когда vim правильно отступал только некоторые строки.   -  person Wulfhart    schedule 07.12.2012


Ответы (7)


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

Если у вас есть 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
person Dean    schedule 07.09.2013
comment
Спасибо за это! Вы также помогли мне найти глючный плагин. :) - person imiric; 22.07.2014
comment
Вау, спасибо. Вы только что помогли мне отладить необъяснимо сломанный vim. Он не будет автоматически отступать в файлах JS. Это оказался бандл на .vim/bundle/vim-jsx (который мне просто пришлось удалить, так как я только что перешел на github. com/othree/yajs.vim в любом случае). Спасибо. Я хочу угостить тебя пивом, если когда-нибудь представится возможность. - person Artur Sapek; 04.10.2016

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

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

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

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

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

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

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

Plugin "pangloss/vim-javascript"

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

:so ~/.vimrc
:PluginInstall
person Frederico Cabral    schedule 18.06.2014
comment
Этот плагин работает очень хорошо. FWIW, у меня возникла проблема, несмотря на то, что этот плагин был установлен, и потому что другой плагин (vim-polyglot) заменял его и вызывал проблемы. Так что, если у кого-то все еще есть проблемы после установки, проверьте другие ваши плагины. - person asfallows; 29.01.2019

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

person sleepynate    schedule 11.07.2010

Я ненавижу говорить что-то бесполезное, например: «Это работает для меня», но это работает. Даже если в моем .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 или другом плагине может быть причиной конфликта.

person michaelmichael    schedule 11.07.2010

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

Что значит

 :set filetype

сказать? Он должен сообщить «javascript».

[РЕДАКТИРОВАТЬ] Подсказка: обратите внимание, что есть опция под названием «тип файла» и команда под названием :filetype. Чтобы получить справку по опции do :help 'filetype' для команды do :help :filetype.

person Habi    schedule 12.07.2010
comment
@Хаби: Спасибо. Было бы обидно пропустить это, но, увы, :set filetype это javascript. :) - person Brian M. Hunt; 12.07.2010
comment
@ Брайан М. Хант: Хм, может быть, отступ равен 0 (я не знаю, возможно ли это вообще, но если это возможно, это может быть причиной вашей проблемы). Что говорят :set shiftwidth и :set cinoptions? - person Habi; 12.07.2010
comment
@Хаби: :set shiftwidth это shiftwidth=4, а set cinoptions это cinoptions=. хм. - person Brian M. Hunt; 13.07.2010
comment
@ Брайан М. Хант: То же самое. Странный. Работает ли '=' для других языков, например C? - person Habi; 13.07.2010
comment
@ Брайан М. Хант: Еще одна идея: что говорит «: set equalprg»? Его значение должно быть по умолчанию. - person Habi; 14.07.2010
comment
Да, :set equalprg возвращает equalprg=. - person Brian M. Hunt; 14.07.2010

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

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

filetype plugin indent on

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

person Blair Holloway    schedule 12.07.2010
comment
Спасибо за ответ и рад, что вы решили это. К сожалению, это не помогло. - person Brian M. Hunt; 13.07.2010

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

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

person theoski    schedule 06.10.2016