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?
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.
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.
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"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With