From a188ac7fa621d952ed9c72472b7f494c4ac15291 Mon Sep 17 00:00:00 2001 From: nightwing Date: Wed, 2 Apr 2014 00:03:53 +0400 Subject: [PATCH 1/6] fix regression for autocomplete with empty prefix --- lib/ace/autocomplete.js | 3 +- lib/ace/ext/language_tools.js | 65 ++++++++++++---------------------- lib/ace/snippets/javascript.js | 4 +-- 3 files changed, 24 insertions(+), 48 deletions(-) diff --git a/lib/ace/autocomplete.js b/lib/ace/autocomplete.js index f3800c16..6e064381 100644 --- a/lib/ace/autocomplete.js +++ b/lib/ace/autocomplete.js @@ -283,8 +283,7 @@ var Autocomplete = function() { // if (matches.length == 1) // return this.insertMatch(matches[0]); - // No prefix or no results -> close - if (!prefix || !prefix.length || !matches || !matches.length) + if (!matches || !matches.length) return doDetach(); // Wrong prefix or wrong session -> ignore diff --git a/lib/ace/ext/language_tools.js b/lib/ace/ext/language_tools.js index 0f9be6b9..6c1182a1 100644 --- a/lib/ace/ext/language_tools.js +++ b/lib/ace/ext/language_tools.js @@ -117,53 +117,32 @@ var loadSnippetFile = function(id) { var doLiveAutocomplete = function(e) { var editor = e.editor; - var session = editor.getSession(); - var pos = editor.getCursorPosition(); - var line = session.getLine(pos.row); - var hasCompleter = (editor.completer && editor.completer.activated); - var text = e.args || ""; - - // Is the user entering text - // we only want to automatically show the autocomplete dialog - // whenever the user is typing in text not pasting, deleting, ... - var typing = (e.command.name === "insertstring" && text.length === 1); - - // We don't want to autocomplete with no prefix - if( - e.command.name === 'backspace' && - util.retrievePrecedingIdentifier(line, pos.column) === '' - ) { - if(hasCompleter) editor.completer.detach(); - return; - } - - // we don't want to autocomplete on paste events - if(!typing) { - return; - } - - // The prefix to autocomplete for + var pos = editor.getCursorPosition(); + var line = editor.session.getLine(pos.row); + var hasCompleter = editor.completer && editor.completer.activated; var prefix = util.retrievePrecedingIdentifier(line, pos.column); - // Only autocomplete if there's a prefix that can be matched - if(prefix !== '' && !(hasCompleter)) { - if (!editor.completer) { - // Create new autocompleter - editor.completer = new Autocomplete(); - - // Disable autoInsert - editor.completer.autoInsert = false; + // We don't want to autocomplete with no prefix + if (e.command.name === "backspace" && !prefix) { + if (hasCompleter) + editor.completer.detach(); + } + else if (e.command.name === "insertstring") { + // Only autocomplete if there's a prefix that can be matched + if (prefix && !hasCompleter) { + if (!editor.completer) { + // Create new autocompleter + editor.completer = new Autocomplete(); + // Disable autoInsert + editor.completer.autoInsert = false; + } + editor.completer.showPopup(editor); + } else if (!prefix && hasCompleter) { + // When the prefix is empty + // close the autocomplete dialog + editor.completer.detach(); } - - editor.completer.showPopup(editor); - // needed for firefox on mac - editor.completer.cancelContextMenu(); - - } else if(prefix === '' && hasCompleter) { - // When the prefix is empty - // close the autocomplete dialog - editor.completer.detach(); } }; diff --git a/lib/ace/snippets/javascript.js b/lib/ace/snippets/javascript.js index ed832d74..bf59ba85 100644 --- a/lib/ace/snippets/javascript.js +++ b/lib/ace/snippets/javascript.js @@ -1,9 +1,7 @@ define(function(require, exports, module) { "use strict"; -exports.snippetText = require("../requirejs/text!./javascript-jquery.snippets") - + "\n" - + require("../requirejs/text!./javascript.snippets"); +exports.snippetText = require("../requirejs/text!./javascript.snippets"); exports.scope = "javascript"; }); From a7297de55f6da1f6f807d0cd374232edb9dace02 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Sat, 5 Apr 2014 20:16:02 +0200 Subject: [PATCH 2/6] Update autocomplete to handle custom identifier regexprsw --- lib/ace/autocomplete.js | 7 ++----- lib/ace/ext/language_tools.js | 12 ++++++++++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/ace/autocomplete.js b/lib/ace/autocomplete.js index 6e064381..ccc50a4c 100644 --- a/lib/ace/autocomplete.js +++ b/lib/ace/autocomplete.js @@ -212,7 +212,7 @@ var Autocomplete = function() { var pos = editor.getCursorPosition(); var line = session.getLine(pos.row); callback(null, { - prefix: util.retrievePrecedingIdentifier(line, pos.column), + prefix: util.retrievePrecedingIdentifier(line, pos.column, results.length > 0 ? results[0].identifierRegex : undefined), matches: matches, finished: (--total === 0) }); @@ -270,10 +270,7 @@ var Autocomplete = function() { }.bind(this); // Calcul prefix - var session = this.editor.getSession(); - var pos = this.editor.getCursorPosition(); - var line = session.getLine(pos.row); - var prefix = util.retrievePrecedingIdentifier(line, pos.column); + var prefix = results.prefix; // Results matches var matches = results && results.matches; diff --git a/lib/ace/ext/language_tools.js b/lib/ace/ext/language_tools.js index 6c1182a1..b6cc9d0d 100644 --- a/lib/ace/ext/language_tools.js +++ b/lib/ace/ext/language_tools.js @@ -122,7 +122,15 @@ var doLiveAutocomplete = function(e) { var line = editor.session.getLine(pos.row); var hasCompleter = editor.completer && editor.completer.activated; var prefix = util.retrievePrecedingIdentifier(line, pos.column); - + //Try to find custom prefixes on the completors + completers.forEach(function(completer){ + if(completer.identifierRegexprs){ + completer.identifierRegexprs.forEach(function(identifierRegex){ + prefix = util.retrievePrecedingIdentifier(line, pos.column, identifierRegex); + }); + } + }); + // We don't want to autocomplete with no prefix if (e.command.name === "backspace" && !prefix) { if (hasCompleter) @@ -185,4 +193,4 @@ require("../config").defineOptions(Editor.prototype, "editor", { } }); -}); \ No newline at end of file +}); From a05b84f4dfb9785866726d9109e68763a20bacc5 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Sat, 5 Apr 2014 22:38:23 +0200 Subject: [PATCH 3/6] Bug fix --- lib/ace/ext/language_tools.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/ace/ext/language_tools.js b/lib/ace/ext/language_tools.js index b6cc9d0d..39b1946a 100644 --- a/lib/ace/ext/language_tools.js +++ b/lib/ace/ext/language_tools.js @@ -126,7 +126,9 @@ var doLiveAutocomplete = function(e) { completers.forEach(function(completer){ if(completer.identifierRegexprs){ completer.identifierRegexprs.forEach(function(identifierRegex){ - prefix = util.retrievePrecedingIdentifier(line, pos.column, identifierRegex); + if(!prefix) { + prefix = util.retrievePrecedingIdentifier(line, pos.column, identifierRegex); + } }); } }); From b67caa11631f22450bc929c57036345a0074d12c Mon Sep 17 00:00:00 2001 From: William Candillon Date: Sat, 5 Apr 2014 23:31:20 +0200 Subject: [PATCH 4/6] Disable Tab command binding for autocomplete (incompatible with live autocomplete) --- lib/ace/autocomplete.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ace/autocomplete.js b/lib/ace/autocomplete.js index ccc50a4c..4cc29043 100644 --- a/lib/ace/autocomplete.js +++ b/lib/ace/autocomplete.js @@ -186,7 +186,6 @@ var Autocomplete = function() { editor.completer.insertMatch(); }, "Shift-Return": function(editor) { editor.completer.insertMatch(true); }, - "Tab": function(editor) { editor.completer.insertMatch(); }, "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); }, "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); } From c3dd9ff510feb906fcf4400919dfa2d08269eafe Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 4 Apr 2014 23:12:34 +0400 Subject: [PATCH 5/6] remove bogus string.regexp highlight rules from java and c# --- lib/ace/mode/csharp_highlight_rules.js | 3 --- lib/ace/mode/java_highlight_rules.js | 3 --- 2 files changed, 6 deletions(-) diff --git a/lib/ace/mode/csharp_highlight_rules.js b/lib/ace/mode/csharp_highlight_rules.js index 89cbc2d5..6e7ba5d4 100644 --- a/lib/ace/mode/csharp_highlight_rules.js +++ b/lib/ace/mode/csharp_highlight_rules.js @@ -26,9 +26,6 @@ var CSharpHighlightRules = function() { token : "comment", // multi line comment regex : "\\/\\*", next : "comment" - }, { - token : "string.regexp", - regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" }, { token : "string", // character regex : /'(?:.|\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n]))'/ diff --git a/lib/ace/mode/java_highlight_rules.js b/lib/ace/mode/java_highlight_rules.js index 8cba835c..d39d9aad 100644 --- a/lib/ace/mode/java_highlight_rules.js +++ b/lib/ace/mode/java_highlight_rules.js @@ -72,9 +72,6 @@ var JavaHighlightRules = function() { token : "comment", // multi line comment regex : "\\/\\*", next : "comment" - }, { - token : "string.regexp", - regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" }, { token : "string", // single line regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' From 4599dc6834127f76acf2f07f00e976e124ed1980 Mon Sep 17 00:00:00 2001 From: nightwing Date: Tue, 8 Apr 2014 22:51:57 +0400 Subject: [PATCH 6/6] cleanup --- lib/ace/autocomplete.js | 37 ++++++++++++++++------------------- lib/ace/ext/language_tools.js | 16 ++++++++------- lib/ace/snippets.js | 2 +- 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/lib/ace/autocomplete.js b/lib/ace/autocomplete.js index 4cc29043..475daee1 100644 --- a/lib/ace/autocomplete.js +++ b/lib/ace/autocomplete.js @@ -180,12 +180,15 @@ var Autocomplete = function() { "Esc": function(editor) { editor.completer.detach(); }, "Space": function(editor) { editor.completer.detach(); editor.insert(" ");}, - "Return": function(editor) { - if (editor.completer.popup.getRow() == -1) - return false; - editor.completer.insertMatch(); - }, + "Return": function(editor) { return editor.completer.insertMatch(); }, "Shift-Return": function(editor) { editor.completer.insertMatch(true); }, + "Tab": function(editor) { + var result = editor.completer.insertMatch(); + if (!result && !editor.tabstopManager) + editor.completer.goTo("down"); + else + return result; + }, "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); }, "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); } @@ -207,16 +210,16 @@ var Autocomplete = function() { completer.getCompletions(editor, session, pos, prefix, function(err, results) { if (!err) matches = matches.concat(results); - // Fetch prefix again, because they may have changed by now - var pos = editor.getCursorPosition(); - var line = session.getLine(pos.row); - callback(null, { - prefix: util.retrievePrecedingIdentifier(line, pos.column, results.length > 0 ? results[0].identifierRegex : undefined), + // Fetch prefix again, because they may have changed by now + var pos = editor.getCursorPosition(); + var line = session.getLine(pos.row); + callback(null, { + prefix: util.retrievePrecedingIdentifier(line, pos.column, results[0] && results[0].identifierRegex), matches: matches, finished: (--total === 0) + }); }); }); - }); return true; }; @@ -268,17 +271,9 @@ var Autocomplete = function() { return this.detach(); }.bind(this); - // Calcul prefix var prefix = results.prefix; - - // Results matches var matches = results && results.matches; - if (!matches || !matches.length) - return this.detach(); - // TODO reenable this when we have proper change tracking - // if (matches.length == 1) - // return this.insertMatch(matches[0]); - + if (!matches || !matches.length) return doDetach(); @@ -323,6 +318,8 @@ Autocomplete.startCommand = { exec: function(editor) { if (!editor.completer) editor.completer = new Autocomplete(); + editor.completer.autoInsert = + editor.completer.autoSelect = true; editor.completer.showPopup(editor); // needed for firefox on mac editor.completer.cancelContextMenu(); diff --git a/lib/ace/ext/language_tools.js b/lib/ace/ext/language_tools.js index 39b1946a..1933b4ff 100644 --- a/lib/ace/ext/language_tools.js +++ b/lib/ace/ext/language_tools.js @@ -79,7 +79,7 @@ var expandSnippet = { if (!success) editor.execCommand("indent"); }, - bindKey: "tab" + bindKey: "Tab" }; var onChangeMode = function(e, editor) { @@ -122,17 +122,18 @@ var doLiveAutocomplete = function(e) { var line = editor.session.getLine(pos.row); var hasCompleter = editor.completer && editor.completer.activated; var prefix = util.retrievePrecedingIdentifier(line, pos.column); - //Try to find custom prefixes on the completors - completers.forEach(function(completer){ - if(completer.identifierRegexprs){ - completer.identifierRegexprs.forEach(function(identifierRegex){ - if(!prefix) { + + //Try to find custom prefixes on the completers + completers.forEach(function(completer) { + if (completer.identifierRegexps) { + completer.identifierRegexps.forEach(function(identifierRegex){ + if (!prefix) { prefix = util.retrievePrecedingIdentifier(line, pos.column, identifierRegex); } }); } }); - + // We don't want to autocomplete with no prefix if (e.command.name === "backspace" && !prefix) { if (hasCompleter) @@ -145,6 +146,7 @@ var doLiveAutocomplete = function(e) { // Create new autocompleter editor.completer = new Autocomplete(); // Disable autoInsert + editor.completer.autoSelect = false; editor.completer.autoInsert = false; } editor.completer.showPopup(editor); diff --git a/lib/ace/snippets.js b/lib/ace/snippets.js index f382f7ba..f09bba2c 100644 --- a/lib/ace/snippets.js +++ b/lib/ace/snippets.js @@ -379,7 +379,7 @@ var SnippetManager = function() { scope = scope.split("/").pop(); if (scope === "html" || scope === "php") { // PHP is actually HTML - if (scope === "php") + if (scope === "php" && !editor.session.$mode.inlinePhp) scope = "html"; var c = editor.getCursorPosition() var state = editor.session.getState(c.row);