Vim 如何搜索值+;2在维姆?
我有一个基本格式的文件:Vim 如何搜索值+;2在维姆?,vim,Vim,我有一个基本格式的文件: >> (N0) "string X0" ... >> (N1) "string X1" ... << (N1+2) "string X1" ... << (N0+2) "string X0" >(N0)“字符串X0” ... >>(N1)“字符串X1” ... >5“foo” ... >>2“巴” ... 5“foo” ... >>2“巴” ... 从您的示例中,我注意到您的>和perl脚本比我预期的要简单,因为我的>>
>> (N0) "string X0"
...
>> (N1) "string X1"
...
<< (N1+2) "string X1"
...
<< (N0+2) "string X0"
>(N0)“字符串X0”
...
>>(N1)“字符串X1”
...
>5“foo”
...
>>2“巴”
...
5“foo”
...
>>2“巴”
...
从您的示例中,我注意到您的>
和perl脚本比我预期的要简单,因为我的>>和描述,我没有非常清楚地理解您的需求。是否要查找(Nx+2)
?你能举一个例子作为原始文本和预期输出吗?希望这个例子能为你澄清问题。在我看来,你需要保留一堆上次访问的值(例如,从5
开始,然后将2
推到顶部)。当您将值推入堆中时,您会不断增加缩进级别,直到当前值满足条件+2
(当您降低缩进级别并弹出堆的顶部时)。逻辑很简单(我相信您已经理解了这一点),但恐怕无法在对indentexpr
的多个调用中保持这一堆。是的,我对vim的API了解不多。我打算用更宏观的方式来做。这就是为什么我要搜索一个数字+2的原因。顺便说一句,这篇文章我是怎么得到-2分的?它只显示了-1,我想我已经澄清了它,所以我也不认为我应该得到它。这是关于如何在vim中编程的精彩介绍。谢谢你。但是它并没有解决问题。@Adrian if>>我正在寻找一个能够找到“>>n”和“regex不是进行数学计算的正确方法。基本上,regex(单独)无法完成。这就是我想知道的。谢谢。
>> 5 "foo"
...
>> 2 "bar"
...
<< 4 "bar"
...
<< 7 "foo"
>> 5 "foo"
...
>> 2 "bar"
...
<< 4 "bar"
...
<< 7 "foo"
closing number = starting number +2
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)
>> 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 "foo"
...
>> 2 "bar"
...
>> 3 "bar"
...
>> 4 "bar"
...
>> 5 "bar"
...
>> 6 "bar"
...
<< 6 "bar"
...
<< 5 "bar"
...
<< 4 "bar"
...
<< 3 "bar"
...
<< 2 "bar"
...
<< 1 "foo"