(Manual edit: Added an alternative script.) |
(Manual edit: Removed a double check.) |
||
Line 147: | Line 147: | ||
let g:restore_screen_size_pos = 1 |
let g:restore_screen_size_pos = 1 |
||
endif |
endif |
||
− | autocmd VimEnter * |
+ | autocmd VimEnter * call Screen_load() |
− | autocmd VimLeavePre * |
+ | autocmd VimLeavePre * call Screen_save() |
endif |
endif |
||
</pre> |
</pre> |
Revision as of 17:56, 6 June 2008
I often have more than one Vim (gui on Windows) running. Quite often I will have one per project, each instance editing multiple buffers. When I start Vim, I name it (based on the project or tool I launched it from).
gvim --servername VS_NET filename
When I re-open Vim I like its screen position and size to be the same as they were when Vim was closed.
Add the following to your vimrc to accomplish this.
" Restore screen size and position " By Steve Hall " Modified by David Fishburn to base it on gvim servername if has("gui_running") && has('win32') function! Screen_init() " - Remembers and restores winposition, columns and lines stored in " global variables written to viminfo " - Must follow font settings so that columns and lines are accurate " based on font size. if ! has("gui_running") || ! has('win32') return endif if &viminfo !~ '!' echoerr 'Screen_init: The viminfo setting must have a "!". :h viminfo :set viminfo+=!' return endif " initialize if !exists("g:COLS_".v:servername) let g:COLS_{v:servername} = &columns endif if !exists("g:LINES_".v:servername) let g:LINES_{v:servername} = &lines endif if !exists("g:WINPOSX_".v:servername) " don't set to 0, let window manager decide let g:WINPOSX_{v:servername} = "" endif if !exists("g:WINPOSY_".v:servername) " don't set to 0, let window manager decide let g:WINPOSY_{v:servername} = "" endif " set execute "set columns=".g:COLS_{v:servername} execute "set lines=".g:LINES_{v:servername} execute "winpos ".g:WINPOSX_{v:servername}." ".g:WINPOSY_{v:servername} endfunction function! Screen_get() " used on exit to retain window position and size let g:COLS_{v:servername} = &columns let g:LINES_{v:servername} = &lines let g:WINPOSX_{v:servername} = getwinposx() " filter negative error condition if g:WINPOSX_{v:servername} < 0 let g:WINPOSX_{v:servername} = 0 endif let g:WINPOSY_{v:servername} = getwinposy() " filter negative error condition if g:WINPOSY_{v:servername} < 0 let g:WINPOSY_{v:servername} = 0 endif endfunction let g:restore_screen_size_pos = 1 " autocmd VimEnter * breakadd func Screen_init autocmd VimEnter * if g:restore_screen_size_pos == 1 | call Screen_init() | endif autocmd VimLeavePre * if g:restore_screen_size_pos == 1 | call Screen_get() | endif endif
Here is an alternative script that is being tried that uses files (.vimsize) instead of .viminfo:
" Restore screen size and position " By Steve Hall " Modified by David Fishburn to base it on gvim servername " Modified by Ben Schmidt to use a file-based mechanism instead of viminfo " and not require win32 if has("gui_running") function! Screen_filename() if has('amiga') return "s:.vimsize" elseif has('win32') return $HOME."\\_vimsize" else return $HOME."/.vimsize" endif endfunction function! Screen_load() " - Remembers and restores winposition, columns and lines stored in " a .vimsize file " - Must follow font settings so that columns and lines are accurate " based on font size. if !has("gui_running") return endif if !g:restore_screen_size_pos return endif " read any existing variables from .vimsize file silent! execute "sview " . escape(Screen_filename(),'%#\ $') silent! execute "0/^" . v:servername . " /" let sizepos = split(getline('.')) if len(sizepos) != 0 && sizepos[0] == v:servername execute "set columns=".sizepos[1] execute "set lines=".sizepos[2] silent! execute "winpos ".sizepos[3]." ".sizepos[4] endif silent! q endfunction function! Screen_save() " used on exit to retain window position and size if !has("gui_running") return endif if !g:restore_screen_size_pos return endif silent! execute "split " . escape(Screen_filename(),'%#\ $') silent! execute "0/^" . v:servername . " /" let sizepos = split(getline('.')) if len(sizepos) != 0 && sizepos[0] == v:servername delete endif $put = v:servername . ' ' . &columns . ' ' . &lines . ' ' . \ (getwinposx()<0?0:getwinposx()) . ' ' . \ (getwinposy()<0?0:getwinposy()) silent! x! endfunction if !exists('g:restore_screen_size_pos') let g:restore_screen_size_pos = 1 endif autocmd VimEnter * call Screen_load() autocmd VimLeavePre * call Screen_save() endif