Help us understand the problem. What is going on with this article?

Vim 8.0 Advent Calendar 7 日目 ウィンドウ ID

More than 3 years have passed since last update.

この記事は 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()
thinca
「ご趣味は」 「Vimを少々…」
http://thinca.hatenablog.com/
aktsk
株式会社アカツキは、スマートフォンゲームの企画開発を中心に事業を展開しております。創業以来全てのゲームを内製しているため、高い技術ノウハウが蓄積されています。今後は、新規事業の立ち上げも行ってまいります。
http://aktsk.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした