Vim - 使用宏或甚至另一个vim功能转换结构化文本

时间:2013-12-18 19:56:57

标签: vim data-structures macros

我正在阅读/学习一些关于vim,并发现宏可用于重复动作。我的问题是:vim可以使用宏(或其他一些vim魔法)实现以下文本转换

输入:

- 1 Show invisibles (2:52)
- 2 Tabs and Spaces (6:22)
- 3 Whitespace preferences and filetypes (3:29)
- 4 Tidying whitespace (4:33)
January 2010


- 5 Indentation commands (5:41)
- 6 Working with buffers (3:28)
- 7 Working with windows (5:32)
- 8 Working with tabs (3:17)
February 2010

输出:

January 2010
- 1 Show invisibles (2:52)
- 2 Tabs and Spaces (6:22)
- 3 Whitespace preferences and filetypes (3:29)
- 4 Tidying whitespace (4:33)


February 2010
- 5 Indentation commands (5:41)
- 6 Working with buffers (3:28)
- 7 Working with windows (5:32)
- 8 Working with tabs (3:17)

我会采取一些步骤,但不知道如何在vim中写这个:

  1. 如果该行以短划线开头,请记住它的行号并移至下一行
  2. 如果再次找到以破折号开头的行,则移动光标直到找到非破折号起始行
  3. 如果找到不是以破折号开头的行,请记住它的位置并删除此行(dd)
  4. 跳过在步骤1中记住的行号上方的一行,并附加(p)已删除的行
  5. 将非虚线的计数器增加2(记录之间有两个空格)
  6. 使用光标跳转到此递增的行,然后从步骤1开始。
  7. 这是另一种更优雅(我认为)的方法,但它需要从后面读取文件:

    1. 如果找到未以短划线开头的行,请删除此行(dd)
    2. 如果找到以破折号开头的行移至下一行
    3. 如果找到空行,则附加删除的行(p)
    4. 移动光标,直到再次找到非虚线,然后从步骤1开始。
    5. 这可能在VIM中吗?谢谢

2 个答案:

答案 0 :(得分:3)

试试这个cmd:

:g/^[^-]/norm! dd(P

答案 1 :(得分:1)

以下是肯特作为宏的解决方案(<CR>表示按 Enter ):

qq/^[^-]<CR>dd(Pq

这记录在寄存器q中。您可以通过@q重复一次。

如果您事先使用qqq清除了注册表,并使用@qq@q代替q结束宏,那么您将拥有重复的递归宏直到没有更多的工作要做。 (在这里,你需要:set nowrapscan,否则它将永远循环。)