2011-03-07 122 views
3

我想獲得某種窗口的唯一標識符,以便可以針對該窗口運行命令。如何獲取窗口的唯一標識符?

即,如果我需要給該窗口焦點..或者如果我需要看到該窗口的大小..等問題是目前看起來像窗口號被用作此標識符,但這個數字潛在地改變任何時候一個新的窗口介紹..它似乎是從左到右,從上到下的索引計數..這讓我感到困惑,爲什麼這將用作標識符。

因爲我不知道用戶可能做什麼佈局..我怎麼能保證,當我分配一個窗口緩衝區,或獲得有關窗口的信息,我實際上獲得有關窗口的信息我想要?

+0

您可以使用緩衝區名稱而不是窗口標識符來滿足您的需求嗎? – 2011-03-07 02:24:12

+0

對於這個第一個項目,我將不得不。但總的來說..不是腳本佈局導入的能力嗎?腳本不應該能夠控制特定的窗口嗎?也許該窗口根據用戶操作加載不同的緩衝區..這是如何做到的:/ – 2011-03-07 02:35:15

回答

5

您可以使用窗口變量來獲得這樣的標識:

" 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 

:這應該標誌着所有窗口。或者,最好在創建窗口後僅標記要使用的窗口。爲了找到ID爲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將無法​​創建沒有標識符的窗口。

+0

看起來很可愛!我現在就試試看,謝謝! – 2011-03-09 21:17:03

+0

這是否仍然有效,我得到'未定義的變量w'? – 2016-04-19 10:18:08

+0

@OtisWright你顯然有什麼錯,在這裏的任何地方都沒有變量'w'。 – ZyX 2016-04-19 14:38:56

0
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'