是否可以在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”。
答案 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