1

強調表示するための言語の構文をvimに理解させることに成功しましたが、コードを自動的に適切にインデントする方法がわかりません。言語自体はややLispに似ていますが、区切り文字として角かっこ[]と両方を使用します。()結果のコードインデントは次のようになります。

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

基本的に、閉じられていない角かっこまたは括弧はそれぞれ、行を2つのスペースでインデントする必要があります。上記の区切り文字を閉じると、次の行が同じ量だけ減少するはずです。

調べてみましたが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]

( &sw4 に設定する場合は、2 に設定する場合の半分のスペース&sw)。

于 2012-12-05T04:12:14.400 に答える