diff --git a/common/content/ui.js b/common/content/ui.js index e069478f..f67f89a5 100644 --- a/common/content/ui.js +++ b/common/content/ui.js @@ -384,37 +384,41 @@ function CommandLine() //{{{ if (idx == -2) list = list.slice().reverse(); let n = 0; - for (let [,context] in Iterator(list)) + try { - function done() !(idx >= n + context.items.length || idx == -2 && !context.items.length); - while (context.incomplete && !done()) + this.waiting = true; + for (let [,context] in Iterator(list)) { - // threadYield(true, true) would be better, but it does not return on my - // machine until all awesomebar completions were reported, making - // :open foo nearly unusable, if the first 2 foo-completions would - // be there fast, but it takes up to 20 sec to find more foo-completions - // - // The strange thing is, I tested the 2009-01-07 nightly at work in Windows - // and it seemed to work perfectly there. Will have to see if it's a - // hardware (dual core there, vs. P4 at home) issue or an OS issue. - // - // While I *really* prefer this solution over my hack - // when it works, we can't have a nearly-defect :open - // prompt when releasing vimp 2.0, even not just on certain - // computers, as :open is probably the most often used ex-command - // in vimperator - // - // liberator.threadYield(false, true); is just a temporary measure as - // it has other problems (hitting tab often in a row), until we find the - // source of the problem (which we hopefully do, as I really don't want to - // have to revert to my hack when better solutions exist) - liberator.dump("before yielding"); - liberator.threadYield(false, true); - liberator.dump("after yielding"); + function done() !(idx >= n + context.items.length || idx == -2 && !context.items.length); + while (context.incomplete && !done()) + // threadYield(true, true) would be better, but it does not return on my + // machine until all awesomebar completions were reported, making + // :open foo nearly unusable, if the first 2 foo-completions would + // be there fast, but it takes up to 20 sec to find more foo-completions + // + // The strange thing is, I tested the 2009-01-07 nightly at work in Windows + // and it seemed to work perfectly there. Will have to see if it's a + // hardware (dual core there, vs. P4 at home) issue or an OS issue. + // + // While I *really* prefer this solution over my hack + // when it works, we can't have a nearly-defect :open + // prompt when releasing vimp 2.0, even not just on certain + // computers, as :open is probably the most often used ex-command + // in vimperator + // + // liberator.threadYield(false, true); is just a temporary measure as + // it has other problems (hitting tab often in a row), until we find the + // source of the problem (which we hopefully do, as I really don't want to + // have to revert to my hack when better solutions exist) + liberator.threadYield(false, true); + if (done()) + break; + n += context.items.length; } - if (done()) - break; - n += context.items.length; + } + finally + { + this.waiting = false; } // See previous FIXME. This will break if new items in @@ -429,6 +433,8 @@ function CommandLine() //{{{ this.itemList.selectItem(idx); }, + ntab: 0, + tab: function tab(reverse) { autocompleteTimer.flush(); @@ -436,34 +442,41 @@ function CommandLine() //{{{ if (this.context.waitingForTab || this.wildIndex == -1) this.complete(true, true); - switch (this.wildtype.replace(/.*:/, "")) + this.ntab++; + if (this.waiting) + return; + + while (this.ntab--) { - case "": - this.select(0); - break; - case "longest": - if (this.items.length > 1) - { - if (this.substring && this.substring != this.completion) - this.completion = this.substring; + switch (this.wildtype.replace(/.*:/, "")) + { + case "": + this.select(0); break; - } - // Fallthrough - case "full": - this.select(reverse ? this.UP : this.DOWN) - break; + case "longest": + if (this.items.length > 1) + { + if (this.substring && this.substring != this.completion) + this.completion = this.substring; + break; + } + // Fallthrough + case "full": + this.select(reverse ? this.UP : this.DOWN) + break; + } + + if (this.type.list) + completionList.show(); + + this.wildIndex = Math.max(0, Math.min(this.wildtypes.length - 1, this.wildIndex + 1)); + this.preview(); + + statusTimer.tell(); } if (this.items.length == 0) - return void liberator.beep(); - - if (this.type.list) - completionList.show(); - - this.wildIndex = Math.max(0, Math.min(this.wildtypes.length - 1, this.wildIndex + 1)); - this.preview(); - - statusTimer.tell(); + liberator.beep(); } }