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
を観察、操作する実装を応用すればよいでしょう(たぶん)。
参考
- 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初心者の感想です)