" ZoomWin: Brief-like ability to zoom into/out-of a window " Author: Charles Campbell " original version by Ron Aaron " Date: Jan 26, 2009 " Version: 23 " History: see :help zoomwin-history {{{1 " GetLatestVimScripts: 508 1 :AutoInstall: ZoomWin.vim " --------------------------------------------------------------------- " Load Once: {{{1 if &cp || exists("g:loaded_ZoomWin") finish endif if v:version < 702 echohl WarningMsg echo "***warning*** this version of ZoomWin needs vim 7.2" echohl Normal finish endif let s:keepcpo = &cpo let g:loaded_ZoomWin = "v23" set cpo&vim "DechoTabOn " ===================================================================== " Functions: {{{1 " --------------------------------------------------------------------- " ZoomWin#ZoomWin: toggles between a single-window and a multi-window layout {{{2 " The original version was by Ron Aaron. fun! ZoomWin#ZoomWin() " let g:decho_hide= 1 "Decho " call Dfunc("ZoomWin#ZoomWin() winbufnr(2)=".winbufnr(2)) " if the vim doesn't have +mksession, only a partial zoom is available {{{3 if !has("mksession") if !exists("s:partialzoom") echomsg "missing the +mksession feature; only a partial zoom is available" let s:partialzoom= 0 endif if v:version < 630 echoerr "***sorry*** you need an updated vim, preferably with +mksession" elseif s:partialzoom " partial zoom out let s:partialzoom= 0 exe s:winrestore else " partial zoom in let s:partialzoom= 1 let s:winrestore = winrestcmd() res endif " call Dret("ZoomWin#ZoomWin : partialzoom=".s:partialzoom) return endif " Close certain windows {{{3 call s:ZoomWinPreserve(0) " save options. Force window minimum height/width to be >= 1 {{{3 let keep_hidden = &hidden let keep_write = &write if v:version < 603 if &wmh == 0 || &wmw == 0 let keep_wmh = &wmh let keep_wmw = &wmw silent! set wmh=1 wmw=1 endif endif set hidden write if winbufnr(2) == -1 " there's only one window - restore to multiple-windows mode {{{3 " call Decho("there's only one window - restore to multiple windows") if exists("s:sessionfile") && filereadable(s:sessionfile) " save position in current one-window-only " call Decho("save position in current one-window-only in sponly") let sponly = s:SavePosn(0) let s:origline = line(".") let s:origcol = virtcol(".") " source session file to restore window layout let ei_keep= &ei set ei=all exe 'silent! so '.fnameescape(s:sessionfile) " Decho("@@<".@@.">") let v:this_session= s:sesskeep if exists("s:savedposn1") " restore windows' positioning and buffers " call Decho("restore windows, positions, buffers") windo call s:RestorePosn(s:savedposn{winnr()})|unlet s:savedposn{winnr()} call s:GotoWinNum(s:winkeep) unlet s:winkeep endif if line(".") != s:origline || virtcol(".") != s:origcol " If the cursor hasn't moved from the original position, " then let the position remain what it was in the original " multi-window layout. " call Decho("restore position using sponly") call s:RestorePosn(sponly) endif " delete session file and variable holding its name " call Decho("delete session file") call delete(s:sessionfile) unlet s:sessionfile let &ei=ei_keep endif else " there's more than one window - go to only-one-window mode {{{3 " call Decho("there's multiple windows - goto one-window-only") let s:winkeep = winnr() let s:sesskeep = v:this_session " doesn't work with the command line window (normal mode q:) if &bt == "nofile" && expand("%") == (v:version < 702 ? 'command-line' : '[Command Line]') echoerr "***error*** ZoomWin#ZoomWin doesn't work with the ".expand("%")." window" " call Dret("ZoomWin#ZoomWin : ".expand('%')." window error") return endif " call Decho("1: @@<".@@.">") " disable all events (autocmds) " call Decho("disable events") let ei_keep= &ei set ei=all " call Decho("2: @@<".@@.">") " save window positioning commands " call Decho("save window positioning commands") windo let s:savedposn{winnr()}= s:SavePosn(1) call s:GotoWinNum(s:winkeep) " set up name of session file " call Decho("3: @@<".@@.">") let s:sessionfile= tempname() " call Decho("4: @@<".@@.">") " save session " call Decho("save session") let ssop_keep = &ssop let &ssop = 'blank,help,winsize,folds,globals,localoptions,options' " call Decho("5: @@<".@@.">") exe 'mksession! '.fnameescape(s:sessionfile) " call Decho("6: @@<".@@.">") let keepyy= @@ let keepy0= @0 let keepy1= @1 let keepy2= @2 let keepy3= @3 let keepy4= @4 let keepy5= @5 let keepy6= @6 let keepy7= @7 let keepy8= @8 let keepy9= @9 set lz ei=all bh= if v:version >= 700 try exe "keepalt keepmarks new! ".fnameescape(s:sessionfile) catch /^Vim\%((\a\+)\)\=:E/ echoerr "Too many windows" silent! call delete(s:sessionfile) unlet s:sessionfile " call Dret("ZoomWin#ZoomWin : too many windows") return endtry silent! keepjumps keepmarks v/wincmd\|split\|resize/d keepalt w! keepalt bw! else exe "new! ".fnameescape(s:sessionfile) v/wincmd\|split\|resize/d w! bw! endif let @@= keepyy let @0= keepy0 let @1= keepy1 let @2= keepy2 let @3= keepy3 let @4= keepy4 let @5= keepy5 let @6= keepy6 let @7= keepy7 let @8= keepy8 let @9= keepy9 call histdel('search', -1) let @/ = histget('search', -1) " call Decho("7: @@<".@@.">") " restore user's session options and restore event handling " call Decho("restore user session options and event handling") set nolz let &ssop = ssop_keep silent! only! " call Decho("8: @@<".@@.">") let &ei = ei_keep echomsg expand("%") " call Decho("9: @@<".@@.">") endif " restore user option settings {{{3 " call Decho("restore user option settings") let &hidden= keep_hidden let &write = keep_write if v:version < 603 if exists("keep_wmw") let &wmh= keep_wmh let &wmw= keep_wmw endif endif " Re-open certain windows {{{3 call s:ZoomWinPreserve(1) " call Dret("ZoomWin#ZoomWin") endfun " --------------------------------------------------------------------- " SavePosn: this function sets up a savedposn variable that {{{2 " has the commands necessary to restore the view " of the current window. fun! s:SavePosn(savewinhoriz) " call Dfunc("SavePosn(savewinhoriz=".a:savewinhoriz.") file<".expand("%").">") let swline = line(".") if swline == 1 && getline(1) == "" " empty buffer let savedposn= "silent b ".winbufnr(0) " call Dret("SavePosn savedposn<".savedposn.">") return savedposn endif let swcol = col(".") let swwline = winline()-1 let swwcol = virtcol(".") - wincol() let savedposn = "silent b ".winbufnr(0)."|".swline."|silent norm! z\" if swwline > 0 let savedposn= savedposn.":silent norm! ".swwline."\\:silent norm! zs\" endif let savedposn= savedposn.":silent call cursor(".swline.",".swcol.")\" if a:savewinhoriz if swwcol > 0 let savedposn= savedposn.":silent norm! ".swwcol."zl\" endif " handle certain special settings for the multi-window savedposn call " bufhidden buftype buflisted let settings= "" if &bh != "" let settings="bh=".&bh setlocal bh=hide endif if !&bl let settings= settings." nobl" setlocal bl endif if &bt != "" let settings= settings." bt=".&bt setlocal bt= endif if settings != "" let savedposn= savedposn.":setlocal ".settings."\" endif endif " call Dret("SavePosn savedposn<".savedposn.">") return savedposn endfun " --------------------------------------------------------------------- " s:RestorePosn: this function restores noname and scratch windows {{{2 fun! s:RestorePosn(savedposn) " call Dfunc("RestorePosn(savedposn<".a:savedposn.">) file<".expand("%").">") if &scb setlocal noscb exe a:savedposn setlocal scb else exe a:savedposn endif " call Dret("RestorePosn") endfun " --------------------------------------------------------------------- " CleanupSessionFile: if you exit Vim before cleaning up the {{{2 " supposed-to-be temporary session file fun! ZoomWin#CleanupSessionFile() " call Dfunc("ZoomWin#CleanupSessionFile()") if exists("s:sessionfile") && filereadable(s:sessionfile) " call Decho("sessionfile exists and is readable; deleting it") silent! call delete(s:sessionfile) unlet s:sessionfile endif " call Dret("ZoomWin#CleanupSessionFile") endfun " --------------------------------------------------------------------- " GotoWinNum: this function puts cursor into specified window {{{2 fun! s:GotoWinNum(winnum) " call Dfunc("GotoWinNum(winnum=".a:winnum.") winnr=".winnr()) if a:winnum != winnr() exe a:winnum."wincmd w" endif " call Dret("GotoWinNum") endfun " --------------------------------------------------------------------- " ZoomWinPreserve: This function, largely written by David Fishburn, {{{2 " allows ZoomWin to "preserve" certain windows: " " TagList, by Yegappan Lakshmanan " http://vim.sourceforge.net/scripts/script.php?script_id=273 " " WinManager, by Srinath Avadhanula " http://vim.sourceforge.net/scripts/script.php?script_id=95 " " It does so by closing the associated window upon entry to ZoomWin " and re-opening it upon exit by using commands provided by the " utilities themselves. fun! s:ZoomWinPreserve(open) " call Dfunc("ZoomWinPreserve(open=".a:open.")") if a:open == 0 " Close Taglist if exists('g:zoomwin_preserve_taglist') && exists('g:loaded_taglist') " If taglist window is open then close it. let s:taglist_winnum = bufwinnr(g:TagList_title) if s:taglist_winnum != -1 " Close the window exec "silent! Tlist" endif endif " Close Winmanager if exists('g:zoomwin_preserve_winmanager') && exists('g:loaded_winmanager') " If the winmanager window is open then close it. let s:is_winmgr_vis = IsWinManagerVisible() if s:is_winmgr_vis == 1 exec "WMClose" endif endif else " Re-open Taglist if exists('g:zoomwin_preserve_taglist') && exists('g:loaded_taglist') " If taglist window was open, open it again if s:taglist_winnum != -1 exec "silent! Tlist" endif endif " Re-Open Winmanager if exists('g:zoomwin_preserve_winmanager') && exists('g:loaded_winmanager') " If the winmanager window is open then close it. if s:is_winmgr_vis == 1 exec "WManager" endif endif endif " call Dret("ZoomWinPreserve") endfun " ===================================================================== " Restore: {{{1 let &cpo= s:keepcpo unlet s:keepcpo " --------------------------------------------------------------------- " Modelines: {{{1 " vim: ts=4 fdm=marker