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

时间:2017-03-20 18:19:02

标签: vim statusbar

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

示例:

In [1]: import numpy as np

In [2]: my_bytes = b'\x04\x00\x00\x00\xac\x92\x01\x00\xb2\x91\x01'

In [3]: with open('test_file.itf', 'wb') as f:
            f.write(my_bytes)

In [4]: with open('test_file.itf', 'rb') as f:
            result = np.fromfile(f, 'int32', 5)

In [5]: result
Out [5]: 

In [6]: with open('test_file.itf', 'rb') as f:
            result = np.core.records.fromfile(f, 'int32', 5)
ValueError: Not enough bytes left in file for specified shape and type

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

1 个答案:

答案 0 :(得分:3)

我找到了办法,但看起来有点疯狂:

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('$')。此调用返回当前缓冲区中的行数(或者更确切地说是缓冲区中最后一行的编号)。这是%L通常显示的内容。

我们正在寻找的搜索模式是\d(\d\d\d)+$(删除了特殊的vim疯狂),即一个数字后跟一个或多个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