我得到了一个纯文本文件,其中包含用空格分隔的值的列。
像这样:

AU 3030 .... ... ....  
AU 3031 .... ... ....  
AU 3032 .... ... .... 
AU 3033 .... ... .... 
IT 48100 ... .. .....
IT 40100 ... .. .....
IT 48123 ... .. .....
UK 3333 ... ... ..... 
UK 4444 ... ... .....
UK 5555 ... ... .....


我也得到了此正则表达式,它将匹配与除了最后一个列外,第一列中的值相同(假定文件在第一列中排序):

/^\(\([A-Z0-9]\+\)\s\+.*\n\)\(\)\@=


(或使其不那么“有毛”):

/^\v([A-Z0-9]+)\s+.*\n()@=


是否可以将线折叠到不匹配的线上?结果如下:

+-- 4 lines AU ....
+-- 3 lines IT ....
+-- 3 lines UK ....


#1 楼

执行set foldmethod=expr并使用'foldexpr'设置将定义折叠起点的vim脚本表达式。

set foldmethod=expr
set foldexpr=get(split(getline(v:lnum-1)),0,'')!=get(split(getline(v:lnum)),0,'')?'>1':'='


这看起来比实际要复杂,因为我们不容易在:set中使用空格,但带有空格和一个换行符或2,它看起来像:

get(split(getline(v:lnum - 1)), 0, '') != get(split(getline(v:lnum)), 0, '')
    \ ? '>1'
    \ : '='


概述

基本上,这与第一个比较每行的单词与前一行相同。如果单词不同,则该行是折线的开始>1。否则,它保持相同的折叠级别=

荣耀之光foldings

set foldmethod=expr选项保存vim脚本表达式
使用三元数评估条件,该三元数在开始折叠时返回'foldexpr',在继续折叠级别时返回>1

=v:lnum用来更新折叠的当前行
通过'foldexpr'获取当前行(v:lnum)和上一行(v:lnum - 1)的内容

将每行拆分为单词通过getline()

使用split()获取新拆分单词的第一个索引
如果出现空白行,请使用默认值get()。例如''

在三进制的条件部分中比较当前行的第一个单词和上一行的第一个单词

注意:此方法可能存在一些性能问题非常大的文档

有关更多帮助,请参见:

:h 'foldmethod'
:h 'foldexpr'
:h getline(
:h v:lnum
:h split(
:h get(