以前はZoomWinを使用していました: https://github.com/vim-scripts/ZoomWin Vimで1つと複数のウィンドウを切り替えるため。しかし、このプラグインには大きな問題が1つあります。複数のウィンドウ(垂直分割)を復元しようとすると、約2〜4秒の遅延があります。
その遅れを回避する方法を知っていますか?それとも、そのためのより良い解決策です。
バージョン25で解決された問題: https://github.com/regedarek/ZoomWin
別のシステムで作業するときはプラグインに依存したくないので、プラグインなしでvimを使用しようとします。これと同じ問題が発生したので、OPからの要求に応じて、いくつかの「より良い方法」(別の方法)を提案できます。
c-w-|
(vsplitsを使用している場合)ウィンドウが引き継ぐようにします。 c-w-=
復元します。 c-w-_
水平分割の場合tmux
を使用し、vimの複数のインスタンスを実行しますc-b-z
現在のペインの全画面を切り替えます実用性の高いものから順にリストしました。もちろん、専用プラグインを使用するとエクスペリエンスは向上しますが、それが常に選択肢となるとは限りません。
A 簡単な代替案 (必要に応じてこれで十分かもしれません):
" 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>
ZoomWinバージョン24では、ウィンドウローカル変数の保存が導入されました。試してみたところ、おそらく他のさまざまなプラグインがインストールされていて、さまざまなイベントハンドラーがインストールされているため、パフォーマンスが許容できないと感じました。
私は自分の問題をプラグインの作者に報告しました、そして彼はそれを返信しました
zoomWinのv25aには、g:zoomwin_localoptlistとnoautocmdなどがあります。
したがって、バージョン23に戻してみるか(私はそうしました)、または http://drchip.org/astronaut/vim/index.html#ZOOMWIN から上記の設定をオフにして最新バージョンを試します。 =
別の簡単な方法は: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
私が何年も使ってきた別の方法があります。現在のバッファを新しいタブに「ズーム」し、すぐに再び閉じて、元のマルチウィンドウレイアウトに戻ることができるようにします。
" "Zoom" a split window into a tab and/or close it
nmap <Leader>,zo :tabnew %<CR>
nmap <Leader>,zc :tabclose<CR>
私は、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