让vim自动缩进这种语法

时间:2012-12-05 03:52:00

标签: vim indentation auto-indent

我已经成功地理解了我的语言突出显示的语法,但我不确定如何让它自动缩进我的代码。语言本身有点像Lisp,但它使用括号[]和括号()作为分隔符。生成的代码缩进应如下所示:

[foo [bar baz] [qux
  [do a thing]
  [more doing a thing]
  [^ ()
    ; some stuff here
    [foobar]]]]
[back to here]

基本上,每个未闭合的括号或括号应该将该行缩进两个空格。关闭所述分隔符应该将以下行减少相同的数量。

我调查了autoindent,但这似乎不足以让我想做什么,除非我遗漏了什么。替代方案indentexpr似乎更有希望,但我认为我不明白如何使用它。

如何为我的语法获得一个有效的缩进系统?

1 个答案:

答案 0 :(得分:3)

您是否尝试过'lisp'选项?它产生

[foo [bar baz] [qux
                 [do a thing]
                 [more doing a thing]
                 [^ ()
                    ; some stuff here
                    [foobar]]]]
[back to here]

关于你的例子。

您还可以构建自己的indentexpr。很简单就是

if exists("b:did_indent")
   finish
endif
let b:did_indent = 1
if exists('*shiftwidth')
    let s:shiftwidth=function('shiftwidth')
else
    function s:shiftwidth()
        return &shiftwidth
    endfunction
endif
function! YourLangIndent(lnum)
    if a:lnum==1
        return 0
    endif
    let line=getline(a:lnum-1)
    return indent(prevnonblank(a:lnum-1))+s:shiftwidth()*(len(substitute(line, '[^[]', '', 'g'))-len(substitute(line, '[^]]', '', 'g')))
endfunction
setlocal indentexpr=YourLangIndent(v:lnum)
let b:undo_indent='setlocal indentexpr<'

。结果如下:

[foo [bar baz] [qux
        [do a thing]
        [more doing a thing]
        [^ ()
            ; some stuff here
            [foobar]]]]
[back to here]

(对于&sw设置为4,&sw设置为2的空格量的一半。)