晚上想着重新弄一下Urxvt的中文字体。
其实字体文件挺讨人厌的。主要是因为,同一种字体的各种bold
,italic
,condensed
等等的字形都在不同的字体文件中定义。而我下载的又是字体包,而且好几个带中文的(其中包含一些韩日语的字体)。时间一长,fc-list :lang=zh
的输出看的我头的大。于是立马就想到用Vim整理一下看看都有哪些。
于是
fc-list :lang=zh > fonts
vim fonts
里面超过两百条条目都是这样的:
/usr/share/fonts/adobe-source-han-sans/SourceHanSans-ExtraLight.ttc: Source Han Sans K,본고딕,Source Han Sans K ExtraLight,본고딕 ExtraLight:style=ExtraLight,Regular
大致格式就是:
字体文件路径:字体家族名,别名1,别名2:所定义的字体风格
而其中字体家族名
是我真正需要的东西:
-
首先把字体名晒出来。也就是删掉每行第一个冒号前的和第二个冒号后的所有内容:
:%s/^.*:\(.*\):.*$/\1/g
解释:
:
进入命令模式
%
在整个文档范围内匹配
s/XXX/YYY/g
把所有匹配到的XXX替换成YYYXXX=
^.*:\(.*\):.*$
开头的^
是代表行首
.*
代表任意个任意字符
:
代表冒号
\(.*\)
记下这一串匹配到的字符串,也就是在两个冒号之间的任意个任意字符
结尾的$
代表行尾
YYY=\1
调用刚刚被匹配并记录下来的字符串就把原来的条目变成了这样:
Source Han Sans K,본고딕,Source Han Sans K ExtraLight,본고딕 ExtraLight
-
然后需要删掉所有的别名只留下一个家族名。因为在调用字体时,别名通常被限定在某种字形上,而通过家族名调用,则相当于调用了所有字形。该粗该细还是该斜体,只需要制定一个家族名,系统会按需选择。又因为家族名都在第一项,别名用逗号隔开。可以按照上面的命令再来一次:
:%s/^\([^,]*\),.*$/\1/g
和上面差不多,只不过在定义XXX的匹配模式的时候用到了
[^,]*
。以外匹配除了,
外的任意个所有字符。
因为,*
默认匹配最长的字符串,如果行内不止一个,
它就会默认把后面表达式中的哪个,
匹配到行内最后一个。其实还有别的方法,但是我实在懒得记。这样条目就只剩下家族名了:
Source Han Sans K
-
因为别名的关系,家族名有很多重复的。所以只需要:
:%sort u
这样,整个个文件就完成去重。所有条目都是唯一的了。系统中有那些中文字体就一目了然。
不到一分钟搞定。想几年前我扒一个网站的HTML文件里的表格数据的时候,又是手工,又是用Python爬DOM。一整天都能浪费掉。。。。