Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
557 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,380 @@ | ||
" 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\<cr>" | ||
if swwline > 0 | ||
let savedposn= savedposn.":silent norm! ".swwline."\<c-y>\<cr>:silent norm! zs\<cr>" | ||
endif | ||
let savedposn= savedposn.":silent call cursor(".swline.",".swcol.")\<cr>" | ||
|
||
if a:savewinhoriz | ||
if swwcol > 0 | ||
let savedposn= savedposn.":silent norm! ".swwcol."zl\<cr>" | ||
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."\<cr>" | ||
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 |
Oops, something went wrong.