晚上想著重新弄一下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 -
然后需要刪掉所有的別名只留下一個家族名。因為在調用字體時,別名通常被限定在某種字形上,而通過家族名調用,則相當于調用了所有字形。該粗該細還是該斜體,只需要制定一個家族名,系統(tǒng)會按需選擇。又因為家族名都在第一項,別名用逗號隔開。可以按照上面的命令再來一次:
:%s/^\([^,]*\),.*$/\1/g和上面差不多,只不過在定義XXX的匹配模式的時候用到了
[^,]*。以外匹配除了,外的任意個所有字符。
因為,*默認匹配最長的字符串,如果行內不止一個,它就會默認把后面表達式中的哪個,匹配到行內最后一個。其實還有別的方法,但是我實在懶得記。這樣條目就只剩下家族名了:
Source Han Sans K -
因為別名的關系,家族名有很多重復的。所以只需要:
:%sort u這樣,整個個文件就完成去重。所有條目都是唯一的了。系統(tǒng)中有那些中文字體就一目了然。
不到一分鐘搞定。想幾年前我扒一個網站的HTML文件里的表格數(shù)據(jù)的時候,又是手工,又是用Python爬DOM。一整天都能浪費掉。。。。