← Vim研究所

gVimのフォントとサイズを変更する(guifont)

2026-08-03 公開 ・ 更新: 2026-10-01

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 :help gui-init :help getfontname())の記述を、Neovideの設定はNeovideの公式ドキュメントを、Windows Terminalのキーは同ソフトの既定設定ファイルを根拠に書いています。

目次(9項目)
コマンドこれだけ覚える
:set guifont?今のフォント設定を確認する
set guifont=Consolas:h12Windows / macOS の書式
set guifont=Consolas\ 12Linux(GTK)の書式
set guifont=*フォント選択ダイアログを出す

ターミナル版には効かない

'guifont'はヘルプに「GUI有効でコンパイルされている場合のみ利用可能」と書かれているオプションです。ターミナルで動かしているVimやNeovimの文字は、Vimではなくターミナルアプリ側が描いています。iTerm2やWindows Terminal、Alacrittyなどの設定でフォントを変えるのが正解で、vimrcをいくら書き換えても変わりません。

厄介なのは、間違えていることに気づけない点です。手元のGUI無しビルドのVimで実際に設定してみたところ、設定する側ではエラーが出ないのに値が入りませんでした。

:echo has('gui_running')   " → 0(GUIで動いていない)
:echo exists('+guifont')   " → 0(このビルドにはオプション自体が無い)
:set guifont=Consolas:h12  " 何も表示されない
:echo &guifont            " 空文字。設定は黙って捨てられている
:set guifont?
E519: Option not supported: guifont?

GUI無しのビルドには'guifont'の実体が無く(exists('+guifont')が0)、代入だけは黙って受け付けて値を捨てています。:let &guifont = …で入れても空のままでした。vimrcを共用してもエラーにならないための作りですが、そのぶん効いていないことに気づけません。値を問い合わせたときに初めてE519が出ます。

まずは:echo has('gui_running')で1が返るかを確認します。0ならターミナル版なので、Vimの設定をいじる手を止めてターミナル側を見に行ってください。サイズだけならショートカットで足ります。Windows Terminalは既定でCtrl-+とCtrl--が拡大と縮小、Ctrl-0が元に戻す操作で、macOSのターミナル.appはメニューの「大きく」「小さく」です。

Neovimの場合は少し事情が違い、TUI(ターミナル)ではguifontを無視しますが、値そのものは保持します。手元のNeovim 0.12.4で確認したところ、何も設定していない状態で既定値が入っていました。

guifont=SF Mono,Menlo,Monaco,Courier New,monospace

この値はNeovide、nvim-qt、Neovim内蔵GUIといったGUIクライアント側が読んで使うものです。TUIでは表示に影響しません。Neovideのドキュメントはvim.o.guifont = "Source Code Pro:h14"のように:h付きの書式を示しており、倍率だけを変えるg:neovide_scale_factorも用意しています。GUIクライアントだけに効かせる設定の置き場所はinit.vimとginit.vimの使い分けで扱っています。

書式は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', 'g')<CR>
nnoremap <C-Down> :let &guifont = substitute(&guifont, ':h\zs\d\+', '\=submatch(0)-1', 'g')<CR>

置換の部分だけを取り出して手元で動かし、意図どおりの文字列になることを確認しました。GUIが無い環境でも文字列処理としては検証できます。

元: Consolas:h12
+1: Consolas:h13
-1: Consolas:h11

GTKの書式なら末尾の数値が対象になるので、パターンを'\d\+$'に変えます。こちらも同じ手順でAndale Mono 11がAndale Mono 12になることを確認しました。まだ空いているキーに割り当てておくと、プレゼンや画面共有のときにその場で拡大できます。

末尾の'g'は、次の節のコンマ区切りの候補リスト対策です。無いと先頭のフォントしか書き換わらず、先頭のフォントが無いPCでは2番目が使われるので、押しても見た目が変わりません。小数のサイズ(Win32版はhに小数を認めています)は整数部分だけが動きます。

Cica:h14,Consolas:h12 → Cica:h15,Consolas:h12   " 'g' なし。2番目は12のまま
Cica:h14,Consolas:h12 → Cica:h15,Consolas:h13   " 'g' あり
Consolas:h10.5        → Consolas:h11.5

