日々是好日

プログラミングについてのあれこれ、ムダ知識など

ファイル・フォルダを生成して VSCode エクスプローラにドンッッ

やりたいこと

コード

vscode.WorkspaceEditvscode.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ってどう使うものなんじゃ……

参考

github.com

updateWorkspaceFolders でハマった件

症状

vscode.workspace.updateWorkspaceFolders(0,0,{uri: vscode.Uri.parse('フォルダパス')});

を実行したら、デバッグは正常に起動しないわなんかメニューバーもサイドバーも表示されない真っ黒い VSCode 画面が表示されるわで冷や汗かいたのでメモ。

f:id:kcpoipoi:20190130202952p:plain:w400
デバッグ実行するとバグる

なぜ Chrome の要素の検証っぽい画面が出ているのか。

f:id:kcpoipoi:20190130202621p:plain:w400
何もない黒い窓

対処法

C:\Users\User\AppData\Roaming\Code\Workspaces

に次のようなフォルダが生成されています。

f:id:kcpoipoi:20190130203240p:plain:w400
WorkspaceFolder

こいつを削除して 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 として扱った方が楽…??(やってない)

VSCode 拡張機能開発で OAuth 認証 - 3 <終>

最終的にこんな形になりました。Promise ベースで Http リクエストを送れるrequest-promiseモジュールを新たに導入しました。

続きを読む

VSCode 拡張機能開発で OAuth 認証 - 2.5

前回の記事のリクエスト部分を書き直した。

やったことはaxiosを追放して、request及びoauthモジュールで OAuth 認証を完了させたところ。すまんaxios

続きを読む

VSCode 拡張機能開発で OAuth 認証 - 2

力技で Access Token の取得までやってやりました!!ヾ(:3ノシヾ)ノシ

参考 www.iruca21.com

  • やったこと
  • コード
  • 所感

やったこと

  • VSCode 拡張機能はてな API を叩くために、OAuth 認証を実行する
    • Web ブラウザの経由なし、コード上で完結
    • requestモジュールではてなにログイン(Cookie の取得)
    • axios, oauthモジュールで OAuth 認証を実行し Access Token を取得

最初はaxios.postでログイン処理をしようとしましたが、どうしてもうまくいかなかったのでrequestに変えました。axiosでログイン処理する方法募集です。

続きを読む

VSCode 拡張機能開発で OAuth 認証 - 1

VSCodeはてなブログ に直接投稿する拡張機能を作っています(唐突)が、OAuth 認証でクソハマったので( ..)φメモメモ

※今回は Request Token の取得までしかできていませんのであしからず

※※getOAuthRequestTokencallback_urlに間違いがあったので修正

続きを読む