Ubuntu18.04下vscode、leetcode等宽字体Monaco显示错误(1个字母对应2个空格)的解决方法

一、问题

在windows下用vscode和leetcode都是1个字母对应1个空格,默认情况下1个缩进对应4个空格(即4个英文字符)。转到linux下看着就很不习惯(如下图,因为我已经改好了所以用了原博主的图),这里虽然1个缩进仍等于4个空格,但却只有2个字母的宽度。
Ubuntu18.04下vscode、leetcode等宽字体Monaco显示错误(1个字母对应2个空格)的解决方法_第1张图片

二、针对vscode

修改“设置-Font Family”,把’Droid Sans Mono’, ‘monospace’, monospace改为只留下monospace一个或者把monospace放到最前面。
修改前
Ubuntu18.04下vscode、leetcode等宽字体Monaco显示错误(1个字母对应2个空格)的解决方法_第2张图片

三、针对vscode和leetcode

  1. 据原博主分析,造成1个字母对应2个空格的情况的原因是系统自带的中文字体软件包的作者为了简洁起见,直接将整个系统字体全部设为该字体(包括拉丁文字),故解决方案为给系统英文等宽字体一个更高的优先级。(其实原博主的解释我没怎么看懂,但不影响问题的解决)
  2. 安装Monaco。
    (1)下载地址:https://github.com/hbin/top-programming-fonts/raw/master/Monaco-Linux.ttf(或者去谷歌搜How to install the Monaco font)
    (2)在存放Monaco-Linux.ttf的目录下打开终端,依次运行:
sudo mkdir /usr/share/fonts/Monaco
sudo cp Monaco-Linux.ttf /usr/share/fonts/Monaco
cd /usr/share/fonts/Monaco
sudo mkfontscale && sudo mkfontdir && sudo fc-cache -fv
  1. 添加到系统的字体加载顺序中。
    (1)gedit ~/.fonts.conf,新建或修改用户font配置文件,改为Monaco。

DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <match>
        <test name="family"><string>sans-serifstring>test>
        <edit name="family" mode="prepend" binding="strong">
            <string>Monacostring>
        edit>
    match>
    <match>
        <test name="family"><string>serifstring>test>
        <edit name="family" mode="prepend" binding="strong">
            <string>Monacostring>
        edit>
    match>
    <match>
        <test name="family"><string>monospacestring>test>
        <edit name="family" mode="prepend" binding="strong">
            <string>Monacostring>
        edit>
    match>
fontconfig>

(2)sudo gedit /etc/fonts/conf.d/60-latin.conf,对系统的字体加载顺序进行修改,在每一个 后面添加 Monaco。(以下因整洁之故省略了几行)


DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
	<alias>
		<family>seriffamily>
		<prefer>
			<family>Monacofamily>
			<family>DejaVu Seriffamily>
			...省略
		prefer>
	alias>
	<alias>
		<family>sans-seriffamily>
		<prefer>
			<family>Monacofamily>
			<family>DejaVu Sansfamily>
			...省略
		prefer>
	alias>
	<alias>
		<family>monospacefamily>
		<prefer>
			<family>Monacofamily>
			<family>DejaVu Sans Monofamily>
			...省略
		prefer>
	alias>

 	<alias>
		<family>fantasyfamily>
		<prefer>
			<family>Monacofamily>
			...省略
		prefer>
	alias>

	<alias>
		<family>cursivefamily>
		<prefer>
			<family>Monacofamily>
			...省略
		prefer>
	alias>

fontconfig>
  1. 字体渲染修复。
    sudo gedit /etc/fonts/conf.avail/64-language-selector-prefer.conf,里面的代码JP(日语)优先度高于SC(中文),所以将每一个SC代码移动到优先级最高的位置。
    Ubuntu18.04下vscode、leetcode等宽字体Monaco显示错误(1个字母对应2个空格)的解决方法_第3张图片
  2. 其他
    原博主说“linux中文字体很多hint打开但默认中文字体是没有hint的,要把所有字体的hint全部禁用”。我没看懂什么意思,但还是照做了。
    sudo gedit /etc/fonts/local.conf,修改为:

DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
    <match target="font">
        <edit name="hintstyle" mode="assign">
            <const>hintnoneconst>
        edit>
    match>
fontconfig>
  1. 可能需要重启电脑。结果终于舒服了。
    leetcode:
    Ubuntu18.04下vscode、leetcode等宽字体Monaco显示错误(1个字母对应2个空格)的解决方法_第4张图片
    vscode:
    Ubuntu18.04下vscode、leetcode等宽字体Monaco显示错误(1个字母对应2个空格)的解决方法_第5张图片

你可能感兴趣的:(ubuntu)