我已经成功地理解了我的语言突出显示的语法,但我不确定如何让它自动缩进我的代码。语言本身有点像Lisp,但它使用括号[]
和括号()
作为分隔符。生成的代码缩进应如下所示:
[foo [bar baz] [qux
[do a thing]
[more doing a thing]
[^ ()
; some stuff here
[foobar]]]]
[back to here]
基本上,每个未闭合的括号或括号应该将该行缩进两个空格。关闭所述分隔符应该将以下行减少相同的数量。
我调查了autoindent
,但这似乎不足以让我想做什么,除非我遗漏了什么。替代方案indentexpr
似乎更有希望,但我认为我不明白如何使用它。
如何为我的语法获得一个有效的缩进系统?
答案 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的空格量的一半。)