仅撤消窗口


24

考虑一个窗口中有多个拆分的情况。vim允许通过迅速“最大化”当前拆分以占据整个窗口<C-W> o

有没有办法让vim“记住”以前存在的拆分并在执行后恢复到该状态<C-W> o

编辑:澄清一下,我正在寻找一种无需使用任何第三方插件即可完成此操作的方法。


1
我在SO上找到了这个答案,但我想尽可能在​​没有插件的情况下获得此功能。
Bhargav Bhat 2015年

5
请在问题本身中而不是在评论中包含类似的要求。
muru

如果在另一个stackexchange网站上,此问题是否被视为重复问题? stackoverflow.com/q/13194428/1698426
John Schmitt

Answers:


14

最简单的方法可能是使用会话文件,这是vim脚本(vim可以自动为您生成),这些文件将还原以前的编辑环境。

您可以使用创建新的会话文件:mksession <filename>。您可以通过执行生成的会话脚本恢复该会话:source <filename>

因此,您可以在最大化窗口之前保存当前会话,并在要“取消最大化”窗口时将其还原。

使用此功能,您可以重新映射适当的窗口命令以预先保存会话,并为其中一个添加新的映射以通过还原会话来“撤消”最后一个窗口命令。例如:

  • nnoremap <C-w>o :mksession! ~/session.vim<CR>:wincmd o<CR>等等,以获取您要支持的所有窗口命令(请参阅参考资料:help CTRL-W,其中有很多)。这些!防止与覆盖现有会话文件有关的错误。
  • nnoremap <C-w>u :source ~/session.vim<CR> 以“撤消”最后的窗口命令。

如果您想变得特别健壮,则可以通过函数扩展此函数,以将会话文件保存在堆栈中并弹出来获得完整的撤消链,尽管在那时写一堆函数来跟踪会话可能更有效。内存中的窗口命令历史记录...此时,您可能已经在复制已经完成这种操作的插件。


11

另一种选择是在新标签页中打开当前窗口,然后在完成后简单地关闭标签页。

不带参数的:split(或:sp简称)命令的作用是使用与当前拆分相同的缓冲区打开一个新拆分。该:tab命令可以运行许多与窗口相关的命令,并将其更改为使用选项卡。将这些组合在一起可得到:tab sp,它将使用当前缓冲区打开一个新标签页。

之后,您可以使用:q:tabclose:tabc简称)关闭新标签页。


2

我正是在这种情况下使用ZoomWin插件(https://github.com/itspriddle/ZoomWin)。再次按CtrlW- O可恢复您的窗口布局。


1
感谢您的建议,但正如我在问题中提到的那样,我想知道如果没有插件就可以做到这一点。
Bhargav Bhat 2015年

1
由于某些原因,此插件对我来说很慢。还有其他人遇到同样的问题吗?
shriek

2

您所描述的内容听起来完全像是“缩放”名称所具有的功能。SO方面已经有一个很好的答案,它做得很好。

编辑:明确的答案,从SO复制并粘贴。我将下面的代码片段放入.vimrc中,然后调用

:ZoomToggle

在我的vim命令提示符下。

" Zoom / Restore window.
function! s:ZoomToggle() abort
    if exists('t:zoomed') && t:zoomed
        execute t:zoom_winrestcmd
        let t:zoomed = 0
    else
        let t:zoom_winrestcmd = winrestcmd()
        resize
        vertical resize
        let t:zoomed = 1
    endif
endfunction
command! ZoomToggle call s:ZoomToggle()
nnoremap <silent> <C-A> :ZoomToggle<CR>

尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
muru

为什么要下票?
约翰·施密特

不是我。可能是由任何人举报的。
muru

从SO复制并粘贴没有比链接有用得多
alxndr

我同意。我能做的最有用的事情是什么?
约翰·施密特

0

这篇文章很旧,接受的答案无关紧要terminal buffer

可接受的答案用于解决问题session,但session不能完全恢复terminal buffer

                            *terminal-session*
A terminal window will be restored when using a session file, if possible and
wanted.

If "terminal" was removed from 'sessionoptions' then no terminal windows will
be restored.

If the job in the terminal was finished the window will not be restored.
...

Tommcdo的答案仍然有效,<c-w>:tab split适用于 terminal buffer。它应该有一张地图:

nnoremap <c-w><space> :tab split<cr>
tnoremap <c-w><space> <c-w>:tab split<cr>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.