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
是否可以在 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