Vim Tips Wiki
(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 * if g:restore_screen_size_pos == 1 | call Screen_load() | endif
+
autocmd VimEnter * call Screen_load()
autocmd VimLeavePre * if g:restore_screen_size_pos == 1 | call Screen_save() | endif
+
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

Comments