How to get a unique identifier for a window?

Simple version:

let l:current_window = win_getid()

... do something that alters the current window and/or tab and now i want to go back

call win_gotoid(l:current_window)

Complicated version:

let [l:current_window_tabnr, l:current_window_winnr] = win_id2tabwin(win_getid())

or

let l:current_window_tabnr = tabpagenr()
let l:current_window_winnr = winnr()

... do something that alters the current window and/or tab and now i want to go back

execute 'tabnext ' . l:current_window_tabnr
execute l:current_window_winnr . 'wincmd w'

JonnyRaa: ...I found win_gotoid fails with an error message about winsize

This error message happens when you forget to put "call " in front of "win_gotoid(l:current_window)". I know because i just made the same mistake :D

:win_gotoid(123)
E465: :winsize requires two number arguments

Should be:

:call win_gotoid(123)

Recent Vim versions have win_getid() function and win_id2tabwin() in place of the below s:FindWinID. Also win_gotoid() to just go to window with given identifier. Identifiers are maintained by Vim itself, so even opening window with e.g. noautocmd wincmd s will not be able to create a window without an identifier.


For older versions, you can use window variables to get such identifier:

" put unique window identifier into w:id variable
autocmd VimEnter,WinEnter * if !exists('w:id') | let w:id={expr_that_will_return_an_unique_identifier} | endif

This should mark all windows. Or, it is maybe better to mark only that windows which you want to use just after window creation. To find a window with id abc and then switch to it:

function s:FindWinID(id)
    for tabnr in range(1, tabpagenr('$'))
        for winnr in range(1, tabpagewinnr(tabnr, '$'))
            if gettabwinvar(tabnr, winnr, 'id') is a:id
                return [tabnr, winnr]
            endif
        endfor
    endfor
    return [0, 0]
endfunction
<...>
let [tabnr, winnr]=s:FindWinID('abc')
execute "tabnext" tabnr
execute winnr."wincmd w"

Tags:

Vim