しらいとブログ

ネットで検索してもなかなか出てこないIT情報を独自にまとめています

Adobe Bracketsのコードヒントが遅いので無効化

今現在JavaScriptのコードをAdobe Bracketsで書いているのですが、JavaScriptのスコープが特殊なせいかコードヒントの表示が非常に重くなっています。
それが1文字打つたびに更新されるのでコーディング速度に大きく影響しています。

せめてCtrl-Spaceを押したときだけにしてくれればまだ使えるのですが、そのような設定はありません。

Adobe Bracketsは非常に使いやすく、今更他のエディタに乗り換えるわけにもいかないので我慢していたのですが、ついに1文字打つ度に1秒止まるようになったので、本気で解決策を探してみました。

English is here.

まず、今のAdobe Brackets(0.38)にはコードヒントを無効化する機能はありません。
Adobe Bracketsオープンソースなので一応githubのコードを読んでみましたが、キー入力毎にコードヒントを表示する部分が無名関数の中にハードコーディングされており、拡張機能を使っても絶対に無効化できないようになっていました。

他にコードヒントに関する機能が無いか調べてみると、コードヒントのアルゴリズムは言語毎にJavaScriptで書かれており、Adobe Bracketsはそれらを拡張機能として動的に読み込んでいることが分かりました。
そこでコードヒントのアルゴリズムを書き換えることにしました。

今回はJavaScript言語のコードヒントアルゴリズムのみを書き換えることにします。

まず、

Brackets\www\extensions\default\JavaScriptCodeHints\main.js

を開きます。

400行に

    JSHints.prototype.hasHints = function (editor, key) {
        if (session && HintUtils.hintableKey(key)) {

とあります。hasHintsがtrueを返すとコードヒントが表示されるようです。
これを以下のように書き換えます。

    JSHints.prototype.hasHints = function (editor, key) {
        return false;
        if (session && HintUtils.hintableKey(key)) {

これでコードヒントを完全に無効化できます。

更に調べてみたところ、keyは入力した文字が入っていることが分かったのですが、Ctrl-Spaceを押したときはkeyがnullになっているようです。

そこで、以下のように書き換えるとCtrl-Spaceを押した時だけコードヒントが表示されるようになります。

    JSHints.prototype.hasHints = function (editor, key) {
        if (key) { return false; }
        if (session && HintUtils.hintableKey(key)) {

また、以下のように書き換えるとCtrl-Spaceを押したときとドット(.)を入力したときだけコードヒントが表示されるようになります。

    JSHints.prototype.hasHints = function (editor, key) {
        if (key && key !== ".") { return false; }
        if (session && HintUtils.hintableKey(key)) {

これでコードヒントの遅さで悩むことはなくなりました。

JavaScript以外も無効にするときは言語毎のmain.jsを開いてprototype.hasHintsを検索して同じようにやってみてください。
もし引数の名前が変わっていたら第二引数を使ってください。

最後に気になったことを書いておきます。

本来コードヒントは時間がかかる可能性を考えて別スレッドで処理し、エディタのレスポンスが悪くならないようにするべきなのですが、Adobe BracketsJavaScriptで書かれているためかコードヒントもエディタと同じスレッドで処理されています。
そのためコードヒントの処理をしている間はエディタの処理が止まります。
イベントドリブンで作られているため、エディタが止まっている間もキー入力を続ければイベントキューにキーボードイベントが溜まるので、処理が終わった後にまとめてイベントを処理してくれる仕様になっていますが、イベントを効率良く処理する仕組みがないため全てのキーボードイベント毎にコードヒントの処理が行われることに変わりありません。
この部分にどうしてもJavaScriptの限界を感じてしまいます。

 

以下、外人向けの解説。

 

Adobe Brackets Customize

  1. How to disable JavaScript Code Hints.
  2. How to disable JavaScript Code Hints except Ctrl-Space.
  3. How to disable JavaScript Code Hints except Ctrl-Space and dot.

I use Brackets 0.38.

 

1.How to disable JavaScript Code Hint.

Brackets\www\extensions\default\JavaScriptCodeHints\main.js:400

before

    JSHints.prototype.hasHints = function (editor, key) {
        if (session && HintUtils.hintableKey(key)) {

after

    JSHints.prototype.hasHints = function (editor, key) {
        return false;
        if (session && HintUtils.hintableKey(key)) {

 

2.How to disable JavaScript Code Hint except Ctrl-Space.

Brackets\www\extensions\default\JavaScriptCodeHints\main.js:400

before

    JSHints.prototype.hasHints = function (editor, key) {
        if (session && HintUtils.hintableKey(key)) {

after

    JSHints.prototype.hasHints = function (editor, key) {
        if (key) { return false; }
        if (session && HintUtils.hintableKey(key)) {

 

3.How to disable JavaScript Code Hint except Ctrl-Space and dot.

Brackets\www\extensions\default\JavaScriptCodeHints\main.js:400

before

    JSHints.prototype.hasHints = function (editor, key) {
        if (session && HintUtils.hintableKey(key)) {

after

    JSHints.prototype.hasHints = function (editor, key) {
        if (key && key !== ".") { return false; }
        if (session && HintUtils.hintableKey(key)) {