首页 文章

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

提问于
浏览
6

我使用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 key == 4 spaces and auto-indent after curly braces in Vim中的代码,包括

set tabstop=2

set shiftwidth=2

set expandtab

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

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

1 回答

  • 10

    这是一个快速入侵,基于内置的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
    

相关问题