有比ZoomWin更好的在Vim中缩放窗口的方法吗?

64

2
延迟使得 zoomwin 对我来说不可行。 - arcseldon
BenC在下面给出了所需的性能。 - arcseldon
7个回答

103

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

  • c-w-| 可以使窗口占满整个屏幕(如果使用vsplits)。c-w-= 可以还原窗口。 c-w-_ 可以进行水平分割。
  • 关闭其他窗口,从而使当前窗口全屏。从缓冲区中拆分和重新打开可恢复窗口。
  • 如果可用,请使用 tmux 并运行多个实例的vim。 c-b-z 可以在当前窗格之间切换全屏模式。

我按照实用性给这些列了一个顺序。当然,使用专用插件会更好,但这并不总是可行的选择。


10
不错,但是 C-w-= 并不能恢复之前的布局,而是会在中间分割窗口(原来的分割位置可能不同)。 - Eric O. Lebigot

56

一个简单的替代方案(根据您的需求可能已经足够):

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

1
@Abdo:确实,我将它映射到<Leader><Leader>,因为我将<C-A>用于tmux;-) - BenC
4
使用相同技术的相应插件:https://github.com/szw/vim-maximizer - blueyed
2
很棒的解决方案。运行得非常好。 - rgin
1
你太棒了! - IvRRimUm
1
理想。谢谢! - arcseldon
显示剩余5条评论

15

我还有另一种多年来一直在使用的方法;它允许我将当前缓冲区“缩放”到一个新标签页中,然后快速关闭它,以便我可以回到我的原始多窗口布局:

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

1
伟大的解决方案。 - pinoyyid

13
ZoomWin 24 版本引入了保存窗口本地变量的功能。当我尝试使用它时,发现性能不佳,可能是因为我安装了各种插件并且这些插件安装了各种事件处理程序。
我向插件作者报告了我的问题,他回复说 ZoomWin 的版本 25a 具有 g:zoomwin_localoptlist 和 noautocmd 设置。
因此,您可以尝试恢复到版本 23(我已经这样做了),或者尝试关闭所提到的设置后使用最新版本,该设置从http://drchip.org/astronaut/vim/index.html#ZOOMWIN获取。

5
谢谢!第25版非常出色。我刚刚将最新版本推送到了我的Github账户上。https://github.com/regedarek/ZoomWin - tomekfranek
是的,我刚刚尝试了v25d,虽然不如v23快,但在我的旧笔记本电脑上延迟约为200毫秒,我认为我可以接受。 - Ingo Karkat
原始作者不再维护它了吗?你有他的许可吗? - Steven Lu

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

我喜欢这个!我的代码几乎和BenC的一样,但我之前尝试过使用tabe%来做些什么,这就是当时我想要的。是个不错的替代方案。 - ata
这个解决方案的优点是,当您放大代码然后缩小时,它不会将终端分割滚动到底部(这就是我使用C-w+_和C-w+=时发生的情况)。 - Yordan Grigorov
对于那些没有进行重新映射的用户,一种方法是使用 Ctrl+w s 将分割窗口复制到一个新缓冲区,然后使用 Ctrl+w T 将其拆分为一个新选项卡。完成后,只需关闭新选项卡,原始布局将恢复。 - user1717828

2

我写了一个与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

1

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