关于缩进:如何根据花括号在vim中定义缩进?

How do I define indents in vim based on curly braces?

我使用https://github.com/cakebaker/scss-syntax.vim在vim上突出显示SCSS(或SASS)文件的语法,这非常适用于语法高亮。但是,该插件没有附加缩进文件,并且在编写插件时遇到问题。

我想将缩进设置为如下所示:

enter image description here

但是,如果我做gg=G,我得到:

enter image description here

我怀疑它不理解基于大括号的嵌套缩进。我尝试了所有不同的组合

set cindent

set nocindent

set autoindent

set smartindent

并试图使用Tab键== 4空格中的代码和Vim中的花括号后自动缩进,包括

set tabstop=2

<5233>

set expandtab

...但嵌套大括号缩进似乎永远不会起作用。

我相信我可能想写一个自定义缩进文件,我需要的是基于嵌套级别的大括号??的缩进。我该怎么办呢?如果某人有一个具有类似语法的文件类型的缩进文件,那么这也是很好的。


这是一个快速入侵,基于内置的perl缩进代码(在indent/perl.vim中)。 希望您可以使用它来获得您想要做的事情。 有关更多详细信息,请参阅perl缩进代码中的更详细注释或indent目录中的另一个文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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是您的文件类型(如果您在Windows上,则将~/.vim替换为vimfiles的路径。

您可能还想在文件的开头加上这个(但是只有在没有可能首先加载的其他缩进声明时):

1
2
3
4
5
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
    finish
endif
let b:did_indent = 1