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 を観察、操作する実装を応用すればよいでしょう(たぶん)。
参考
- https://github.com/Microsoft/vscode/issues/65825
- https://github.com/microsoft/vscode/issues/15178#issuecomment-283072868
- https://github.com/eamodio/vscode-restore-editors/blob/9e9b972ca2cb8949a747ddbae101b075e2713f1b/src/documentManager.ts#L54
- https://github.com/eamodio/vscode-restore-editors/blob/2ac2f865201cdb67fd531cd06bdbb082d330ccac/src/activeEditorTracker.ts
(†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初心者の感想です)