為什麼vim只支持等寬字體?
01-15
今天才發現vim/MacVim只支持等寬字體,如果設置非等寬字體也會顯示成等寬(效果慘不忍睹)。
難道Vim的目標場景只是編寫代碼?編輯器難道不是(文本)編輯器而不僅僅是(代碼)編輯器嗎?
任何編輯器都需要排版,而只支持等寬字體排版是最簡單的。要支持比例字體,那排版中間的計算就需要更高的精度(因為絕大多數字體的內部寬度度量值都精確到 1/1000em),同時還需要 cache 一大堆文節(可簡單看作單詞)的具體長度,複雜度漲的刷刷的。具體可以去問 @李阿玲。其實比支持比例字體更大的坑是斷行演算法和 bidi,基本上沒有文本編輯器能正確處理這倆巨坑,尤其後者。當然了,估計所有的文本編輯器都無法處理的估計就是只能豎排的蒙古文和滿文了吧……可憐的 @Hasuran Li。
就是用來寫代碼的吧,如果你要支持排版,非等寬字體和多國語言的話,程序要自帶一個超大資料庫(不像Windows,Linux都不帶這個),那對大部分用戶都不友好。
本來就只有程序員才用。
首先,vim支持全形/半形區分,而全半形區分的字體並不是傳統意義上的等寬字體。因此vim實際上支持的是「特定編碼範圍內的字寬度是其他字的兩倍的字體」,而不是你說的「把所有字體當等寬字體看待」,這兩個概念是不同的。好吧,略微有點吹毛求疵……這裡說的「支持」,是說真的把這個字的顯示寬度納入考慮範圍內,也就是說你打
English
中文
編輯器要能知道「文」字對應的是「gl」。後面的討論將著重說明,獲得這樣的能力沒有你想像得簡單。
你要意識到這個情況已經簡化到不行了,比如說vim並沒有對combining character的寬度作假設,對阿拉伯語字母的從右到左排版好像也沒有很好的支持,對於印度諸文字的複雜的行為似乎也根本沒有一個通用的模型去讓vim估計一個特定字元串最終顯示的寬度,而且印度諸文字可能根本就沒有等寬字體存在。你要意識到CJK字元對等寬字體的假設實際上提出了挑戰,但是因為已經存在一個優雅的解決方案(讓CJK字元寬度成為其他字元的兩倍),這個問題碰巧被解決了,甚至於你感受不到這是一個問題。
然而這真的是一個問題。Courier New, Consolas, Andale Mono和Monaco的長寬比都不是1:0.5,而是1:0.6。而所有常見漢字字體的長寬比都是1:1……所以你要注意,全形半形的解決方案看起來很完美,只是因為各種terminal的作者幫助你隱藏了不完美的地方,他們要不然把1:1大小的漢字拉大一點,要不然把1:0.6的英文字壓小一點,要不然在1:1的漢字兩側襯上一點空白搞成1:1.2,最終給你一種「漢字寬度本來就是英文兩倍,這還有疑問么」的假象。據說讓人感覺不到背後的複雜是高明的事情,所以我覺得各種terminal在這個問題上都辛苦了。我倒想日常自用的所有編輯文字的東西都能自動使用等寬的ubuntu mono。。。
你們這些emacs黨真是夠了!
推薦閱讀:
※哪兩個字母不可能連在一起?
※Vim和Emacs哪個用戶數量更多?
※你有哪些 Vim 綜合征?
※Vimrc 能否將 capslock 綁定為 esc 鍵?
※Vim 約等於記事本嗎?