← Vim研究所

Vimでウインドウを閉じる4つの方法の違い

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

ウインドウを分割して作業していると、閉じ方には複数の選択肢があることに気づきます。:qで足りる場面もあれば、意図せずVim自体が終了してヒヤッとすることもあります。それぞれの違いを整理します。

4つの差が出るのは「ウインドウが消えるか」だけでなく「閉じたあとバッファに何が残るか」です。この記事に書いた挙動は、macOS 26.4.1 上の Vim 9.1(patches 1-1752)と Neovim 0.12.4 を実際に分割して打ちながら確かめました。数字はすべてwinnr("$")getbufinfo()が返した実測値です。

目次(8項目)
キーこれだけ覚える
Ctrl-w q / :qウインドウを閉じる(最後の1枚だとVimごと終了)
:q!未保存の変更があっても強制的に閉じる
Ctrl-w c / :closeウインドウだけ閉じる(最後の1枚では失敗しVimは終了しない)
:hide未保存の変更があっても常に成功して隠す

1. カレントウインドウを終了する(:quit)

Ctrl-w q
:quit
:q

最も一般的な閉じ方です。複数ウインドウが残っていればカーソルのあるウインドウだけが閉じられ、表示していたバッファがバッファ一覧から消えるわけではありません(バッファ・ウィンドウ・タブの関係)。最後の1枚での挙動、未保存の変更があるときの挙動は下の表で比較します。

ただし「一覧に残る」と「中身が残る」は別の話です。vim -Nu NONE a.txtで開いて:split b.txtするとwinnr("$")は2、:qで1に戻ります。この時点でgetbufinfo("b.txt")[0]を見るとlistedは1のまま、loadedは0でした。:ls!の行も2 # "b.txt" line 0で、隠れバッファに付くhのフラグがありません。一覧には並ぶがメモリからは降ろされた、という状態です。

降ろされると失われるものがあります。c.txtに1行足して保存し、:qで畳んでから:split c.txtで開き直し、uを押しても、Vim 9.1では何も戻りませんでした(行数は足したあとの2のまま)。同じ手順をNeovim 0.12.4でやるとuが効いて行数が1に戻ります。分かれ目は'hidden'の既定値で、Vim 9.1はnohidden、Neovim 0.12.4はhiddenでした。同じキーを打っても、アンドゥ履歴が生き残る側と消える側があります。

Ctrl-w q:quitと同じ動きをします。:vimgrepの結果を確かめるために開いた一時的な分割のように、閉じたあとそのバッファに戻る気がないウインドウなら:qで構いません。逆に、書きかけのファイルを一度画面から外したいだけの場面には、アンドゥ履歴ごと降ろしてしまう:qは向きません。

2. カレントウインドウを強制終了する(:quit!)

:quit!
:q!

未保存の変更があっても閉じられます。名前の似ている:close!と並べて覚えている人が多いのですが、この!の意味は正反対です。

:split b.txtで分割し、iで数文字足してから:q!を打つと、ウインドウは閉じ、getbufinfo("b.txt")[0]changed=0loaded=0になりました。:e b.txtで開き直すと1行目はBBBで、これはディスク上の元の内容です。足した文字はどこにも残っていません。:help :quitにも、'hidden'がセットされていてもバッファの内容は失われると書かれています。

まったく同じ手順を:close!で試すと、changed=1loaded=1のままでした。ウインドウは消えても編集は生きています。:q!!は「変更を捨てる」、:close!!は「変更を抱えたまま畳む」です。捨てるつもりがないなら:q!は打たないほうが安全です。

影響が及ぶのはカレントウインドウが表示しているバッファだけで、他のウインドウは開いたままです。試しに書き散らしたファイルを元に戻したいとき、:e!で読み直す代わりに:q!で畳んで捨てる、という使い方が実際の出番になります。

3. カレントウインドウを閉じる(:close)

Ctrl-w c
:close
:clo

最後のウインドウでは失敗して閉じられない点が:quitとの最大の違いです。未保存の変更に対する扱い自体は:quitと同じで、そのバッファを表示している最後のウインドウなら閉じようとして失敗します('hidden'がセットされていれば成功します)。ウインドウ分割だけを解消したい、Vim自体は終了させたくないという場面ではこちらを使います。

カレントタブページにウインドウが1つしかなく、他にタブページがある場合は、このコマンドを実行するとカレントタブページごと閉じる点も覚えておく必要があります。ウインドウの数だけでなく、タブの数も意識しておくと予期せぬ挙動に驚かずに済みます。

この境目は数えると分かりやすくなります。:tabnew b.txttabpagenr("$")を2にし、2枚目のタブでウインドウが1つの状態から:closeを打つと、tabpagenr("$")が1に減ってカレントバッファがa.txtに戻りました。エラーは出ません。E444: Cannot close last windowが出るのは、タブも含めて画面上のウインドウが本当に最後の1枚だったときだけです(タブの開き方と切り替え)。

そのquickfixとヘルプには専用の閉じ方があります。どのウインドウにカーソルがあっても、:ccloseはquickfixウインドウを、:helpcloseはヘルプウインドウを閉じます。:onlyでウインドウを1枚にまとめ、:help windowsを開いてwinnr("$")が2になったあと、:helpcloseで1に戻りました。このあいだlen(getbufinfo({"buflisted":1}))は3のままで、ヘルプの開閉はバッファ一覧に何も足しません。目的のウインドウへカーソルを移してから:closeを打つ手間が省けます。

