Skip to content

Commit

Permalink
安装 ZoomWin 插件
Browse files Browse the repository at this point in the history
  • Loading branch information
lilydjwg committed Sep 21, 2011
1 parent e9d3d81 commit d026dbc
Show file tree
Hide file tree
Showing 5 changed files with 557 additions and 0 deletions.
1 change: 1 addition & 0 deletions .VimballRecord
Expand Up @@ -12,3 +12,4 @@ diff_movement.vba: call delete('/home/lilydjwg/.vim/ftplugin/diff_movement.vim')
tagbar.vba: call delete('/home/lilydjwg/.vim/plugin/tagbar.vim')|call delete('/home/lilydjwg/.vim/syntax/tagbar.vim')|call delete('/home/lilydjwg/.vim/doc/tagbar.txt')
mail_movement.vba: call delete('/home/lilydjwg/.vim/ftplugin/mail_movement.vim')
CountJump.vba: call delete('/home/lilydjwg/.vim/autoload/CountJump.vim')|call delete('/home/lilydjwg/.vim/autoload/CountJump/Motion.vim')|call delete('/home/lilydjwg/.vim/autoload/CountJump/Region.vim')|call delete('/home/lilydjwg/.vim/autoload/CountJump/Region/Motion.vim')|call delete('/home/lilydjwg/.vim/autoload/CountJump/Region/TextObject.vim')|call delete('/home/lilydjwg/.vim/autoload/CountJump/TextObject.vim')|call delete('/home/lilydjwg/.vim/doc/CountJump.txt')
ZoomWin.vba: call delete('/home/lilydjwg/.vim/plugin/ZoomWinPlugin.vim')|call delete('/home/lilydjwg/.vim/doc/ZoomWin.txt')|call delete('/home/lilydjwg/.vim/autoload/ZoomWin.vim')
380 changes: 380 additions & 0 deletions autoload/ZoomWin.vim
@@ -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

0 comments on commit d026dbc

Please sign in to comment.