晚上想着重新弄一下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。一整天都能浪费掉。。。。