是更好的方式来缩放窗口在Vim比ZoomWin?

wtlkbnrh  于 2023-01-30  发布在  其他
关注(0)|答案(7)|浏览(108)

我曾经使用ZoomWin:https://github.com/vim-scripts/ZoomWin用于在Vim中一个和多个窗口之间切换。但是这个插件有一个大问题。当我试图恢复多个窗口(垂直分割)时,有大约2-4秒的延迟。
你知道如何避免这种滞后吗?或者也许是更好的解决方案。
版本25解决了问题:https://github.com/regedarek/ZoomWin

brjng4g3

brjng4g31#

我试着不使用任何插件来使用vim,因为我不想在其他系统上工作时依赖它们。现在遇到同样的问题,我可以根据OP的要求提出一些“更好的方法”(替代方法):

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

我已经按照我的实用性列出了这些。使用专用插件当然会更好,但这并不总是一个选择。

rfbsl7qr

rfbsl7qr2#

一个simple alternative(根据您的需要,这可能足够了):

" 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>
fzsnzjdm

fzsnzjdm3#

ZoomWin版本24引入了保存窗口局部变量的功能,当我试用它的时候,我发现它的性能是不可接受的,可能是因为我安装了各种各样的插件,这些插件安装了各种各样的事件处理程序。
我已经向插件作者报告了我的问题,他回答说
ZoomWin的v25a有g:zoomwin_localptlist和noautocmd的东西。
因此,要么尝试恢复到版本23(我已经恢复了),要么尝试使用www.example.com上关闭了上述设置的最新版本http://drchip.org/astronaut/vim/index.html#ZOOMWIN

myzjeezk

myzjeezk4#

另一个简单的方法是: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
y53ybaqx

y53ybaqx5#

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

" "Zoom" a split window into a tab and/or close it
nmap <Leader>,zo :tabnew %<CR>
nmap <Leader>,zc :tabclose<CR>
pgpifvop

pgpifvop6#

我写了一个非常类似于BenC的版本(以前没有见过,所以看到这个值得咯咯地笑)
我认为唯一的区别是autocmd,如果你想移动到同一个标签中的另一个窗口,它会恢复布局,所以它会创建一个“自动取消缩放”的效果:

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
xzabzqsa

xzabzqsa7#

我把ZoomWin换成了优秀的Zen Mode

相关问题