Как определить отступы в vim на основе фигурных скобок?

Я использую https://github.com/cakebaker/scss-syntax.vim для подсветка синтаксиса файлов SCSS (или SASS) в vim, что очень хорошо работает для подсветки синтаксиса. Однако у плагина нет файла с отступами, и у меня возникли проблемы с его написанием.

Я бы хотел, чтобы отступ выглядел так:

введите описание изображения здесь

Однако, если я сделаю gg=G, я получу:

введите описание изображения здесь

Подозреваю, что он не понимает вложенных отступов на основе фигурных скобок. Я пробовал все разные комбинации

set cindent

set nocindent

set autoindent

set smartindent

и попытался использовать код из вкладки key == 4 пробела и автоматический отступ после фигурных скобок в Vim, включая

set tabstop=2

set shiftwidth=2

set expandtab

... но отступы вложенных фигурных скобок никогда не работают.

Я считаю, что я мог бы захотеть написать собственный файл отступа, и все, что мне нужно, это отступ на основе фигурных скобок с вложенными уровнями. Как мне это сделать? Если у кого-то есть файл отступов для типов файлов с аналогичным синтаксисом, это тоже будет здорово.


person chibicode    schedule 28.01.2011    source источник


Ответы (1)


Это быстрый прием, основанный на встроенном коде отступов Perl (в indent/perl.vim). Надеюсь, вы сможете использовать его, чтобы получить то, что хотите делать. См. Более подробные комментарии либо в коде отступов perl, либо в другом из файлов в каталоге отступов для получения более подробной информации.

setlocal indentexpr=GetMyIndent()
function! GetMyIndent()
    let cline = getline(v:lnum)

    " Find a non-blank line above the current line.
    let lnum = prevnonblank(v:lnum - 1)
    " Hit the start of the file, use zero indent.
    if lnum == 0
        return 0
    endif
    let line = getline(lnum)
    let ind = indent(lnum)

    " Indent blocks enclosed by {}, (), or []
    " Find a real opening brace
    let bracepos = match(line, '[(){}\[\]]', matchend(line, '^\s*[)}\]]'))
    while bracepos != -1
        let brace = strpart(line, bracepos, 1)
        if brace == '(' || brace == '{' || brace == '['
            let ind = ind + &sw
        else
            let ind = ind - &sw
        endif
        let bracepos = match(line, '[(){}\[\]]', bracepos + 1)
    endwhile
    let bracepos = matchend(cline, '^\s*[)}\]]')
    if bracepos != -1
        let ind = ind - &sw
    endif

    return ind
endfunction

Сохраните этот файл как ~/.vim/indent/something.vim, где something - ваш тип файла (замените ~/.vim на путь к vimfiles, если вы работаете в Windows.

Вы также можете вставить это в начало файла (но только если нет другого объявления отступа, которое может быть загружено первым):

" Only load this indent file when no other was loaded.
if exists("b:did_indent")
    finish
endif
let b:did_indent = 1
person DrAl    schedule 28.01.2011
comment
Вы, сударь, классные !! Это спасло мне день! - person Kulbir Saini; 09.09.2012