← Vim研究所

gVimのメニュー・ツールバー・スクロールバーを消す(guioptions)

2020-01-26 公開 ・ 更新: 2026-09-03

gVimを開くと、上部にメニューバー、ツールバー、横にスクロールバーとGUIパーツがずらりと並びます。マウス操作前提の要素ばかりで、キーボード中心の操作をするなら画面を圧迫するだけに感じます。消す手段はguioptionsオプション1つにまとまっていて、どのパーツを残すかは1文字ずつのフラグで決めます。

この記事の実測はmacOS 26.4.1上のVim 9.1.1752とNeovim 0.12.4で行いました。手元のVimはhas("gui")0を返すGUI機能なしのビルドなので、gVimのウィンドウは開いていません。画面がどう変わるかは:help 'guioptions'の記述を根拠に書き、値の受け取られ方や足し引きの規則だけを端末で実際に打って確かめています。
目次(8項目)

guioptionsの主なフラグ

guioptionsの値は1文字のフラグを並べた文字列です。egmrLtTと書いてあればegmがそれぞれ独立した指定で、文字が入っていればその要素が有効になります。並び順に意味はなく、同じ文字を2つ書いても効果は変わりません。

フラグ入っているときの意味
mメニューバーを出す
Mシステムのメニュー定義(menu.vim)を読み込まない
g使えないメニュー項目を灰色で残す(外すと項目ごと消える)
tメニューの切り離し(ティアオフ)項目を出す
Tツールバーを出す
eタブページをGUIのタブで描く
r右スクロールバーを常に出す
R右スクロールバーを垂直分割時だけ出す
l左スクロールバーを常に出す
L左スクロールバーを垂直分割時だけ出す
b下(水平)スクロールバーを出す
h下スクロールバーの幅をカーソル行の長さに抑える
kパーツを増減してもウィンドウの大きさを保つ
a選択した時点で*レジスタに渡す(自動選択)
A自動選択のうちモードレス選択だけを対象にする
c簡単な確認ダイアログをコマンドラインで出す
iVimのアイコンを使う
!外部コマンドを端末ウィンドウで実行する

大文字と小文字が対になっているのは、スクロールバーのrRlL、それに自動選択のaAだけです。他の大文字は小文字の強い版ではなく、まったく別の指定になっています。

読み違えやすいのがMkで、この2つは文字が入っていると何かを表示するのではなく、既定の動きのほうを止めます。M$VIMRUNTIME/menu.vimを読み込まない指定、kはパーツが増減してもウィンドウの大きさを維持する指定です。消したいものを消すつもりでこの2つを外すと、狙いと逆のことが起こります。

今の値を見てから1文字ずつ足し引きする

既定値はビルドによって違います。:help 'guioptions'はMS-WindowsがegmrLtT、GTKとMotifがaegimrLtTと書き、MS-Windowsではdefaults.vimtを外すと注記しています。手元の/usr/share/vim/vim91/defaults.vimにもset guioptions-=tの行がありました。MacVimのような個別のGUIの既定値はヘルプに無いので、環境ごとに読み出すしかありません。

:set guioptions?          " 今の並びを見る
:verbose set guioptions?  " どのファイルの何行目で決まったかも見る

値を変えるやり方は3つあります。+=は文字を足し、-=は文字を抜き、=は文字列ごと置き換えます。=で書くと、そのとき自分が知らなかったフラグまで一緒に消えます。ヘルプが+=-=を使うよう勧めているのは、あとから増えるフラグで困らないようにするためです。

:set guioptions-=m   " メニューバーを消す
:set guioptions+=M   " menu.vim を読み込まない
:set guioptions=     " 全部消す。増えたフラグも一緒に消える

ここに落とし穴があります。-=は「書いた文字を1つずつ取り除く」のではなく「書いた文字列がそのまま含まれていたら取り除く」という動きです。ヘルプはこの点を、ほかならぬguioptionsを例にして注意しています。

