58

我曾经使用 ZoomWin:https ://github.com/vim-scripts/ZoomWin在 Vim 中的一个和多个窗口之间切换。但是这个插件有一个大问题。当我尝试恢复多个窗口(垂直拆分)时,大约有 2-4 秒的延迟。

你知道如何避免这种滞后吗?或者也许是更好的解决方案。

版本 25 解决的问题:https ://github.com/regedarek/ZoomWin

4

6 回答 6

94

我尝试在没有任何插件的情况下使用 vim,因为当我在另一个系统上工作时我不想依赖它们。现在遇到同样的问题,我可以按照 OP 的要求提出一些“更好的方法”(替代方法):

  • c-w-|让窗口接管(如果使用 vsplits)。c-w-=恢复。c-w-_用于水平分割
  • 关闭其他窗口,从而使当前一个全屏。从缓冲区拆分并重新打开以恢复
  • 使用tmux(如果可用)并运行多个 vim 实例,c-b-z以在当前窗格的全屏之间切换

我按照我认为的实用性顺序列出了这些。使用专用插件的体验当然会更好,但这并不总是一种选择。

于 2015-05-21T00:26:00.273 回答
51

一个简单的替代方案(根据您的需要可能就足够了):

" 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>
于 2014-10-24T15:22:47.543 回答
13

ZoomWin 版本 24 引入了窗口局部变量的保存。当我试用它时,我发现性能无法接受,可能是因为我安装了各种其他插件并安装了各种事件处理程序。

我已经向插件作者报告了我的问题,他回答说

ZoomWin v25a 有 g:zoomwin_localoptlist 和 noautocmd 的东西。

因此,要么尝试恢复到版本 23(我这样做了),要么尝试从http://drchip.org/astronaut/vim/index.html#ZOOMWIN关闭上述设置的最新版本

于 2012-11-02T12:05:45.697 回答
12

另一种简单的方法是:tab split。好处是它不会改变当前选项卡的布局。缺点是它需要 Vim 7.0 或更高版本来支持选项卡。

nnoremap <leader>t :call TabToggle()<cr>
function! TabToggle()
  if tabpagewinnr(tabpagenr(), '$') > 1
    " Zoom in when this tab has more than one window
    tab split
  elseif tabpagenr('$') > 1
    " Zoom out when this tab is not the last tab
    if tabpagenr() < tabpagenr('$')
      tabclose
      tabprevious
    else
      tabclose
    endif
  endif
endfunction
于 2016-09-18T20:34:35.127 回答
11

我有另一种使用多年的方法;允许我将当前缓冲区“缩放”到新选项卡,然后再次快速关闭它,这样我就可以回到原来的多窗口布局:

" "Zoom" a split window into a tab and/or close it
nmap <Leader>,zo :tabnew %<CR>
nmap <Leader>,zc :tabclose<CR>
于 2018-12-07T13:50:15.277 回答
1

我写了一个与 BenC 的版本非常相似的版本(以前没见过,所以看到那个值得咯咯笑)

我认为唯一的区别是如果您想移动到同一选项卡中的另一个窗口,自动命令会恢复布局,因此它会创建“自动取消缩放”效果:

function! ToggleZoom(toggle)
  if exists("t:restore_zoom") && (t:restore_zoom.win != winnr() || a:toggle == v:true)
      exec t:restore_zoom.cmd
      unlet t:restore_zoom
  elseif a:toggle
      let t:restore_zoom = { 'win': winnr(), 'cmd': winrestcmd() }
      vert resize | resize
  endi
endfunction
nnoremap <silent> <Leader>+ :call ToggleZoom(v:true)<CR>
augroup restorezoom
    au WinEnter * silent! :call ToggleZoom(v:false)
augroup END
于 2020-03-11T16:17:59.687 回答