Как определить отступы в vim на основе фигурных скобок? - PullRequest
6 голосов
/ 28 января 2011

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

Я бы хотел, чтобы отступ был таким:

enter image description here

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

enter image description here

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

set cindent

set nocindent

set autoindent

set smartindent

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

set tabstop=2

set shiftwidth=2

set expandtab

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

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

1 Ответ

10 голосов
/ 28 января 2011

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

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
...