我在 vim 上使用 https://github.com/cakebaker/scss-syntax.vim 来语法突出显示 SCSS(或 SASS)文件,这对于语法突出显示非常有效。但是,该插件没有附带缩进文件,并且在编写缩进文件时遇到了麻烦。
我想将缩进设置为如下所示:
但是,如果我这样做gg=G
,我会得到:
我怀疑它不理解基于大括号的嵌套缩进。我尝试了所有不同的组合
设置cindent
设置nocindent
设置自动缩进
设置智能缩进
并尝试使用 Tab key == 4 spaces and auto-indent after curly braces in Vim 中的代码,包括
设置 tabstop=2
设置shiftwidth=2
设置展开选项卡
...但是嵌套大括号缩进似乎永远不起作用。
我相信我可能想要编写一个自定义缩进文件,而我所需要的只是基于具有嵌套级别的大括号的缩进。我该怎么办?如果有人有一个具有类似语法的文件类型的缩进文件,那就太好了。
最佳答案
这是一个基于内置 perl 缩进代码(在 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
其中 something
是您的文件类型(替换 ~/.vim
如果您使用的是 Windows,请使用 vimfiles
的路径。
您可能还想将其粘贴在文件的开头(但前提是没有可能首先加载的其他缩进声明):
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
关于vim - 如何在 vim 中基于大括号定义缩进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4829244/