4. カレントウインドウを隠す(:hide)

:hide
:hid

他の3つと違い、未保存の変更があっても'hidden'の設定に関係なく閉じられます。バッファへの変更は保存されず、失われることもないため「安全な」コマンドとされています。

手元でも同じ形になりました。'hidden'がオフのまま:split b.txtして数文字足すと、:close:qE37: No write since last changeで止まります。同じ状態から:hideを打つとウインドウは畳まれ、getbufinfo("b.txt")[0]changed=1loaded=1のままでした。実行後に&hiddenを確認しても0で、このコマンドはオプション自体を書き換えません。:hide {cmd}と引数を付けた形だけが、その1コマンドのあいだ'hidden'を立てます。

ここでいう「安全」は「必ず成功する」という意味ではありません。ウインドウが1枚しかない状態で:hideを打つと、:closeとまったく同じE444で断られました。安全なのは編集内容の扱いのほうで、閉じられるかどうかは別の条件です。

逆に、バッファごと片付けたいときに使うのが:bdeleteです。:closeのあともlen(getbufinfo({"buflisted":1}))は2のままですが、:bdelete b.txtを打つと1に減り、:ls!の行が2u#に変わります。このuが一覧から外れた印です(:lsの読み方と絞り込み方)。

:bdeleteはウインドウを閉じるコマンドではありませんが、結果としてウインドウが減ります。同じb.txtを2枚のウインドウで開いてwinnr("$")が3の状態で:bdelete b.txtを打つと、そのバッファを映していた2枚がまとめて閉じて1になりました。「バッファを消したらレイアウトまで変わった」という驚きはここから来ます。

コマンド最後の1枚を閉じると未保存の変更('hidden'オフ時)
:qVimごと終了失敗する(E37)
:q!Vimごと終了強制的に破棄して閉じる
:close失敗する(E444、Vimは終了しない)失敗する(E37)
:close!失敗する(E444、Vimは終了しない)変更を抱えたまま閉じる
:hide失敗する(E444、Vimは終了しない)常に隠して閉じる(失敗しない)
要点:Vimごと終了してよいなら:q、ウインドウ分割だけ解消したいなら:closeを使います。未保存の変更をとにかく安全に隠したいなら:hideを使います。

Ctrl-w Ctrl-cが効かない理由

Ctrl-w cがあるならCtrl-w Ctrl-cでもいけそうに思えますが、Ctrl-c単体がコマンドキャンセルとして予約されているため、この組み合わせは機能しません。紛らわしいので覚えておくと安心です。

2枚に分割した状態で押してみると、winnr("$")は2のままでエラーも出ませんでした。続けてCtrl-w cを押すと1になります。:help CTRL-W_CTRL-Cにも、Ctrl-cがコマンドをキャンセルしてしまうので動かないと明記されています。無反応なぶん、キーの取りこぼしと区別が付きません。

ややこしいのは、他のCtrl-w系はCtrlを押したままでも通ることです。同じ2枚の状態でCtrl-w Ctrl-wを押すとカレントバッファがa.txtに移り、ウインドウ移動としてきちんと働きました(ウインドウ間のカーソル移動)。移動はCtrl込みで打てるのに閉じるときだけ打てない、という非対称が引っかかりの正体です。

使い分けの指針

迷ったら次のように考えると分かりやすくなります。

Neovimを使っているなら、もう一段の注意が要ります。既定で'hidden'がオンなので、書きかけのバッファでも:qが通ります。:split b.txtして数文字足してから:qを打つと、winnr("$")は1に戻り、changedは1のまま画面から消えました。VimならE37で止まる場面です。

厄介なのは、そのあと最後の:qE162: No write since last change for buffer "b.txt"が出て終了できないことです。エラーが出るのは編集した瞬間でも畳んだ瞬間でもなくVimを閉じようとした瞬間で、しかも名指しされたバッファはもう画面のどこにもありません。Vim側でも:set hiddenしていれば:qallで同じE162が出ました。分割を畳んだあとに:lsを開き、+の付いたバッファを数えておくと、この宙ぶらりんを早く見つけられます。

使ってみて

Neovimに移った直後、上下に分割した片方でREADMEを直しかけたまま:qで畳みました。Vimでは畳めない場面だったので、畳めた時点で保存も済んだものと思い込み、そのまま別のファイルを1時間ほど触っていました。抜けようとしたところで見知らぬバッファ名を突き付けられ、どのファイルのことか思い出すのに数分かかりました。畳めたかどうかを保存の合図として読んでいたのが間違いでした。

まとめ

ウインドウを閉じる方法は4種類ありますが、実務で意識すべきは「最後の1枚を閉じたときにVimごと終了するか」の違いです。ウインドウ分割の解消が目的なら:closeを選ぶと事故が起きにくくなります。分割の作り方、今のウインドウ以外を全部閉じたい場合はCtrl-w o と :onlyを参照してください。

関連記事

← Vim研究所 トップへ戻る