如何在基于大括号的vim中定义缩进?

我使用https://github.com/cakebaker/scss-syntax.vim语法突出显示vim上的SCSS (或SASS )文件,这对于语法突出显示非常有效。 但是,该插件没有附带缩进文件,因此无法写入缩进文件。

我想设置缩进看起来像这样:

在这里输入图像描述

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

在这里输入图像描述

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

set cindent

set nocindent

set autoindent

set smartindent

并尝试使用Tab key == 4空格中的代码和Vim中的大括号之后的自动缩进,其中包括

set tabstop=2

set shiftwidth=2

set expandtab

...但嵌套大括号缩进似乎从来没有工作。

我相信我可能希望编写一个自定义缩进文件,而我所需要的只是基于带嵌套层的花括号的缩进。 我应该怎么做呢? 如果某人有类似语法的文件类型的缩进文件,那也会很好。


这是一个快速入侵,基于内置的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文件类型是您的文件类型(如果您在Windows上,则将~/.vim替换为vimfiles的路径。

您可能还想在文件的开始处粘贴此文件(但只有在没有其他可能首先加载的缩进声明时):

" Only load this indent file when no other was loaded.
if exists("b:did_indent")
    finish
endif
let b:did_indent = 1
链接地址: http://www.djcxy.com/p/28643.html

上一篇: How do I define indents in vim based on curly braces?

下一篇: Redefine tab as 4 spaces