ファイル・フォルダを生成して VSCode エクスプローラにドンッッ
やりたいこと
コード
vscode.WorkspaceEdit
とvscode.workspace.applyEdit
を使えばできそうだと思いましたが、
ファイルできる気配がない……( ˘ω˘)ウーン
const edit = new vscode.WorkspaceEdit(); const options = { overwrite: false, ignoreIfExists: false }; edit.createFile(vscode.Uri.parse(root + "\\images"), options); edit.createFile(vscode.Uri.parse(root + "\\content.md"), options); edit.createFile(vscode.Uri.parse(root + "\\config.json"), options); vscode.workspace.applyEdit(edit).then(value => { console.log(value); console.log(vscode.workspace.workspaceFolders); });
//出力 //false //undefined
そこでfs.mkdir
等を使って生成し、vscode.executeCommand
でフォルダを開くことで解決しました。
fs.mkdir(root, (err) => { if (err !== null){ console.log(err); throw err; } else { fs.mkdir(root + '\\images', (err) => { if (err !== null){ console.log(err); throw err; } }); ... } return root; }).then(root => { vscode.commands.executeCommand('vscode.openFolder', vscode.Uri.parse(root)); });
fs.mkdir
は非同期処理でThenable
を返します。
余談
VSCode API で提供されているんだと思ったら、意外にも無かったのでだいぶ時間食ってしまった。
あとvscode.WorkspaceEdit
ってどう使うものなんじゃ……
参考
updateWorkspaceFolders でハマった件
症状
vscode.workspace.updateWorkspaceFolders(0,0,{uri: vscode.Uri.parse('フォルダパス')});
を実行したら、デバッグは正常に起動しないわなんかメニューバーもサイドバーも表示されない真っ黒い VSCode 画面が表示されるわで冷や汗かいたのでメモ。
なぜ Chrome の要素の検証っぽい画面が出ているのか。
対処法
C:\Users\User\AppData\Roaming\Code\Workspaces
に次のようなフォルダが生成されています。
こいつを削除して VSCode 再起動すればおk。
ちなみにやりたかったこと
ファイル・フォルダを生成して VSCode のエクスプローラに展開したかっただけなんだけどなぁ……。まあネタになったからよし←
参考にした teratail のページがあったけど見つからなくなってしまった。
はてなAPI叩いてみた
とりあえず叩いてみただけ。
はてな Blog のカテゴリ一覧取得。oauth
モジュール Promise ベースでできれば……ってコールバック地獄になるわけではないから別にいいか( ˘ω˘)
this.atomUri = `https://blog.hatena.ne.jp/${id}/${domain}/atom`; /** * Get Hatena category. */ getCategory() { if (!this.existAccessToken()) { vscode.window.showErrorMessage("Not stored AccessToken!"); return; } const categoriesUri = this.atomUri + '/category'; this.oauthGET(categoriesUri, (err, result, response) => { //gオプション(?)で一致部分を全て取得し配列に格納 const regExp = new RegExp('category term=\".*\"', "g"); const _categoryArray = (result as string).match(regExp); if (_categoryArray !== null) { _categoryArray.forEach((value, index, array) => { const _category = value.match('category term=\"(.*)\"'); if (_category !== null){ console.log(_category[1]); } }); } }); } /** * Wrapper of oauth.get method. * @param uri * @param callback */ private oauthGET(uri: string, callback: OAuth.dataCallback) { this.oauth.get(uri, this.accessToken.token, this.accessToken.secret, callback); }
なお生のレスポンスは次のような感じ(はてなブログAtomPub - Hatena Developer Center)。
<?xml version="1.0" encoding="utf-8"?> <app:categories xmlns:app="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" fixed="no"> <atom:category term="Perl" /> <atom:category term="Scala" /> ... </app:categories>
xml-js
モジュールで JSON として扱った方が楽…??(やってない)