ZoomWin plugin.
authorIain Patterson <me@iain.cx>
Tue, 19 Aug 2008 15:56:10 +0000 (15:56 +0000)
committerIain Patterson <me@iain.cx>
Tue, 19 Aug 2008 15:56:10 +0000 (15:56 +0000)
git-svn-id: https://svn.cambridge.iain.cx/profile/trunk@135 6be0d1a5-5cfe-0310-89b6-964be062b18b

.vim/doc/ZoomWin.txt [new file with mode: 0644]
.vim/plugin/ZoomWin.vim [new file with mode: 0644]

diff --git a/.vim/doc/ZoomWin.txt b/.vim/doc/ZoomWin.txt
new file mode 100644 (file)
index 0000000..aa25db7
--- /dev/null
@@ -0,0 +1,115 @@
+*ZoomWin.txt*  Zoom into/out-of a window               Apr 24, 2008
+Authors: Charles E. Campbell, Jr.                      *zoomwin*
+         Ron Aaron
+Copyright: (c) 2004-2008 by Charles E. Campbell, Jr.   *zoomwin-copyright*
+           The VIM LICENSE applies to ZoomWin.vim and ZoomWin.txt
+           (see |copyright|) except use "ZoomWin" instead of "Vim"
+          No warranty, express or implied.  Use At-Your-Own-Risk.
+
+==============================================================================
+1. Usage                                               *zoomwin-usage*
+
+   :call ZoomWin()
+   :ZoomWin
+   <c-w>o
+
+   Either of the two commands or the normal mode <c-w>o will toggle between
+       * selecting the current window for display as the only window or
+       * to restore the original multiple-window view.
+
+==============================================================================
+2. Setup                                               *zoomwin-setup*
+
+   Simply put ZoomWin.vim into your .vim/plugin directory (you may need to
+   make such a directory first).  Under Windows that should be
+   vimfiles\plugin.  ZoomWin now uses the HelpExtractor method to
+   automatically extract help and to make it known to vim by running helptags
+   on it.
+
+==============================================================================
+3. History                                             *zoomwin-history*
+
+       v23 Apr 24, 2008 : * when |'scrollbind'| was activated: when ZoomWin
+                            attempted to restore multiple-windows, the cursor
+                            position was incorrect.  Fixed.
+       v22 Apr 10, 2006 : * "only" was occasionally issuing an "Already one
+                            window" message, which is now prevented
+                          * SavePosn() issued error message when handling an
+                            empty buffer
+                          * saves yank registers and restores them on each
+                            zoom/unzoom
+       v21 Oct 12, 2004 : * v14 fixed a bug when wmw and/or wmv equal to 0;
+                            v21 will invoke the patch only if the version <= 603.
+                            For vim version 6.3 users, this fix allows more files
+                            to be handled by ZoomWin.
+           May 10, 2005   * When :version shows -mksession, and the vim version
+                            is at least 6.3, ZoomWin will now do a partial zoom
+       v20 Jul 26, 2004 : * bugfix - ZoomWin didn't always retain the
+                            position in the former zoomed-in window after
+                            the window layout was restored.  It was restoring
+                            the position when the zoom-in occurred.
+       v19 May 26, 2004 : * bugfix - winmanager has events firing that,
+                            amongst other things, reset the bufhidden
+                            option to delete for some windows while
+                            ZoomWin worked.  ZoomWin now works
+                            successfully with winmanager.
+       v18 May 20, 2004 : * bugfix - didn't adversely affect anything, but
+                            ZoomWin was deleting its session file twice.
+                          * bugfix -- a multi-source file + minibufexplorer
+                            + Taglist interaction bug -- minibufexplorer's
+                            autocmd events were firing, generating a new
+                            window while ZoomWin was attempting to restore
+                            the display.  ZoomWin didn't have restoration
+                            information for the new window and so reported
+                            an error.  Events are now temporarily disabled
+                            while ZoomWin is restoring the layout.
+       v17 Mar 26, 2004 : * ZoomWin command installed.  Works nicely with
+                            taglist:  vim +Tlist +ZoomWin filename
+       v16 Dec 22, 2003 : * handles bufhidden and nobl windows (TagList support).
+                          * Now also works with quickfix window (:copen) but
+                            still not with |cmdline-window| (q:)
+       v15 Dec 19, 2003 : * SavePosn()/RestorePosn() needed to be preceded
+                            by s: to prevent clashes
+       v14 Dec 18, 2003 : * works around a restoration-bug with mksession
+                            when either wmw or wmh settings are zero
+                          * Bwipes internal temporary buffers
+                          * Known bugs: will not work with command-line
+                          * Editing window (|cmdline-window|) nor the
+                            quickfix window (|copen|).
+       v13 Dec 18, 2003 : Uses eventignore to prevent events/autocmds from
+                           firing while changing the mksession results.
+       v12 Dec 12, 2003 : uses hidden and a minimalist mksession save
+       v11 Oct 14, 2003 : bug fix: apparently RestorePosn()'s variables,
+                           which were b:, weren't always defined, so s:
+                           ones are now used.
+       v10 Sep 22, 2003 : Bug fix: when a single window is showing, the user
+                           moves the cursor, then <c-w>o used to restore
+                           screen, the current cursor position wasn't retained
+                          Restores v:this_session.
+                          Bug fix: change a window, use <c-w>o, then write.
+                          Was saving file only to temporary file instead of
+                           actual file, but when the actual file was brought back,
+                           the changes were lost.
+       v9 Aug 15, 2003 :  v8 managed to trash syntax highlighting on
+                          reload, this one removes the eventignore
+                          handling.  Will need more pondering...
+       v8 Aug 14, 2003 :  now handles not-modified but not filereadable
+                          buffers, nowrite buffers uses eventignore to
+                          bypass autocmd firing
+       v7 May 23, 2003 :  bugfix - GotoWinNum() didn't always get the
+                          cursor into the correct window
+       v6 Mar 25, 2003 :  more cleanup included
+       v5 Mar 14, 2003 :  includes support for handling scratch buffers,
+                          no-name buffer windows, and modified-buffer
+                          windows.  All windows' contents will be saved to
+                          temporary buffers
+       v4 Dec 12, 2002 :  Zak Beck contributed code to clean up temporary
+                          session files if one leaves vim while zoomed-in
+       v3 Dec 11, 2002 :  plugin-ized
+       v2 Nov 08, 2002 :  A guaranteed-to-be-unique to this
+                          session file is used for session information.
+                          Modified but not yet saved files are made hidden
+                          during zoom in.
+       v1 the epoch    :  Ron Aaron's original
+
+vim:tw=78:ts=8:ft=help
diff --git a/.vim/plugin/ZoomWin.vim b/.vim/plugin/ZoomWin.vim
new file mode 100644 (file)
index 0000000..0cfea92
--- /dev/null
@@ -0,0 +1,368 @@
+" ZoomWin:     Brief-like ability to zoom into/out-of a window
+" Author:      Charles Campbell
+"                      original version by Ron Aaron
+" Date:                Apr 24, 2008
+" Version:     23a     ASTRO-ONLY
+" History: see :help zoomwin-history {{{1
+" GetLatestVimScripts: 508 1 :AutoInstall: ZoomWin.vim
+
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if &cp || exists("g:loaded_ZoomWin")
+ finish
+endif
+let s:keepcpo        = &cpo
+let g:loaded_ZoomWin = "v23a"
+set cpo&vim
+"DechoTabOn
+
+" ---------------------------------------------------------------------
+"  Public Interface: {{{1
+if !hasmapto("<Plug>ZoomWin")
+ nmap <unique> <c-w>o  <Plug>ZoomWin
+endif
+nnoremap <silent> <script> <Plug>ZoomWin :set lz<CR>:silent call ZoomWin()<CR>:set nolz<CR>
+com! ZoomWin :set lz|silent call ZoomWin()|set nolz
+
+au VimLeave * call <SID>CleanupSessionFile()
+
+" ---------------------------------------------------------------------
+" ZoomWin: toggles between a single-window and a multi-window layout {{{1
+"          The original version was by Ron Aaron.
+fun! ZoomWin()
+"  let g:decho_hide= 1         "Decho
+"  call Dfunc("ZoomWin() winbufnr(2)=".winbufnr(2))
+
+  " if the vim doesn't have +mksession, only a partial zoom is available {{{2
+  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 : partialzoom=".s:partialzoom)
+   return
+  endif
+
+  " Close certain windows {{{2
+  call s:ZoomWinPreserve(0)
+
+  " save options.  Force window minimum height/width to be >= 1 {{{2
+  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 {{{2
+"      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 '.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 {{{2
+"      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("%") == "command-line"
+        echoerr "***error*** ZoomWin doesn't work with the command line window"
+"     call Dret("ZoomWin : commandline 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'
+"      call Decho("5: @@<".@@.">")
+    exe 'mksession! '.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
+     exe "keepalt keepmarks new! ".s:sessionfile
+     silent! keepjumps keepmarks v/wincmd\|split\|resize/d
+     keepalt w!
+     keepalt bw!
+       else
+     exe "new! ".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 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 {{{2
+"  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 {{{2
+  call s:ZoomWinPreserve(1)
+
+"  call Dret("ZoomWin")
+endfun
+
+" ---------------------------------------------------------------------
+" SavePosn: this function sets up a savedposn variable that {{{1
+"          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 {{{1
+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 {{{1
+"                     supposed-to-be temporary session file
+fun! s:CleanupSessionFile()
+"  call Dfunc("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("CleanupSessionFile")
+endfun
+
+" ---------------------------------------------------------------------
+" GotoWinNum: this function puts cursor into specified window {{{1
+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, {{{1
+"   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
+
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" ---------------------------------------------------------------------
+"  Modelines: {{{1
+" vim: ts=4 fdm=marker