Как я могу определить отступ в VIM на основе вьющихся скоб?

StackOverflow https://stackoverflow.com/questions/4829244

Вопрос

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

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

enter image description here

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

enter image description here

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

set cindent

set nocindent

set autoindent

set smartindent

и попытался использовать код из Ключ TAB == 4 пространства и автоматические после вьющихся скобок в VIM , включая

set tabstop=2

set shiftwidth=2

set expandtab

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

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

Это было полезно?

Решение

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top