GTKの書式で候補を並べるなら、'\d\+$'は最後のフォントにしか当たらないので、'\d\+\ze\(,\|$\)'に'g'を付けます。Cica 14,Monospace 12がCica 15,Monospace 13になりました。いずれもVim 9.1.1752とNeovim 0.12.4でsubstitute()を実行した結果です。

どの大きさに合わせても字が小さすぎる・大きすぎると感じるなら、原因はフォントよりモニター側にあることがあります。同じ27型でも4KとWQHDでは1文字あたりの画素が違い、OSの拡大率を上げると作業領域は狭くなります。解像度と拡大率で何が変わるかはプログラマー向けモニターの比較で整理しています。

フォント名が分からないとき

正確な名前が分からないなら、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は例外で等幅以外も受け付けますが、表示は崩れます)。

リストのどれが使われたかはgetfontname()で確かめられます。引数なしなら今のフォント名を、引数を渡せばその名前が読めるかを調べ、読めなければ空文字を返します。ただしGUIの起動後しか働かないため、vimrcやgvimrcの中ではなくGUIEnterの自動コマンドから呼びます。GTKはどんな名前でも受け付けるので、正否の判定には使えません。手元のターミナル版Vimでは常に空文字で、Neovim 0.12.4も関数そのものはあるものの、TUIで呼ぶと同じく空文字が返ります。

CicaやNerd Fontsのように自分で入れたフォントは、ファイル名ではなくファミリー名で書きます。Linuxならfc-list : familyで一覧が出て、手元のmacOSで試すとHiragino Kaku Gothic ProN,ヒラギノ角ゴ ProN,...のように別名がコンマで並ぶので、どれか1つを選びます。Nerd Fontsはアイコンを1桁幅で作ったMono版と2桁幅の版を分けて配布しており、CousineNerdFontMono-Regular.ttfをfc-scanで読むとファミリー名はCousine Nerd Font Monoでした。書くならset guifont=Cousine\ Nerd\ Font\ Mono:h12です(GUIでの描画は未確認です)。

全角文字を別のフォントにする

半角は英字向けのフォント、全角は日本語フォント、と分けたい場合は'guifontwide'を使います。全角幅の文字にだけ適用される設定で、コンマ区切りで並べると読み込めた最初のフォントが使われます。

set guifont=Consolas:h12
set guifontwide=MS_Gothic:h12

ここでサイズを揃えていないと行の高さが揃わず、日本語混じりの行だけ間延びして見えます。両方に同じポイント数を書くのが基本です。ヘルプはもっと厳しく、全角用フォントは'guifont'のちょうど2倍の幅で同じ高さでないと正しく描かれない、と書いています。

もっとも、'guifontwide'は書かずに済む場合があります。ヘルプによると、GTK以外のGUIでは空のままならVimが合う全角フォントを探して自動で設定し、GTKでは'guifont'に無い文字をPangoが別のフォントで補います。まず:set guifontwide?で中身を見て、不満なときだけ指定すれば十分です。古いgvimrcによくある末尾のcSHIFTJISはWin32版だけの文字セット指定で、ヘルプは通常cDEFAULTでよいとしています。

リガチャを有効にする

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の読み込み順の違いでハマる場合があるので、プラグインの設定が絡むときは合わせて確認してください。メニューやツールバーの表示切り替えも同じ場所に置くと管理しやすくなります。

gvimrcの置き場所は、ヘルプの推奨ではUnix系が~/.gvimrcか~/.vim/gvimrc、Windowsが$HOME/_gvimrcか$HOME/vimfiles/gvimrcです。gvimrcは必ずvimrcの後に読まれるので、vimrcのguifontが効かないときはgvimrcやシステム全体の$VIM/gvimrcで上書きされていないかを疑います。実際に読まれたファイルはGUIで起動した状態の:echo $MYGVIMRCで分かります。

使ってみて

ターミナル版の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'を合わせて設定します。

関連記事

← Vim研究所 トップへ戻る