如何获取窗口的唯一标识符?

时间:2011-03-07 02:21:07

标签: vim

我正在尝试为窗口获取某种唯一标识符,以便可以针对该窗口运行命令。

是的,如果我需要给那个窗口焦点..或者如果我需要看到那个窗口的大小..等等。问题是目前似乎窗口号被用作这个标识符,但这个数字可能是每当一个新窗口被引入时都会改变。看起来这是一个从左到右,从上到下的索引计数...这让我很困惑,为什么它会被用作标识符。

因为我不知道用户可能对布局做了什么..我怎么能保证当我指定一个窗口缓冲区,或获取有关窗口的信息时,我实际上获取有关窗口的信息我要什么?

2 个答案:

答案 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:FindWinIDwin_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'