从您的示例中,我注意到您的>>
和<<
是配对的。所以我假设在每一对中,
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 ...
。如果我的功能不符合您的要求,则需要检查数字+2。您可以从匹配的行中提取数字并进行检查。我的功能应该让你开始。
祝你好运!
正则表达式不是进行数学计算的正确方法。基本上来说,正则表达式(单独)做不到。– 肯特 5 月 6 日 9:29