取消Vim中的分屏窗口

293

我把窗口水平拆分了。现在该怎么回到正常模式,也就是没有拆分窗口,只有一个窗口,而不取消所有打开的窗口。我有5个窗口,不想“退出”,只是想退出拆分窗口。

如何退出拆分窗口返回正常模式,同时保留其他打开的窗口?


7
你是否能够采纳eckes的答案?它比现在被采纳的答案更有帮助... - Kyle Strand
11个回答

387

按下 Control+w,然后再按下 q 以逐个关闭每个窗口。

更新:如果您不想逐个关闭窗口,也可以考虑 eckes 的答案,使用:on (请查看下文)可能更有用。


9
我同意,但是原帖作者没有选择 Eckes 的答案,我不能自己更改。 - Warren P
4
我非常确信这是正确的答案。这对我很有用,如果你看看提问者的问题,他并不想关闭其他打开的窗口,只是最近分离的那个窗口。 - Zak
2
如果您不知道如何保存,请将此内容保存下来。可能您甚至没有保存的权限。 - Warren P
1
我认为!应该放在q前面,所以!q。 - Warren P
3
如果缓冲区包含未保存的更改,您可以使用:q!来退出它。意思是,“我想退出这个!真的!” - Mike S
显示剩余6条评论

319
为了关闭所有的分屏,在我通常将光标置于所需为唯一可见窗口的窗口中,然后执行:on命令,这会使当前窗口成为唯一可见窗口。这是一个很好的记忆口诀。
编辑: :help :on 告诉我这些命令是相同的:
  • :on
  • :only
  • CTRL-w CTRL-o
  • 是的,CTRL-W o 命令也有同样的效果(就像 Nathan答案中回答的那样)。
这四个命令都会关闭除活动窗口之外的所有窗口。

8
如果另一个窗口包含任何意外更改,:on 命令将会返回 E445: Other window contains changes 并且不会关闭另一个窗口。例如,我通常会创建一个新窗口,并在其中读取我想要复制的文件。此时,Vim 会认为另一个窗口存在未写入的更改。如果遇到这种情况,请使用 :on! 命令强制关闭窗口。 - Sabuncu

70

要关闭除当前窗口以外的所有窗口,请使用以下操作:

CTRL+w, o

也就是先按下CTRL+w,然后再按下o


3
我也想知道有没有一种方法可以撤销意外输入的 CTRL+W o - Paolo
不,除非您采取了允许撤消的操作,否则无法撤消。请参见https://vi.stackexchange.com/questions/241/undo-only-window/537#537。 - Rob Bednark

40

关闭当前窗口的两种选择是ZZZQ,分别会保存和不保存对显示缓冲区所做的更改。


12
这肯定是“vim方式”,crtl+w o似乎更像emacs。 - Andy Hayden
1
我不喜欢 Z,因为我是德国人。(提示:如果你经常在DE/EN设置之间切换,这可能与键盘布局有关) - Tino

17

来自:help opening-window(搜索“关闭窗口”-/Closing a window

  • :q[uit]关闭当前窗口和缓冲区。如果它是最后一个窗口,那么也会退出 vim。
  • :bd[elete] 卸载当前缓冲区并关闭当前窗口。
  • :qa[ll]:quita[ll]将关闭所有缓冲区和窗口并退出vim(使用:qa!强制退出而不保存更改)
  • :clo[se]关闭当前窗口但保持缓冲区打开。如果只有一个窗口,则此命令失败。
  • :hid[e]在当前窗口中隐藏缓冲区(请参阅:help hidden
  • :on[ly]关闭所有其他窗口,但保留所有缓冲区打开状态

8

命令:hide将隐藏当前焦点窗口。我认为这就是你要找的功能。

要在窗口之间导航,请键入Ctrl+w,然后键入导航键(h、j、k、l或箭头键)

要获取更多信息,请在vim中运行:help window:help hide


这太棒了。Chrome(带有ssh插件)将<C-W>捕获为“关闭标签”,有效地禁用了所有vim的<c-w>窗口命令。拥有替代方案非常有用。 - rein

7

我发现使用ctrl+w关闭想要关闭的窗口,然后只需执行:q。这对我有用。


这实际上是一个重复的答案,重复了已经存在了3年以上的东西。 - Warren P
@WarrenP 看起来不像是重复的问题。我没有找到其他提到 ^W^W:q 作为可能解决方案以消除分割的答案。请注意,^W 到你想关闭的窗口 显然意味着多次使用 ^W^W 来切换到你想关闭的窗口。 - Tino
抱歉,正确的是^W然后是o。 - Warren P

2

我很明白你的意图,我也只使用缓冲区,并且偶尔需要拆分。

下面是我.vimrc文件的一部分:

" disable macro, since not used in 90+% use cases
map q <Nop>
" q,  close/hide current window, or quit vim if no other window
nnoremap q :if winnr('$') > 1 \|hide\|else\|silent! exec 'q'\|endif<CR>
" qo, close all other window    -- 'o' stands for 'only'
nnoremap qo :only<CR>
set hidden
set timeout
set timeoutlen=200   " let vim wait less for your typing!

这非常适合我的工作流程

如果按下了 q

  • 如果有多个窗口打开,则隐藏当前窗口,否则尝试退出vim。

如果按下了 qo

  • 关闭所有其他窗口,如果只有一个窗口则没有影响。

当然,你可以将这个混乱的部分封装成一个函数,例如:

func! Hide_cur_window_or_quit_vim()
    if winnr('$') > 1
        hide
    else
        silent! exec 'q'
    endif
endfunc
nnoremap q :call Hide_cur_window_or_quit_vim()<CR>

附注:我重新映射了q,因为我不使用宏进行编辑,而是使用:s:g:v和外部文本处理命令(如果需要),例如:'{,'}!awk 'some_programm',或者使用:norm! normal-command-here


2
就像其他人之前所说的那样,做这件事的方法是按下ctrl+w,然后再按o。这将“最大化”当前窗口,同时关闭其他窗口。如果您想能够“取消最大化”,可以使用一个名为ZoomWin的插件。否则,您将不得不从头开始重新创建窗口设置。

1

提供窗口号以关闭特定窗口,无需离开当前窗口:

:[N]close
:close[N]
:[N]quit
:quit[N]
Ctrl-W[N]c

以下设置可以在状态栏中显示窗口编号:
:set statusline+=%{tabpagewinnr(tabpagenr())}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接