我有一款使用超过十二年的编程字体,但是我一直也没敢逢人便安利,因为我知道字体这个东西每个人可能都有属于自己的品味和喜好

这些年间,我也时不时在各处看到有人推荐一些新晋流行的编程字体,什么Consolas、Source Code Pro、Menlo,还有最近随着编辑器一起流行起来的JetBrain Mono,同一个字体使用久了,我也渴望换一换心情,于是便找来试用,但这么多年下来,这些“新鲜”的字体大多没有能让我坚持超过三个小时的……

到今年,想了想这款字体我已经使用了超过12年了,我想我应该已经有推荐它的资格了吧

M+ Font

这款字体就是”M+ Font”中的编程版本字体——M+ 1mn

M+ Font官网

这是一款来自日本设计师森下浩司的作品(我其实也是这次写作才知道作者的名字,惭愧……),最早发布于2003年,并于2008年被Smashing Magazine评选为「当月字体」并开始收到关注。我在2012年左右接触到这款字体,一经试用便爱不胜收,从此之后,我在工作中更换过数款编程使用的IDE:Visual Studio -> Sublime Text -> VSCode -> Rider,还有一直离不开的(Neo)Vim,但无一例外的,均使用着”M+ 1mn”这款系列字体中专为编程所设计的等宽版本

当我真准备要推荐这款编程字体的时候,我倒是应该系统地好好想想,究竟什么样的编程字体才算是好的编程字体呢?

编程字体需要什么

JetBrain也是老牌的IDE生产力工具厂商了,他们最近几年开始大放异彩,我在工作环境下的IDE也换成了Rider。题外讲一句Rider确实好用,可以说是目前游戏开发者的不二选择,无论你是使用Unity还是Unreal引擎。至少在目前,它是综合体验最好的IDE,速度也比VS要快上不少。要说缺点,就是编辑器刚打开工程时处理的时间比较长(要做缓存和索引),此外,内存占用也是个问题,大一点的工程,5GB+的占用轻轻松松

我们说回字体,JetBrain在2020年的时候推出了他们自己的编程字体JetBrain Mono,用来作为自家编辑器的默认字体,这几年间看到过很多国外的Up主都在用这款字体,我也试用并研究过一阵子。说来有趣,我虽然用了好多年的M+ 1nm,但是从来都只是在直觉上觉得它看着“舒服”,看着“喜欢”,可你让我说出些门门道道来,我还真说不出来,直到看了JetBrains吹他们字体的设计思路,我似乎才更明白了一些为啥我一直离不开”M+ 1mn”,也对一款编程字体真正需要什么特质有了更多的思考:

一、辨识性

编程字体之所以是编程字体,那么它一定是有着区别于其他字体的一些特性的,首先就是相似字符的辨识性,英语的大小写字符以及标点符号中有一些长得很像的字符,例如”l”和”I”,还有”0”和大小写的”O”啊,人在阅读英文单词时,即使个别字符不易分辨,我们也可以靠着“脑补”来无障碍的完成文章内容的识别,但在代码环境中,比起单词本身,会出现更多字符数字混编的情况,一行行的代码与文章中的排列迥异,变量名的组成也与我们日常阅读的单词不尽相同,这就要求这类字符之间需要能有明显的特点区分,即使脱离词句的环境,也可以让我们的大脑可以相对轻松的做出精确识别

不过在这一点上,其实现代编程字体几乎都做得很好,之间也很难拉开差距,这并不是我喜爱”M+ 1mn”的主要原因

二、等宽

这个也算是编程字体的一个硬性要求,因为“缩进”一直是编码规范中一个充满争议的话题,你想程序员是一群连“Tab vs Space”都要吵个没完没了的群体,你可以想象当争吵的双方如果同时看到一个不用等宽字体的程序员突然出现在他们的视野中场面都安静下来的喜剧感(实际上也是有很多人在编程环境中使用非等宽字体的,并不绝对的)

字体的等宽和缩进一样也都是属于改善代码的阅读性的范畴,当你阅读代码时,等宽的字体除了美观外,还可以帮你减轻很多诸如“对比字符串长度”,“变量名长度”等等下意识活动的负担

电视剧《硅谷》中经典的Tab vs Space桥段【其实我也更倾向于Tab,但是我是Vim Guy】

三、可阅读性

因为我同时也是个电子阅读器的爱好者,家里的墨水屏设备已经7、8个了。而每一个电子阅读器的爱好者也一定会对阅读时使用的字体“千挑万选”,我自不例外,在这个过程中,势必会接触到一些字体设计上的知识,而在“可阅读性”上,我觉得很重要的一点其实是——“衬线”(Serif)

