我想獲得某種窗口的唯一標識符,以便可以針對該窗口運行命令。如何獲取窗口的唯一標識符?
即,如果我需要給該窗口焦點..或者如果我需要看到該窗口的大小..等問題是目前看起來像窗口號被用作此標識符,但這個數字潛在地改變任何時候一個新的窗口介紹..它似乎是從左到右,從上到下的索引計數..這讓我感到困惑,爲什麼這將用作標識符。
因爲我不知道用戶可能做什麼佈局..我怎麼能保證,當我分配一個窗口緩衝區,或獲得有關窗口的信息,我實際上獲得有關窗口的信息我想要?
我想獲得某種窗口的唯一標識符,以便可以針對該窗口運行命令。如何獲取窗口的唯一標識符?
即,如果我需要給該窗口焦點..或者如果我需要看到該窗口的大小..等問題是目前看起來像窗口號被用作此標識符,但這個數字潛在地改變任何時候一個新的窗口介紹..它似乎是從左到右,從上到下的索引計數..這讓我感到困惑,爲什麼這將用作標識符。
因爲我不知道用戶可能做什麼佈局..我怎麼能保證,當我分配一個窗口緩衝區,或獲得有關窗口的信息,我實際上獲得有關窗口的信息我想要?
您可以使用窗口變量來獲得這樣的標識:
" 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
將無法創建沒有標識符的窗口。
看起來很可愛!我現在就試試看,謝謝! – 2011-03-09 21:17:03
這是否仍然有效,我得到'未定義的變量w'? – 2016-04-19 10:18:08
@OtisWright你顯然有什麼錯,在這裏的任何地方都沒有變量'w'。 – ZyX 2016-04-19 14:38:56
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'
您可以使用緩衝區名稱而不是窗口標識符來滿足您的需求嗎? – 2011-03-07 02:24:12
對於這個第一個項目,我將不得不。但總的來說..不是腳本佈局導入的能力嗎?腳本不應該能夠控制特定的窗口嗎?也許該窗口根據用戶操作加載不同的緩衝區..這是如何做到的:/ – 2011-03-07 02:35:15