先日、
【メモ】Manjaro Linux LXQtでNeovimを使ってみるという記事を書きましたが、その中で現在の公式リポジトリに入っているqterminalのバージョンではneovimが動作せず、qterminalの構成要素であるqtermiwidgetを最新のgitバージョンに差し替えると、Neovimは動いたものの、「日本語の全角文字の文字間隔がおかしい」という現象が現れるという話をしました。
具体的な状態は、こんな感じです。全角と半角が混在する行では、文字が重なってしまいます。
その原因を調べるために、ソースコードを読んでみました。去年の2月ぐらいに、qterminalをプロポーショナルフォントで使用できるようにしよう、という修正がなされたみたいでした。等幅フォントの場合、文字を描画する位置は、単純に(フォント幅)×(列位置)になるのですが、プロポーショナルフォントの場合、一文字ごとにQFontmetricsでフォント幅を見て、それを積算して描画する位置を決めるかたちになっていました。
で、そのコードの中で、日本語の全角文字は自動的にプロポーショナルフォント扱いにされ、全角文字のフォント幅が、(実はここらへんの仕様が、私にはよくわからないのですが)厳密には半角文字の2倍になっていないので、上の図のような全角と半角で描画の位置がずれるという現象が発生しているのではないか、と推測されました。
ということで、「日本語の全角文字は自動的にプロポーショナルフォント扱いにする」という部分のコードを削除すれば良いんじゃないか、と思って、コードをいじってやってみたら、こんな感じになりました。
ということで、GithubにPull requestを送りました。
その結果です。深夜の錆びついた頭の状態で作業したので、ひどいタイポがあったのですが、そこは見逃してください、、、。
PR