我正在尝试为窗口获取某种唯一标识符,以便可以针对该窗口运行命令。
是的,如果我需要给那个窗口焦点..或者如果我需要看到那个窗口的大小..等等。问题是目前似乎窗口号被用作这个标识符,但这个数字可能是每当一个新窗口被引入时都会改变。看起来这是一个从左到右,从上到下的索引计数...这让我很困惑,为什么它会被用作标识符。因为我不知道用户可能对布局做了什么..我怎么能保证当我指定一个窗口缓冲区,或获取有关窗口的信息时,我实际上获取有关窗口的信息我要什么?
答案 0 :(得分:6)
您可以使用窗口变量来获取此标识符:
" 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
:这应标记所有窗口。或者,最好只在窗口创建后标记要使用的窗口。要查找标识为abc
的窗口,然后切换到该窗口:
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"
最近的Vim版本具有win_getid()
功能,win_id2tabwin()
代替s:FindWinID
,win_gotoid()
只能转到具有给定标识符的窗口。标识符由Vim本身维护,因此即使打开窗口,例如noautocmd wincmd s
将无法创建没有标识符的窗口。
答案 1 :(得分:1)
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'