VIM 状态栏中带有千位分隔符的行数?

VIM line count in status bar with thousands separator?

是否可以在 VIM 状态栏中显示带有千位分隔符的行数,最好是自定义千位分隔符?

示例:

set statusline=%L

应该导致“1,234,567”而不是“1234567”。

我找到了一个方法,但看起来有点疯狂:

set statusline=%{substitute(line('$')\,'\d\zs\ze\%(\d\d\d\)\+$'\,'\,'\,'g')}

第一轮反斜杠只是为了set(我必须转义,\本身)。

我实际设置的选项是这个字符串:

%{substitute(line('$'),'\d\zs\ze\%(\d\d\d\)\+$',',','g')}

作为格式化字符串,这一行包含一个格式化代码,即%{...}... 中的所有内容都作为表达式求值,并将结果代入。

我正在评估的表达式是(添加了空格(如果我将它们添加到真实代码中,我将不得不再次将它们转义为 set,强制使用更多反斜杠)):

substitute(line('$'), '\d\zs\ze\%(\d\d\d\)\+$', ',', 'g')

这是对 substitute 函数的调用。参数是源字符串、正则表达式、替换字符串和标志列表。

我们开始的字符串是 line('$')。此调用 returns 当前缓冲区中的行数(或者缓冲区中最后一行的行数)。这是 %L 通常显示的内容。

我们正在寻找的搜索模式是 \d(\d\d\d)+$(移除了特殊的 vim 疯狂),即一个数字后跟 1 组或多组 3 位数字,然后是字符串的末尾.分组在vim中拼写为\%(\),“1个或多个”拼写为\+,这就得到了\d\%(\d\d\d\)\+$。最后一点魔法是 \zs\ze\zs 设置匹配字符串的开始; \ze 设置结束。这就像 \zs 之前的所有内容都是后视模式,而 \ze 之后的所有内容都是前瞻模式。

这相当于:我们正在寻找源字符串中前面有一个数字且后面正好有 N 位数字(其中 N 是 3 的倍数)的每个位置。这就像从右边开始向左走,每次跳过 3 个数字。这些是我们需要插入逗号的位置。

这就是替换字符串:','(逗号)。因为我们正在匹配长度为 0 的字符串,所以我们有效地插入到源字符串中(通过将 '' 替换为 ',')。

最后,g 标志表示要对所有匹配项执行此操作,而不仅仅是第一个匹配项。

TL;DR:

  • line('$') 给我们行数
  • substitute(..., '\d\zs\ze\%(\d\d\d\)\+$', ',', 'g') 在我们需要的地方添加逗号
  • %{ } 让我们可以将任意表达式嵌入到 statusline