Note that you should add or remove one flag at a time. If 'guioptions' has the value "ab", using "set guioptions-=ba" won't work, because the string "ba" doesn't appear.

GUI機能なしのVimではguioptionsの値を読み出せないので、同じくフラグの並びを値に取るformatoptionsで規則のほうを確かめました。引用にあるabbaをそのまま使っています。

:set fo=ab
:set fo-=ba     " 何も起きない
:echo &fo
ab
:set fo-=ab     " 並びが合えば消える
:echo &fo
                " 空になった

-=baは値を変えず、画面にもv:errmsgにも何も残りませんでした。値に含まれていない-=zも同じく無言です。書き間違えても気づく手がかりが無い、というのがこのオプションの厄介なところです。

この規則があるので、よく見かけるset guioptions-=mTrlbのようなまとめ書きは当てになりません。MS-Windowsの既定値egmrLtTにもGTKのaegimrLtTにもmTrlbという並びは含まれていないため、1文字も消えないまま終わります。ヘルプが「1つずつ足し引きする」と書いているのはこの意味です。

" .vimrc に置く
set guioptions-=m    " メニューバー
set guioptions-=T    " ツールバー
set guioptions-=r    " 右スクロールバー(常時)
set guioptions-=R    " 右スクロールバー(分割時)
set guioptions-=l
set guioptions-=L
set guioptions-=b

この7行で目に見えるパーツはほぼ無くなります。既定値に無い文字を引いても害はないので、環境ごとの既定値を調べる前に書いてしまって構いません。

使ってみて

Windowsで環境を作り直したとき、まとめ書きの1行を_vimrcに貼って起動したのに、画面が何も変わりませんでした。エラーが1つも出ないので設定ファイルが読まれていないと思い込み、:echo $MYVIMRCを打ったり置き場所を変えたりして半日ほど遠回りしました。犯人が行の中身だと分かったのは、試しに1文字だけの行に書き直してみたときです。

スクロールバーは常時と分割時で分かれる

スクロールバーだけフラグが4つあるのは、左右の位置と、出す条件の組み合わせだからです。小文字のrlは常に出し、大文字のRLはウィンドウを垂直分割しているときだけ出します。分割を多用するなら大文字が向いていて、縦に割れたときだけ帯が増えるので位置の目印になります。常時表示の小文字は1画面で書いているあいだも本文の幅を取り続けます。

下の水平スクロールバーはbで、こちらは長さの決まり方が特殊です。既定では表示中でいちばん長い行に合わせますが、hを足すとカーソル行の長さだけを見るようになります。折り返しを切って横に長いファイルを扱うとき、行を移動するたびに目盛りが伸び縮みするのが気になるならhが効きます。

全部消してよいかの判断材料は、現在位置を別の手段で見られているかどうかです。numberrulerが出ていれば、スクロールバーが担っていた情報は失われません。

メニューを消したあとの呼び出し方

mを外して消えるのはメニューバーの表示だけです。Mを足していなければ$VIMRUNTIME/menu.vimは読み込まれたままなので、項目そのものは生きています。呼び出しは:emenuで、コマンド名のあとにTabを押すと項目名が補完されます。

:emenu File.Save
:emenu <Tab>          " 補完で項目を探す

手元の端末Vimでもhas('menu')1exists(':emenu')2を返しました。GUIでなくてもコマンド自体は用意されています。文字コードを指定して開き直す、印刷する、といったメニュー頼りだった操作は、この形なら残せます。

読み込みそのものを止めたいときはset guioptions+=Mです。消すのに文字を足す形なので、他のフラグと同じ感覚で-=Mと書いても何も起きません。Mを入れると:emenuで呼べる項目も無くなります。ただしこの1文字だけは書く場所が決まっていて、.gvimrcでは手遅れです。理由と切り分け方は.vimrcと.gvimrcの読み込み順で扱っています。

