この記事は 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()