Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 如何搜索值+;2在维姆?_Vim - Fatal编程技术网

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"