← Vim研究所

gVimでプラグイン設定が反映されない原因(.vimrcと.gvimrcの違い)

2026-08-03 公開 ・ 更新: 2026-09-03

ターミナルのVimでは効いていた設定がgVimで反映されない、あるいはその逆でgVimでは動くのにターミナルでプラグインが読み込まれない、という食い違いが起きます。どちらも設定を書いたファイルと、Vimがそれを読む時点がずれていることが原因です。.vimrc.gvimrcは名前こそ似ていますが、読まれるタイミングはかなり離れています。

この記事の実測は、macOS 26.4上のVim 9.1.1752で行いました。HOMEを一時ディレクトリに差し替え、tmuxの中でvim -n -i NONEを起動して画面から読み出しています。ただしこのVimはhas("gui")0を返すGUI機能なしのビルドなので、gVimを起動したときの画面そのものは確認していません。GUI側の挙動は:helpの記述を根拠に示し、実測と区別して書きます。

目次(8項目)

.vimrcと.gvimrcの役割分担

ファイル読まれる時点書くもの
.vimrc(Windowsでは_vimrc起動の早い段階。プラグインより前全般の設定、プラグイン管理、キーマッピング
.gvimrc(Windowsでは_gvimrcGUIの初期化時。プラグインより後フォント、ウインドウサイズ、メニューなどGUI固有の設定

この前後関係はヘルプに明記されています。

The gvimrc file is where GUI-specific startup commands should be placed. It is always sourced after the |vimrc| file. If you have one then the $MYGVIMRC environment variable has its name.

プラグインマネージャの設定やキーマッピングのような、ターミナルでもGUIでも効いてほしい設定を.gvimrcに書くと、ターミナル側では何も起こりません。Windowsではファイル名が_vimrc_gvimrcになり、個人のランタイムディレクトリも~/vimfilesです。

Neovimで同じ位置にあるのがinit.vimginit.vimですが、そちらはGUIが外部プロセスとして本体につながる作りのため事情が変わります。読む側がNeovim本体ではない点も含め、init.vimとginit.vimの違いで別に扱っています。

症状から設定ファイルを切り分ける

どちらに書いたかを思い出すより、Vimに聞いたほうが速くて確実です。症状と原因の対応はだいたい次の3通りに収まるので、当たりを付けてから確かめます。

症状疑う原因
gVimでは動くのにターミナルVimでプラグインが読み込まれないプラグイン管理の記述が.gvimrcに入っている
ターミナルVimでは動くのにgVimで一部の設定が反映されない.vimrc側の設定が.gvimrc側の記述で上書きされている
どちらでも効かず、エラーも出ない設定ファイルが読まれていないか、そのビルドに存在しないオプションを書いている
:echo $MYVIMRC
:echo $MYGVIMRC

採用されたファイルはこの2つの環境変数で分かります。手元の端末Vimでは前者が/private/tmp/vbgv.RP5R8X/.vimrcを返し、後者は空でした。上の引用のとおり$MYGVIMRCには見つかった.gvimrcの名前が入るので、gVimで起動しているのにここが空なら、そもそも置き場所が違っています。

読まれたファイルを全部見るなら:scriptnamesです。.vimrc~/.vim/plugin/p.vim~/.vim/after/plugin/a.vimを置いた状態の出力を抜粋します。

:scriptnames
  1: /usr/share/vim/vimrc
  2: ~/.vimrc
  3: ~/.vim/plugin/p.vim
  4: /usr/share/vim/vim91/plugin/colorresp.vim
 ...
 21: ~/.vim/after/plugin/a.vim

番号は読まれた順です。ここに.gvimrcが出てこなければ読まれていませんし、出てきた番号がプラグインより後なら上書きの疑いが立ちます。:scriptnamesの読み方は単体でも切り分けに効きます。

犯人を1行まで絞るなら:verboseを付けます。.vimrcset tabstop=4F5のマッピングを~/.vim/after/plugin/a.vimで上書きした状態の結果です。

:verbose set tabstop?
  tabstop=8
        Last set from ~/.vim/after/plugin/a.vim line 1

:verbose nmap <F5>
n  <F5>        * :echo "from plugin"<CR>
        Last set from ~/.vim/after/plugin/a.vim line 2

最後に設定したファイルと行番号まで返ります。オプションとマッピングの両方で使えるので、gVimだけ値が違うときはgVim側で打てば、.gvimrcの上書きかどうかがその場で分かります。

使ってみて

以前Windowsのマシンでうっかりプラグイン管理の設定を_gvimrcに書いてしまい、SSH越しのターミナルVimでプラグインが一切読み込まれず長時間悩んだことがあります。dotfilesは1つのリポジトリにまとめてあり両方が同じ場所に並んでいたので、読み込まれているつもりで_vimrcばかり読み返していました。別のファイルを疑うという発想が出てこなかったのが、遠回りした理由です。

.gvimrcが読まれるのはプラグインの後

ヘルプはVimの起動手順に番号を振っています。.vimrcを読むのが3番、:runtime! plugin/**/*.vimに相当するプラグインの読み込みが4番、GUIの初期化が8番です。

番号手順読まれるもの
3各種の初期化.vimrc
4プラグインの読み込みplugin/配下、パッケージ、after/plugin/配下
8GUIの初期化menu.vim.gvimrc

この順番を端末のVimで確かめました。.vimrcplugin/after/plugin/.gvimrcのそれぞれで同じリスト変数に自分の名前を足し、起動後に中身を表示しています。

:echo join(g:order,",")
vimrc,plugin,after/plugin

.gvimrcの印は付きませんでした。端末のVimがそのファイルを読まないという実測です。gVimではこの8番の位置でgvimrcが読まれる、というのが:help startupの書き方です(手元のビルドはGUIを持たないので、ここは実際に走らせて確かめてはいません)。順番が分かると症状の見え方が変わります。プラグインの多くはplugin/配下が読まれた時点で設定を確定させるので、動きを変える変数はその前に決めておく必要があります。.gvimrcは4番より後なので、書いても間に合いません。エラーも出ず、既定値のまま静かに動きます。探索先そのものを見たいときはruntimepathの確認方法が入口になります。

手遅れになる例はヘルプ自身が挙げています。システムのメニューを読み込ませないguioptionsMフラグは、GUIの設定でありながら.vimrcに書くよう指定されています。

Note that this flag must be added in the .vimrc file, before switching on syntax or filetype recognition (when the |gvimrc| file is sourced the system menu has already been loaded; the `:syntax on` and `:filetype on` commands load the menu too).

GUIが開いてからでないと効かない設定

.gvimrcまで届けば安心かというと、そうでもありません。GUIウィンドウが開くのは初期化が全部終わった後だからです。

But the GUI window is only opened after all the initializations have been carried out. If you want some commands to be executed just after opening the GUI window, use the |GUIEnter| autocommand event.

ウィンドウの位置や大きさのように、開いた後でなければ確定しない設定はここで取りこぼします。逃げ道がGUIEnterで、GUIの起動に成功してウィンドウが開いた後、gVimではVimEnterより前に発火するとヘルプにあります。

" ウィンドウが開いたあとに実行される
autocmd GUIEnter * winpos 100 50
autocmd GUIEnter * set lines=50 columns=180

この2行は.vimrcに置いても端末側の邪魔になりません。GUI機能なしの手元のVimで.vimrcに書いて起動し、exists("#GUIEnter")を見ると1が返りました。登録そのものは通り、イベントが起きないので発火しないだけです。置き場所に迷ったら.vimrc側に寄せるほうが安全です。

効かない設定がエラーにならない理由

読まれる順番が正しくても、設定が黙って無視される経路がもう1つあります。Vimは、そのビルドが対応していないオプションでも、値を代入するだけならエラーを出しません。ヘルプはこれを隠しオプションと呼んでいます。

When an option is not supported it may still be set without getting an error, this is called a hidden option. You can't get the value of a hidden option though, it is not stored.

:set guifont=Monaco:h13          " 何も言われない
:set guifont?
E519: Option not supported: guifont?
:echo "amp=" . exists('&guifont') . " plus=" . exists('+guifont')
amp=1 plus=0

GUI機能なしのVimで実際に打った結果です。代入は通り、値を読もうとした時点でE519になります。exists('&guifont')は隠しオプションにも1を返すため、本当に使えるかどうかの判定にはexists('+guifont')を使います。gVim用の設定をそのまま.vimrcへ移してもターミナル側が壊れないのは、この仕組みのおかげです。ただしlinescolumnsはGUI専用ではありません。端末のVimでもexists('+lines')1で、150桁のtmuxで起動したときの値は39x150でした(ペインはステータス行のぶん39行です)。.vimrcに素でset lines=50と書くと、端末側でも端末の大きさを変えにいきます。1ファイルにまとめるなら、やはり分岐で囲むのが確実です。

if has('gui_running')     " GUIで動いている、またはこれからGUIが始まる
  set guifont=Cascadia\ Code:h12
  set lines=40 columns=120
endif

判定に使う関数は2つあって、意味が違います。gui_runningのヘルプ上の説明は「Vim is running in the GUI, or it will start soon」で、これから始まる場合も含みます。gVimなら.vimrcの時点でウィンドウはまだ開いていませんが、この判定は真になるという読みです。もう一方のhas('gui')はビルドの状態を返すので、:help feature-listの説明どおりなら、gVimのバイナリを端末で起動しても真になります。

なおCascadia\ Codeのバックスラッシュは、文字列オプション全般の決まりであるoption-backslashによるもので、これが無いと値がスペースで切れます。書式そのものはguifontでフォントとサイズを変える方法、GUIパーツの指定はguioptionsの記事にあります。

uniteとvimfilerを今から入れる場合

このページのURLに残っているuniteとvimfilerは、gVimでプラグインが動かないという相談の定番だった組み合わせです。2026年9月時点の状況を作者のリポジトリで確かめると、どちらも開発が止まっていました。

Active development on vimfiler.vim has stopped. The only future changes will be bug fixes.

unite.vimのREADMEにも同じ形の告知があります。そちらは文中のプラグイン名がdenite.nvimのままですが、案内先はどちらもddu.vimで、vimfilerにはddu-ui-filerも併記されています。GitHubのAPIで見た最終pushはunite.vimが2023年5月18日、vimfiler.vimが2024年5月20日、ddu.vimは2026年8月26日でした。vimfilerはunite.vimに依存するので、片方だけ新しくする逃げ方も取れません。

今から入れるなら、ddu.vimに移るか別系統の道具に替えるかのどちらかです。ただしddu.vimはDenoとdenops.vimを前提にしているので、乗り換えの手間は小さくありません。ファイラーの選択肢はNeovimのファイラー比較にまとめてあり、プラグイン管理そのものを標準機能に寄せる話はNeovim 0.12のvim.packで扱っています。どちらに移っても、読み込みに関わる設定は.vimrc側という切り分けはそのまま通用します。

まとめ

効かない設定を追うときは、どちらに書いたかを思い出す前に:scriptnames:verboseでVimに聞くのが近道です。それでも出てこないなら、隠しオプションのように黙って捨てられている線を疑います。.vimrc、プラグイン、.gvimrc、GUIウィンドウという4段の順番のうち、自分の設定がどの段で置き去りになったのかが分かれば、直す場所は自然に決まります。

関連記事

← Vim研究所 トップへ戻る