あなたの例から、あなたの>>
と<<
がペアになっていることに気付きました。したがって、各ペアで、
closing number = starting number +2
番号を確認していなかっただけです。でインデントを計算するだけ<< and >>
で、ニーズを満たすかどうかを確認できます。
最初にこの関数をソースします。
fun! GetIndent(line_num)
let lnum = a:line_num
if lnum == 0
return 0
endif
let sp = '^\s*>> \d'
let ep = '^\s*<< \d'
let l = getline(a:line_num)
if l =~ sp
while lnum > 0
let lnum = prevnonblank(lnum-1)
if getline(lnum) =~ sp
return indent(lnum)+&tabstop
break
endif
endwhile
endif
if l =~ ep
while lnum > 0
let lnum = prevnonblank(lnum-1)
if getline(lnum) =~ sp
return indent(lnum)
break
endif
if getline(lnum) =~ ep
return indent(lnum) -&tabstop
break
endif
endwhile
endif
return indent(a:line_num - 1)
endf
次に、ファイルのバッファで次を実行します。
:setlocal indentexpr=GetIndent(v:lnum)
gg=G
これで、テキストの書式設定に使用できます。例えば:
これ
>> 1 "foo"
...
>> 2 "bar"
...
>> 3 "bar"
...
>> 4 "bar"
...
>> 5 "bar"
...
>> 6 "bar"
...
<< 6 "bar"
...
<< 5 "bar"
...
<< 4 "bar"
...
<< 3 "bar"
...
<< 2 "bar"
...
<< 1 "foo"
後gg=G
は次のようになります。
>> 1 "foo"
...
>> 2 "bar"
...
>> 3 "bar"
...
>> 4 "bar"
...
>> 5 "bar"
...
>> 6 "bar"
...
<< 6 "bar"
...
<< 5 "bar"
...
<< 4 "bar"
...
<< 3 "bar"
...
<< 2 "bar"
...
<< 1 "foo"
私が言ったように、私はあなたのテキストの番号をチェックしませんでした. インデントを明確に示すためだけに、開始ペアと終了ペアの両方に番号 1 ~ 6 を使用しました。かもしれません1-3, 2-4, 3-5 ...
。私の関数があなたが望むことをしない場合、number+2 をチェックする必要があります。一致した行から番号を抽出してチェックすることができます。私の機能から始めましょう。
幸運を!
正規表現は、数学計算を行う正しい方法ではありません。基本的に言えば、正規表現(単独)ではできません。– ケント 5 月 6 日 9:29