如何用函数重新计数数字是 (n)vim

问题描述 投票:0回答:1

我有以下 txt 文件,经过编辑、重新整理等。所以数字不再正确。

       #1. Sometext <andmore>/
              /mm
       #2. Next block/
              1. option x/
              3. option s/
 #. character <description>/
 .option e/
 .option d/
 ...
       #104. last entry/
             1. option x/
             2. option p/
             3. option s/
             1. option e/
             2. option d/

如何在vim中重新编号#[number]。和内部块编号 [1]。即使它们是空的。这样我就得到:

    #1. Sometext <andmore>/
           /mm
    #2. Next block/
           1. option x/
           2. option s/
    #3. character <description>/
           1. option e/
           2. option d/
    ...
    #105. last entry/
           1. option x/
           2. option p/
           3. option s/
           4. option e/
           5. option d/

我有一个旧的 vim 函数,应该重新计算“#[number]”。零件...

fun CountUp()
  let ret = g:i
  let g:i = g:i + 1
  return ret
endf

应该由

调用
:let i = 1 | %s:sS:\="#" . CountUp() . ". ":g

...但这还没有开始。与我不明白的“sS”有关。

vim
1个回答
0
投票

那个

sS
是一个模式,字面意思是字符串
sS
,显然在你的缓冲区中找不到。没有任何理由期望它在这个特定的上下文中做任何事情,更不用说任何有用的事情了。

您应该首先设计一个与用例实际相关的模式,例如:

^\s*\zs#\d\+\.

参见

:help \zs

请注意,这适用于

#N
标题,但不适用于子项目。不是因为模式(可以轻松修改以处理两者),而是因为:

  • 这些子项的顺序是它们所属块的本地顺序,既不是“您的”
    CountUp()
    函数,也不是整个命令处理递归性,
  • 无论如何,替换部件只能处理
    #N
    的情况。

不过,您可以对每个子项目块执行以下操作一次:

  1. 直观地选择子项目。

  2. 运行以下命令:

    :let i = 1 | '<,'>s/^\s*\zs\d\+/\=CountUp() . "."
    

请注意,您的“起点”也存在一些严重的格式问题,甚至有一个块缺少数字,这将使事情进一步复杂化。

总而言之,整个事情实际上相对复杂,需要大量的工作来处理越来越多的极端情况。这需要的不仅仅是一句台词。

© www.soinside.com 2019 - 2024. All rights reserved.