0

我有一个具有这种基本格式的文件:

>> (N0) "string X0"
...
>> (N1) "string X1"
...
<< (N1+2) "string X1"
...
<< (N0+2) "string X0"

如您所见,它是一个嵌套结构。数字 N0、N1、N* 周围没有括号。这些可以嵌套任何深度。字符串在引号内,但它们没有编号,只是一样。嵌套字符串可以与外部字符串相同。

我打算制作一个宏来尝试缩进所有这些嵌套项目,以便更轻松地分析数据,但我不确定如何搜索 N+2。

如果我不能在 vim 中完成,我猜我只需要编写一个 perl 脚本,但想知道是否可以在 vim 中完成。

我在这里添加了一个更具体的输入和输出示例,虽然这个数据集不再重要,但我更感兴趣的是找出如何找到下一次出现的以 2 为增量的找到的数字:

>> 5“富”
...
>> 2“酒吧”
...
<< 4 "酒吧"
...
<< 7 "富"
>> 5“富”
  ...
  >> 2“酒吧”
   ...
  << 4 "酒吧"
  ...
<< 7 "富"

所以基本上,我想找到一个数字,5然后找到下一个出现的5+2,即7。然后我就可以缩进它们之间的线条。

有任何想法吗?谢谢。

4

1 回答 1

2

从您的示例中,我注意到您的>><<是配对的。所以我假设在每一对中,

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

于 2013-04-30T21:58:43.463 回答