1

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

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

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

我已经调查过了autoindent,但对于我想做的事情似乎还不够,除非我遗漏了一些东西。替代方案 ,indentexpr似乎更有希望,但我认为我不明白如何使用它。

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

4

1 回答 1

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,设置为 2 的空格数量的一半&sw)。

于 2012-12-05T04:12:14.400 回答