6

我使用https://github.com/cakebaker/scss-syntax.vim在 vi​​m 上突出显示SCSS(或SASS)文件的语法,这对于语法突出显示非常有效。但是,该插件没有附带缩进文件,并且在编写时遇到了麻烦。

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

在此处输入图像描述

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

在此处输入图像描述

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

set cindent

set nocindent

set autoindent

set smartindent

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

set tabstop=2

set shiftwidth=2

set expandtab

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

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

4

1 回答 1

10

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

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所在的位置(如果您在 Windows 上,请替换为路径。something~/.vimvimfiles

您可能还希望将其粘贴在文件的开头(但前提是没有可能首先加载的其他缩进声明):

" Only load this indent file when no other was loaded.
if exists("b:did_indent")
    finish
endif
let b:did_indent = 1
于 2011-01-28T14:45:54.367 回答