この記事は Vim 8.0 Advent Calendar の 7 日目の記事です。
Windows ID を使うことで、特定のウィンドウの追跡が容易になります。
ウィンドウ ID がなかった時代
ウィンドウの指定はウィンドウ番号で行っていました。これはウィンドウの位置に対応して左上から順に振られます。
+-------------------------------+
| | |
| | 2 |
| | |
| 1 |---------------|
| | |
| | 3 |
| | |
+-------------------------------+
ウィンドウへ移動したり、ウィンドウに紐付けられた変数にアクセスする際は、このウィンドウ番号を使っていました。
しかし、このウィンドウ番号はウィンドウを移動すると変わってしまいます。例えば上の例で、ウィンドウ番号 1 の場所で <C-w>L
を行うと、以下のようになります(括弧内は元のウィンドウ番号です)。
+-------------------------------+
| | |
| (2->)1 | |
| | |
|---------------| (1->)3 |
| | |
| (3->)2 | |
| | |
+-------------------------------+
これだと困る、ということで埋まれたのがウィンドウ ID です。
ウィンドウ ID とは
ウィンドウ ID は全てのウィンドウに振られる ID です。
ウィンドウ番号と違い、ウィンドウを移動しても変わりません。
ウィンドウ ID の取得
" 現在アクティブなウィンドウのウィンドウ ID を取得します
let win_id = win_getid()
" 現在タブページからウィンドウ番号を指定してウィンドウ ID を取得します
let win_id = win_getid(winnr)
" タブページとウィンドウ番号を指定してウィンドウ ID を取得します
let win_id = win_getid(winnr, tabnr)
" バッファ名やバッファ番号から最初に見付かったバッファが
" 表示されているウィンドウのウィンドウ ID を取得します
let win_id = bufwinid(buf)
" 指定したバッファ番号のバッファを表示している
" ウィンドウのウィンドウ ID を配列で全て取得します
let win_ids = win_findbuf(bufnr)
ウィンドウ ID の使用
" 現在のタブページからウィンドウ ID のウィンドウを探してウィンドウ番号を返します
" 見付からなかった場合は 0 を返します
let winnr = win_id2win(win_id)
" ウィンドウ ID のウィンドウを探して、
" そのタブページ番号とウィンドウ番号を要素 2 の配列で返します
" 見付からなかった場合は [0, 0] を返します
let [tabnr, winnr] = win_id2tabwin(win_id)
" 指定のウィンドウ ID のウィンドウに移動します。成功したら TRUE を返します
let succeed = win_gotoid(win_id)
ウィンドウ番号とウィンドウ ID の併用
ウィンドウ ID は 1000 から振られます。これにより、1000 以上の場合はウィンドウ ID、1000 未満の場合はウィンドウ番号と仮定することで、既存の関数でウィンドウ番号を渡していた箇所でウィンドウ ID を渡せるようになっています。以下の関数で利用できます。
arglistid()
getcwd()
getloclist()
gettabwinvar()
haslocaldir()
setloclist()
settabwinvar()
winheight()
winwidth()