所谓衬线就是指字体在比划的“边角”上适当添加的装饰,最有名的中文衬线字体就是宋体了,不要小看那比划末尾的那一点点“冗余”!当初宋体最早是作为活版印刷的字体而出现的,其设计理念中很重要的一点就是节省成本(油墨),因此比划会倾向于尽可能细,但太细会让可辨识性大打折扣,阅读一会儿眼睛就会疲劳,甚至大脑宕机(笑),而聪明的先人们发现,其实只要在关键的比划位置增加这一点点“冗余”,那么就可以在几乎不多费油墨的同时,大幅提升字体的可阅读性,而且还让字体变得更具艺术感也更活泼

那么既然衬线字体这么好为什么我们手机和电脑上的主流字体全都是黑体呢?这个主要是受电子显示设备的局限,印刷行业的最低要求是300PPI,而24寸的1080P显示器,只有可怜的92PPI,在这样的设备上显示小号字体时会大量丢失像“衬线”这一类的细节,更别说走样也会让字体原本的美感荡然无存,也因此早期计算机的字体都是采用点阵的方式来设计字体,这也是类黑体在电脑设备上如此普及的重要原因

不过现在随着高分辨率显示设备的发展,这一情况正在得到改善,只要屏幕的PPI能够接近300这一人眼观察的“阈值”,而且你并非是“小字号”爱好者,那么字体带有一些“衬线装饰”是绝对会帮助提升可阅读性的,因为你要记得,人类阅读文字的过程,终究是一个“图像模式识别”的过程,更多一些的字符特性会更利于大脑做出准确的识别判断

字体在衬线上的设计往往带有鲜明的个性,对于衬线的帮助,我们有时也需要辩证的看待,太过“花里胡哨”反而可能会分散我们阅读时的注意力,变得矫枉过正,更要记得字体的渲染依然还在受着液晶屏幕的物理限制。对于这一块,我其实更倾向于相信我们的直觉,只要你知道这背后隐藏的门门道道,剩下的,就交给自己的“眼缘”来判断吧(也可以前后对比着切换的使用几个小时试试看)

四、”瘦且长“

JetBrain Mono的设计理念中首当其冲的的是小写字母高度设计,在保持字符宽度的同时,适当的提高小写字母的高度,会有利于代码的阅读。

最早看到这一展示时,我“恍然大悟”——原来这就是我试用很多流行字体坚持不了三个小时的主要原因吗?因为直觉上我用的M+ 1mn字体也是一种“瘦且长”的字体,而后当我进一步仔细对比了JetBrain Mono和M+ 1mn时,我似乎又有了新的思考……

我们正常阅读使用的字体为啥不是等宽的呢?(仅限英文,因为中文本来就都是等宽的)其实原因也很直白,就是因为非等宽的字体更紧凑,更利于阅读;这时你再加上“编程字体需要等宽”的条件,是不是可以得出这样一个结论:

在等宽的基础上,字体越紧凑,可阅读性就越好!

JetBrain Mono提升小写字符高度的做法其实是在这一方向上做的视觉努力,而M+ 1mn则是直接将字体做的更紧凑而已

如果单独把每一个字体配合上漂亮的配色在现代的IDE中做展示,我相信都很漂亮,但是当你把他们排在一起对比是,你就会开始对可阅读性有一个更直观的对比

结论

我并无意表示M+ 1mn就是最好的编程字体了,因为字体的选择归根到底还是Personal Preference,只是在有了上面这些思考后,看起来我还会继续坚守这个字体一阵子了,写这篇文字的目的也是希望能激发大家的一些思考,如果你天天都要面对都要使用的东西,谁不希望有自己更懂更偏好的选择呢?

在写这篇文字的时候,我才从M+的官网发现,他们的字体设计上发生了一些变化(我一直使用备份在自己的Github上的旧版本),再追溯Github的历史,发现这一变化大概是从2019年开始的,我能注意到的是以下几点:

  1. 字体的官方名称从M+ 1/2改为了M Plus 1/2
  2. 适用于编程的字体由M+ 1mn改为了M Plus 1 Code
  3. 我不知道是刻意为之还是无心之过,新版的Medium Weight的字体要比以前更粗一些……(可以对比上图前两行之间细微的差别)

如果你和我一样对旧版的粗细度更钟情,我这里提供了旧版的下载,有原始版本和打了Nerd Font Patch的版本,以方便你在编程和终端两个环境下使用 :-)

M+ 1mn Medium

Patch过Nerd Font的M+ 1mn Medium