JavaScript 向け IntelliSense でアンダースコア (_) で始まるプロパティ名を候補として表示する
Visual Studio 2012 で JavaScript を書くとき (Windows ストアアプリの開発とか) の話です。
昨日書いた ように、Visual Studio には IntelliSense とよばれる入力支援機構があり、JavaScript を書く時にもプロパティ名の補完などをしてくれます。 Visual Studio 2012 のデフォルトの設定では、アンダースコア (_) で始まるプロパティ名は原則として "this" のプロパティ名の補完の場合にのみ表示されるようになっています。 アンダースコアで始まるプロパティ名はプライベートであることを示すという慣例のためにこのようになっているのだと思います。
この機能は便利とはいえ、"this" 以外のプロパティの候補としてもアンダースコアで始まるプロパティ名を表示してほしいことはままあります。 例えば、以下のようにあるメソッドの中でコールバックとして関数式を書いている場合。 コールバックの関数式の中では "this" は外側のオブジェクトを指すわけではないので、"that" とか "self" とかの識別子をもつ変数に this を結びつけることが多いと思います。
Something.prototype.method = function () { var that = this; return WinJS.Promise.timeout(200).then(function () { // ここで this は Something オブジェクトを指すわけではないので, that を使う that._doPrivateMethod(); }); };
このとき、"that" という識別子の場合にもアンダースコアで始まるプロパティも補完候補に出してほしいわけですね。
で、そのためにどうすればいいかというと、Visual Studio 2012 のインストールディレクトリにある JavaScript\References\underscorefilter.js というファイルに書かれている処理を書き換えてやればよいです。
intellisense.addEventListener('statementcompletion', function (event) { if (event.targetName === "this") return;
ファイルを見ると上のようになっていて、対象の識別子が "this" の場合だけは補完候補のフィルタリングをしないようになっています。 なので、例えば "this" だけでなく "that" の場合もフィルタリングしないようにしたければ以下のように書き換えます。
intellisense.addEventListener('statementcompletion', function (event) { var selfReferencedNames = { "this": true, "that": true }; if (selfReferencedNames[event.targetName]) return;
他にも色々と IntelliSense のカスタマイズをできるようですね。 詳細は下記ドキュメントをご覧ください。
追記: 「アクセスが拒否されました。」 というエラーが出る
underscorefilter.js を編集して保存しようとしたら 「アクセスが拒否されました。」 というエラーが出ました。 このエラーが出る場合はアクセス権限がないのが理由なようなので、ファイルのプロパティからアクセス権限を変更する必要があります。