diff --git a/lib/ace/ext/language_tools.js b/lib/ace/ext/language_tools.js index e0ed0ec7..e7cb1fba 100644 --- a/lib/ace/ext/language_tools.js +++ b/lib/ace/ext/language_tools.js @@ -34,6 +34,7 @@ define(function(require, exports, module) { var snippetManager = require("../snippets").snippetManager; var Autocomplete = require("../autocomplete").Autocomplete; var config = require("../config"); +var util = require("../autocomplete/util"); var textCompleter = require("../autocomplete/text_completer"); var keyWordCompleter = { @@ -114,6 +115,30 @@ var loadSnippetFile = function(id) { }); }; +var onChangeAutocomplete = function(e, editor) { + var session = editor.getSession(); + var pos = editor.getCursorPosition(); + var line = session.getLine(pos.row); + + // Append added text to the line + if(e.data.action === 'insertText') { + line += e.data.text; + pos.column += e.data.text.length; + } + + // The prefix to autocomplete for + var prefix = util.retrievePrecedingIdentifier(line, pos.column); + + // Only autocomplete if there's a prefix that can be matched + if(prefix !== '') { + Autocomplete.startCommand.exec(editor); + } else if(editor.completer && editor.completer.activated) { + // When the prefix is empty + // close the autocomplete dialog + editor.completer.detach(); + } +}; + var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { enableBasicAutocompletion: { @@ -121,7 +146,11 @@ require("../config").defineOptions(Editor.prototype, "editor", { if (val) { this.completers = completers; this.commands.addCommand(Autocomplete.startCommand); + + // On each change automatically trigger the autocomplete + this.on('change', onChangeAutocomplete); } else { + this.removeListener('change', onChangeAutocomplete); this.commands.removeCommand(Autocomplete.startCommand); } },