C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

vscode extension: 開かれている vscode.TextEditor を列挙する方法のメモ

import * as vscode from 'vscode'

// 列挙した TextEditor を格納する array
const es: vscode.TextEditor[] = []

// 次の TextEditor を取得するトリック
let nextTextEditor = async () =>
{
  await vscode.commands.executeCommand( 'workbench.action.nextEditor' )
  return vscode.window.activeTextEditor
}

// 現在の TextEditor から逐次 TextEditor を取得し、 undefined または既に列挙済みの TextEditor が再列挙されたらおしまい
// 2020-01-05T15:41+09:00 修正(†1)
for ( let e = vscode.window.activeTextEditor; e && !es.some( _ => (<any>_)._id === (<any>e)._id ); e = await nextTextEditor() )
{
  // おまけデバッグコード: 直前に取得された TextEditor に紐づいている TextDocument の uri をロギング
  console.log( 'debug', e.document.uri )
  es.push( e )
}

参考リンクを元にTS初心者が書いてみました。バッドノウハウの香りが漂う気もしますが、いまのところ vscode の extension 用に公開されている API で実装する方法はこんな具合にならざるを得ないようです。

特定の状態の TextEditor を見つけたいだけなら for の中で見つけたら break 、全部の情報が欲しいなら列挙を終えてから es を観察、操作する実装を応用すればよいでしょう(たぶん)。

参考

(†1) 修正

// 修正後
for ( let e = vscode.window.activeTextEditor; e && !es.some( _ => (<any>_)._id === (<any>e)._id ); e = await nextTextEditor() )
// 修正前
for ( let e = vscode.window.activeTextEditor; e && !es.includes( e ); e = await nextTextEditor() )

TSを介してもESはやっぱりこわいです。疲弊します。おうちに帰りたい的な気持ちになりました…。(個人のTS初心者の感想です)