メニューを残す側の調整がgです。文字が入っていれば今は使えない項目が灰色で残り、外すと項目ごと消えます。位置を体で覚えているなら残したほうが迷いません。tはメニューを切り離して小窓にするティアオフの項目です。

タブページとウィンドウの大きさ

eはタブページの描き方を選ぶフラグです。文字が入っているとGUIのタブが使われ、外すと端末と同じテキストのタブバーになります。

Add tab pages when indicated with 'showtabline'. 'guitablabel' can be used to change the text in the labels. When 'e' is missing a non-GUI tab pages line may be used.

引用のとおり、タブバーが出るかどうかを決めているのはeではなくshowtablineです。eはそこに描くものをGUIのタブにするかどうかだけを切り替えます。値の意味と使い分けはshowtablineでタブバーを出す条件にまとめてあります。GUIのタブが使えるのはGTK、Motif、macOS、Haiku、MS-Windowsだけだとヘルプの同じ箇所にあり、そこから外れるビルドではeを入れても端末と同じ見た目になります。

ラベルの文字を変えるguitablabeleが入っているときだけ使われ、外した側ではtablineが使われます。端末とGUIで見た目を揃えたいならeを外してtablineに寄せると、設定が1本で済みます。

パーツを消すとウィンドウの見え方も変わります。既定ではVimがlinescolumnsの値を保とうとするため、ツールバーを消したぶんウィンドウのほうが縮みます。

Keep the GUI window size when adding/removing a scrollbar, or toolbar, tabline, etc. Instead, the behavior is similar to when the window is maximized and will adjust 'lines' and 'columns' to fit to the window. Without the 'k' flag Vim will try to keep 'lines' and 'columns' the same when adding and removing GUI components.

kを足すと向きが入れ替わり、ウィンドウの大きさは動かないままlinescolumnsが実際の広さに合わせて変わります。ウィンドウマネージャ側で位置と大きさを決めている環境ならこちらが素直です。設定ファイルでlinescolumnsを指定している場合は、指定した値と画面の見え方のどちらがずれるかがkの有無で変わるので、両方試して合うほうを選びます。

Neovimでの扱い

Neovimにguioptionsはありません。本体は画面を描かず、ウィンドウの見た目はNeovideやnvim-qtのようなクライアント側が決めます。設定の置き場所も分かれるので、init.vimとginit.vimの違いnvim-qtの起動オプションが実際の入口になります。

厄介なのは、問い合わせ方によって答えが食い違う点です。Neovim 0.12.4でもexists('&guioptions')1を返します(隠しオプションにも&1を返すので、これはVimと同じ振る舞いです)。実体があるかどうかを見るexists('+guioptions')のほうは0です。そのうえで:set guioptions?は空の値を返してエラーになりませんでした。Vimがこの問い合わせでE519を出すのと逆で、値を書き込もうとしたときだけ止まります。

:set guioptions?
  guioptions=
:set guioptions=egmrLtT
E519: Option not supported: guioptions=egmrLtT
:set guioptions-=m        " これは何も言われない

通るのは-=だけでした。値が空のまま何を引いても結果が空で変わらないため、書き込みの手前で終わっているという読みです。+==E519で止まります。ただしinit.vimにこの行を残しても以降が読まれなくなるわけではなく、起動時にメッセージが出てEnter待ちになるだけでした。エラーの次に書いたset numberはそのまま効いています。

GUI機能なしのVimは正反対で、:set guioptions=egmrLtTが無言で通り、:set guioptions?のほうがE519を返します。読み書きのどちらが通るかが実装で逆転しているので、片方で試した感触をもう片方に持ち込まないほうが安全です。この非対称が起きる仕組みは隠しオプションの扱いで書いています。

まとめ

つまずくのは値そのものより足し引きのやり方のほうです。:set guioptions?で今の並びを見て-=を1行に1文字ずつ書く、という形にしておけば、あとは残したいものを選ぶだけになります。見た目の残り半分を占めるフォントと文字の大きさは、guifontでの指定が担当します。

関連記事

← Vim研究所 トップへ戻る