gVimのフォントとサイズを変更する(guifont)
gVimのvimrcにset guifontを書いても表示が変わらない、という詰まり方をしたことがあります。原因は設定の書式でも綴りでもなく、ターミナル版のVimを使っていたという単純な話でした。guifontはGUI版だけのオプションで、しかも書式がOSごとに違い、名前を間違えても環境によってはエラーすら出ません。躓きやすいポイントを順番に潰していきます。
検証環境:macOS同梱のVim 9.1.1752(GUI無しビルド)とNeovim 0.12.4で確認しました。オプションの既定値と、ターミナル版でset guifontがどう扱われるかは実行結果の実物です。手元にGUI版のVimが無いため、実際にフォントが切り替わる様子と:set guifont=*のダイアログは確認していません。その部分は公式ヘルプ(:help gui-font)の記述を根拠に書いています。
目次(9項目)
| コマンド | これだけ覚える |
|---|---|
:set guifont? | 今のフォント設定を確認する |
set guifont=Consolas:h12 | Windows / macOS の書式 |
set guifont=Consolas\ 12 | Linux(GTK)の書式 |
set guifont=* | フォント選択ダイアログを出す |
ターミナル版には効かない
'guifont'はヘルプに「GUI有効でコンパイルされている場合のみ利用可能」と書かれているオプションです。ターミナルで動かしているVimやNeovimの文字は、Vimではなくターミナルアプリ側が描いています。iTerm2やWindows Terminal、Alacrittyなどの設定でフォントを変えるのが正解で、vimrcをいくら書き換えても変わりません。
厄介なのは、間違えていることに気づけない点です。手元のGUI無しビルドのVimで実際に設定してみたところ、エラーは出ないのに値が入りませんでした。
:echo has('gui_running') " → 0(GUIで動いていない)
:set guifont=Consolas:h12
:set guifont?
guifont= " 空のまま。設定は黙って捨てられている
まずは:echo has('gui_running')で1が返るかを確認します。0ならターミナル版なので、Vimの設定をいじる手を止めてターミナル側を見に行ってください。
Neovimの場合は少し事情が違い、TUI(ターミナル)ではguifontを無視しますが、値そのものは保持します。手元のNeovim 0.12.4で確認したところ、何も設定していない状態で既定値が入っていました。
guifont=SF Mono,Menlo,Monaco,Courier New,monospace
この値はNeovide、nvim-qt、Neovim内蔵GUIといったGUIクライアント側が読んで使うものです。TUIで動かしている限りは表示に影響しません。
書式はOSごとに違う
ここが最初の関門です。サイズの付け方がGUIの種類によって変わります。
| GUI | 書式 | 例 |
|---|---|---|
| Windows / macOS | フォント名 + :h + ポイント数 | Consolas:h12 |
| Linux(GTK) | フォント名 + 半角スペース + ポイント数 | Andale Mono 11 |
フォント名に空白が含まれる場合は、設定ファイルに書くときにバックスラッシュでエスケープします。ヘルプは「オプションを設定するには空白とバックスラッシュの前にさらにバックスラッシュが必要」と説明しています。
set guifont=DejaVu\ Sans\ Mono:h12 " Windows / macOS
set guifont=DejaVu\ Sans\ Mono\ 12 " Linux(GTK)。サイズの前の空白もエスケープする
GTKの書式ではサイズ自体が空白区切りなので、エスケープする空白が1つ増えます。ここを間違えるとフォント名の一部として解釈されるので、うまくいかないときは真っ先に数え直す場所です。
サイズだけを上げ下げする
「フォントはこのままでサイズだけ大きくしたい」という用途で困るのが、'guifont'にサイズだけを指定する書き方が無いことです。値はフォント名とサイズをまとめた1つの文字列なので、書き換えるときも文字列ごと入れ替えます。とはいえ毎回打ち直すのは面倒なので、数値部分だけを置換するマッピングを用意しておくと実用的です。
" Windows / macOS(:h のあとの数値を増減させる)
nnoremap <C-Up> :let &guifont = substitute(&guifont, ':h\zs\d\+', '\=submatch(0)+1', '')<CR>
nnoremap <C-Down> :let &guifont = substitute(&guifont, ':h\zs\d\+', '\=submatch(0)-1', '')<CR>
置換の部分だけを取り出して手元で動かし、意図どおりの文字列になることを確認しました。GUIが無い環境でも文字列処理としては検証できます。
元: Consolas:h12
+1: Consolas:h13
-1: Consolas:h11
GTKの書式なら末尾の数値が対象になるので、パターンを'\d\+$'に変えます。こちらも同じ手順でAndale Mono 11がAndale Mono 12になることを確認しました。まだ空いているキーに割り当てておくと、プレゼンや画面共有のときにその場で拡大できます。
フォント名が分からないとき
正確な名前が分からないなら、Vimに選ばせるのがいちばん確実です。値に*を指定するとフォント選択ダイアログが開きます(Win32・GTK・Motif・macOS・Photonで利用可)。
:set guifont=*
ダイアログで選んだあとに:set guifont?を実行すると、Vimが解釈できる正式な文字列が表示されるので、それをそのままvimrcに書き写せば確実です。
もうひとつ知っておきたいのが、名前を間違えたときの挙動がGUIによって違うことです。ヘルプにはGTKの挙動が明記されています。
As to the GTK GUIs, no error is given against any invalid names, and the first element of the list is always picked up and made use of.
GTKは名前を厳密に照合せず、指定された文字列からパターンを組み立てて一番近いフォントを選びます。そのため綴りを間違えてもエラーにならず、別のフォントが静かに使われます。「設定したのに何か違う」という違和感が出たら綴りを疑ってください。Windows・macOSでは読み込めるフォントが1つも無ければエラーになり、その場合Vimは今の設定を維持します。
候補をコンマ区切りで並べておくと、環境ごとにフォントの有無が違っても最初に見つかったものが使われます。共用のdotfilesではこの書き方が便利です。
set guifont=Cica:h14,Consolas:h12,Courier\ New:h12
なお、指定するフォントは等幅である必要があります(GTKは例外で等幅以外も受け付けますが、表示は崩れます)。
全角文字を別のフォントにする
半角は英字向けのフォント、全角は日本語フォント、と分けたい場合は'guifontwide'を使います。全角幅の文字にだけ適用される設定で、コンマ区切りで並べると読み込めた最初のフォントが使われます。
set guifont=Consolas:h12
set guifontwide=MS_Gothic:h12
ここでサイズを揃えていないと行の高さが揃わず、日本語混じりの行だけ間延びして見えます。両方に同じポイント数を書くのが基本です。日本語と英字で見た目の幅比が合わないときは、タブや行末スペースを可視化して桁ずれの原因を切り分けると早く気づけます。
リガチャを有効にする
FiraCodeやCicaのように=>や!=を1つの記号に合成するフォントを使う場合、フォントを指定しただけでは合字が有効になりません。GTKとWin32のGUIには'guiligatures'という専用のオプションがあり、合成に使ってよいASCII文字をここに列挙します。
set guifont=Fira\ Code:h12
set guiligatures=!\"#$%&()*+-./:<=>?@[]^_{\|~
空文字列にすると合字が無効になります。設定を変えると画面表示に即時反映されるので、うるさく感じたらその場で戻せます。macOSのMacVimはこのオプションを持たないため、合字の扱いはビルド側の実装に依存します。
GUI版とターミナル版で設定を分ける
同じdotfilesを両方の環境で使い回すなら、GUIのときだけ適用されるように囲っておきます。
if has('gui_running')
set guifont=Consolas:h12
set guifontwide=MS_Gothic:h12
endif
そもそもGUI専用の設定は.gvimrc(Windowsなら_gvimrc)に分けて書く方法もあります。こちらはGUIで起動したときだけ読み込まれるので、条件分岐を書かずに済みます。.vimrcと.gvimrcの読み込み順の違いでハマる場合があるので、プラグインの設定が絡むときは合わせて確認してください。メニューやツールバーの表示切り替えも同じ場所に置くと管理しやすくなります。
ターミナル版のVimでguifontが効かず、綴りやエスケープを何度も書き直していたことがあります。has('gui_running')が0だと知った瞬間に全部が腑に落ちたのですが、そこにたどり着くまでが長かったです。Linuxで作業していた時期には、フォント名を1文字間違えたまま「なんとなく違うな」と思いつつ数日使っていたこともありました。GTKがエラーを出さずに近いフォントを拾ってしまうためで、それ以来:set guifont?で実際に入った値を確認する癖がつきました。
まとめ
'guifont'はGUI版だけのオプションなので、まず:echo has('gui_running')で自分がどちらを使っているか確かめるのが出発点です。書式はWindowsとmacOSが:h12、Linux(GTK)が空白区切りで、フォント名の空白はバックスラッシュでエスケープします。名前が分からなければ:set guifont=*で選び、:set guifont?で入った値を確認するのが確実です。GTKは間違った名前でもエラーを出さずに近いフォントを使うので、思ったとおりにならないときは綴りを疑ってください。日本語を別フォントにするなら'guifontwide'、合字を使うならGTK/Win32の'guiligatures'を合わせて設定します。