Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get a unique identifier for a window?

Tags:

vim

I am trying to get some sort of unique identifier for a window, so that commands can be run against that window.

Ie, if i need to give that window focus.. or if i need to see the size of that window.. etc. The problem is currently it seems like the window number is used as this identifier, but this number potentially changes any time a new window is introduced.. It seems like it is an index count from left to right and top to bottom.. which puzzles me as to why that would be used as an identifier.

Seeing as i have no idea what the user may do to a layout.. how can i assure that when i assign a window a buffer, or get information about a window, that the i am actually getting information about the window i want?

like image 798
Lee Olayvar Avatar asked Mar 07 '11 02:03

Lee Olayvar


People also ask

Is Windows device ID unique?

Each device in Windows has it's own unique identifier known as the Hardware ID. The Device ID is the identifier of the PC itself.

What is Windows UUID?

The UUID structure defines a Universally Unique Identifier (UUID). A UUID provides a unique designation of an object such as an interface, a manager entry-point vector, or a client object. The UUID structure is a typedef 'd synonym for the GUID structure.


1 Answers

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"
like image 130
ZyX Avatar answered Sep 22 '22 20:09

ZyX