我会使用 Vim 宏的强大功能。
假设您的文件中除了记录之外没有任何其他人员,第一条记录从第一行开始。并且您没有第 1 级的起点和终点在同一行。并且您的所有 {} 都匹配得很好。
转到第一个条目并录制一个宏以注册一个(qa
-开始录制q
-停止)
/{^MV%k:s/\n/EEEEEE/^Mj^
复制我的或更好地自己记录:(^M - 代表文字输入)
- /{^M 查找下一个 {
- V%k 选择线虎钳直到第 1 级结束,但不使用 }}} 结束行
- :s/\n/EEEEEE/^M 将符号“行尾”更改为所选内容中的某个唯一字符串
- j^ 往下走一行,然后到行的开头,以防之前的记录有前导空格。
从第二行开始运行宏(假设在录制宏时已经处理了第一行。)在正常模式下 100000@a - 使用大于记录数的任何数字。如果第一条记录在文件的第一行中,则宏将在处理完所有行时自行停止。作为副作用,它将在视觉上选择第一行 - 取消选择它。
对文件进行排序
:sort
恢复行尾::%s/EEEEEE/^M/g
注意 ^M 应该是文字输入。要键入它,请使用 Ctrl-V Enter
它适用于嵌套级别,因为 % 跳转到匹配的结束 }。这就是为什么让所有的 {} 匹配好很重要的原因。
当无法上去时,宏将停止,k
这就是为什么你必须在第一行有第一条记录。宏将忽略空行或任何不是记录之间的记录。
上述方法应该适用于您的文件。如果您想要更通用的折叠方法,请在宏中使用以下命令而不是 /{ 和 %
首先打开所有折叠
zj - 转到下一个打开折叠的开头
]z - 转到当前折叠的末尾。
宏的其余部分是相同的。这种方法更通用,但我发现它不太可靠,因为它依赖于所有折叠打开、折叠启用等。