作曲・指導・C言語・Linux

金沢音楽制作

金沢音楽制作では、楽曲・楽譜の制作と、作曲や写譜などレッスンを行っています。

曖昧文字幅を固定幅で表示する

ターミナルで日本語入力をしている時、特定の全角記号を入力すると、半角程度の幅で表示されることがあります。困ったことに、記号の表示位置がずれたり重複されて表示されたり、また折返し地点の文字が消えてしてしまいます。この問題は、設定である程度は軽減できますが、完全な対処法はないように思われます。

GUI環境であれば、VSCodeといった高性能なエディタを使うことで一応の解決ができますが、入力の度に文字列がチラつきます(VSCode ver 1.64.2)。

原因は曖昧文字幅

UTF-8には、曖昧文字幅と呼ばれる、幅が固定されていないフォントがあります。たとえば、★∀“”などの記号が曖昧文字幅になっているようです。ターミナルでは、これらが全角幅ではなく、半角幅で表示されていまダブルクォートは半角でも問題ありませんが、全角幅を期待している記号の場合は困ります。

ambiguous-width_1.png
記号が崩れて表示されている

全角幅で表示されてほしい文字が半角幅になっているのが分かります。理想は、次のような表示だと思います。

ambiguous-width_2.png
記号がある程度正しく表示されている

ターミナルの設定で曖昧文字幅を全角幅に固定にすることで問題を少しだけ軽減できます。ここでは、gnome-terminalで説明しますが、xtermやxfce4 terminal、またmacOSのtermnalやiTerm2にも同じような設定があると思います。

Terminalの設定

terminalの設定で曖昧文字幅を全角幅します。preferenceambiguous-widthWideに設定するだけです(初期値はNarrow)。手っ取り早く簡単ですが、その精度には疑問があります。

ambiguous-width_3.png

Vimの設定

Vimの設定で曖昧文字幅を全角幅にします。しかし、どの程度効果があるのか不明です。

vimなら~/.vimrcに、Neovimなら~/.config/nvim/init.vimに次の命令を記述します(ネットで見つけたものですが、出典は失念してしまいました)。

$ vi ~/.vimrc
set encoding-utf8
if exists('&ambw')
  set ambiwidth=double
endif

曖昧文字幅はUTF-8の問題なので、エンコードをUTF-8に設定しておく必要がありそうです。なお、半角幅(ASCII)にする場合は、narrowではなく、ambiwidth=singleにします。しかし、端末エミュレーターの設定を継承している可能性もあって、よく理解していません。

また、<C-L>で画面の再描写が出来ます。

更新情報