macOSの標準のターミナルや、iTerm2を使用して日本語を入力していると、カーソル位置がずれておかしな位置に表示される事があります。
Unicodeには文脈によって文字幅が異なる事場合があり(東アジアの文字幅)、それが原因で発生する問題のようですが、どうやら決定的な対策は存在しないようです。
ただしソフトウェアによっては設定を変更し、自分好みの動作に変更する事が可能になっています。以下iTerm2とターミナルでこの設定を変更する方法を説明します。
iTerm 2の場合
iTerm2の場合、プロファイルの設定を変更します。
▲「Preferences」の「Profiles」タブで目的のプロファイルを選択します。「Text」の中にある「Ambiguous characters are double-width」にチェックを入れると、あいまいな文字が全角で表示されるようになります。
これで例えば「◎」などの全角記号の後のカーソルが半分かぶってしまう事がなくなります。
ターミナルの場合
macOSの標準ターミナルにも同様の設定が存在します。
▲「環境設定」の「プロファイル」で目的のプロファイルを選択します。「詳細」の中にある「Unicode東アジアA(曖昧)の文字幅をW(広)にする」にチェックを入れることでiTerm2と同様の効果が得られます。
副作用もあり
「Ambiguous characters are double-width」をオンにすることで全ての問題が解決すれば良いのですが、この設定には副作用も存在するようです。
例えば以前紹介したターミナルで動作するタイマーアプリ「Countdown」の表示が以下のように崩れてしまいます。
▲「Ambiguous characters are double-width」がオンの場合。
▲「Ambiguous characters are double-width」がオフの場合。
記号が想定とは異なる文字幅で描画されてしまい、文字がずれているのだと思います。
まとめ
東アジアの曖昧文字幅(East Asian Ambiguous Width)は多くのユーザーが悩まされている問題です。「Ambiguous characters are double-width」をオンにする設定にも副作用もあるようですので複数のプロファイルを作成し、適宜使い分けるといった方法も考えるべきかもしれません。
なおiTerm2やターミナルの設定以外にも、emacs、vi、timuxといったソフト毎に設定を行わないといけない場合もある模様。その場合「Ambiguous Width ソフト名」で検索すると有用な方法が見つかるかもしれません。