プロポーショナルフォントでコードを書く

# これは何？

https://qiita.com/nodai2h_ITC/items/6c7b7ad029adf17da5f0#comment-4e0471395d41c1763f8f
に

> ……何故PythonやJSのコードをプロポーショナルフォントで書いたのか問い詰めたい。

というコメントがあったので、プロポーショナルフォントでコーディングする人もいるよ、ということを伝えようと思って筆をとった。

# プロポーショナルフォントで書いている人

今はどうか知らないけど、少なくともかつては、 [ビャーネ・ストロヴストルップさん](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%A3%E3%83%BC%E3%83%8D%E3%83%BB%E3%82%B9%E3%83%88%E3%83%AD%E3%83%B4%E3%82%B9%E3%83%88%E3%83%AB%E3%83%83%E3%83%97) はそうだったと思う。

プログラミング言語C++第3版に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/ef9744ce-3a1a-72de-c038-12cdf741769d.png)
とある。

これを読んで、私もかつてそうしていた。

プログラミング言語C++第3版に書いてあるとおり、しばらくしたらこちらが良いと感じるようになり、固定ピッチに慣れている人からは不思議がられるようになった。

第4版は、紙では持っていないんだけど、 Kindle 版では以下のように
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/eb7e4ebe-2e92-f3a6-3ded-4110a35e497b.png)
依然としてプロポーショナルフォントを使っている。

# 歴史的経緯

そもそも、アルファベットはプロポーショナルフォントが基本。

等幅フォントが存在するのは、かつてプロポーショナルフォントを描画する能力がなかったデバイス（タイプライタとか、古いコンピュータの TEXT VRAM とか）の苦肉の策だろうと想像している。

しかし、古いコンピュータで等幅フォントしか表示できなかったために「ソースコードは等幅フォント」を前提としたエコシステムができいる。

# プロポーショナルフォントで書くと

## 文字・単語の見やすさ

異論はあるかもしれないが、プロポーショナルフォントのほうが見やすい。
フォントによるとは思うけれど、平均的には文字幅が狭くなり、画面に入る情報が増えて便利。

とはいえ、プロポーショナルフォントでソースコードを表示するのに向いているフォント（つまり、 `oO0` や `1Il|` の区別が付きやすいフォント）はそれほど多くなく、フォント選びにはちょっと苦労するかもしれない。

私がプロポーショナルフォントでソースコードを書いていたときは メイリオ（Meiryo） を使っていた気がする。

## エディタ

エディタがプロポーショナルフォントに対応している必要がある。

VSCode なんかは問題ないが、vim や emacs だと苦しそうだと思う（思うだけ。未確認）。
私がプロポーショナルフォントでソースコードを書いていたときは Visual Studio（Visual Studio Code ではない） と Sublime Text で書いていたと思う。

## 字下げと桁揃え

行頭の字下げについては、なんの問題もない。
tab でも space でも、好きな方法で字下げすれば良い。

行頭以外で縦に揃えるのは、プロポーショナルフォントを使う場合基本的に不可能と思ったほうが良い。

行頭以外ってのは、こういうやつ

```text
foo:       [  12, hoge        ],
foobar:    [ 123, hogefuga    ],
foobarbaz: [1234, hogefugapiyo],
```

この「`12` と `1234` の1の位を揃えたいというニーズはプロポーショナルフォントだと叶えられない。
手元で揃うように頑張っても、フォントが変われば揃わなくなるのでそういう努力はするべきではない。

### コンソール出力

コンソール出力は、等幅フォントを前提とした出力がたくさんあるので、プロポーショナルフォントにするべきではないと思う。

たとえば、等幅なら

```shell:エラー出力
main.cpp:3:52: error: expected ';' before '}' token
    3 | int main(){ std::puts("hello, proportional world!") }
      |                                                    ^~
      |                                                    ;
```

となるところが、プロポーショナルフォントだと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/7ce7c527-bba3-862d-bffd-4b0078cb976f.png)

のようになるので、せっかくの `^` が無駄になる。
等幅を前提としてエコシステムができているので仕方ない。

### Haskell

Haskell の場合、行頭以外の文字を縦に揃える必要があって、プロポーショナルフォント好きとしては本当に困った覚えがある。

こういうやつ。

```haskell:haskell
m x y = let a = 2
            b = 3
        in a*x+b*y
```

これをプロポーショナルフォントにするとこうなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/91a669fd-6925-7844-067a-c892ea295f19.png)

私の記憶が確かなら、 `=` が揃ってないとエラーなので等幅フォントじゃないと無理。

【追記】
私の記憶は確かではなかったようで、`=` ではなく変数名の頭を揃える模様。
さらに改行を適宜入れれば プロポーショナルフォントを使っても無理ない感じで Haskell のコードを書くことはできそう。

[コメント](https://qiita.com/Nabetani/items/9f68c4b918437067bb15#comment-ed0ab4736c2397cc4385) 参照。

しかし、他人が書いた上記のようなコードを無理なく読むことはできそうにないので、いずれにせよプロポーショナルフォントで Haskell の仕事はできないと思う。

### Python

字下げが重要な Python だけど、私の知る限り行頭以外はどうでもいいのでプロポーショナルフォントでも全然困らないと思う。

### JavaScript

JavaScript も全く困らないと思う。

ブラウザで表示されるテキストの殆どはプロポーショナルフォントなので、プロポーショナルフォントのほうが便利かもとすら思う。

## ウェブサービス

github みたいなものでソースコードを表示する場合、たいてい等幅になっている。
プロポーショナルフォントだとだいぶ見た目が変わるので、見比べるのがちょっと面倒だったりはするだろう。

困るかというと別に困らないけれど、気にはなるかも。

# まとめ

わたしも最近は等幅ソースコードを書いている。
プロポーショナルフォントの場合は設定が面倒（ここは等幅じゃないと困る、ここはプロポーショナルがいい、と設定を細かく行う必要があるので）ということもあるし、エコシステムが等幅前提になっていることに負けたということでもある。

とはいえ、おそらく今でもプロポーショナルフォントでソースコードを書いている人はいるだろうし、それは非合理的なことではない。

マイノリティではあるけれど。

プロポーショナルフォントでコードを書きたいという人がいたら、その人には「Haskell 以外なら別に困らないと思う」と伝えると思う。