diff --git a/lib/ace/autocomplete.js b/lib/ace/autocomplete.js index 5b6d4c30..f0252680 100644 --- a/lib/ace/autocomplete.js +++ b/lib/ace/autocomplete.js @@ -36,6 +36,7 @@ var AcePopup = require("./autocomplete/popup").AcePopup; var util = require("./autocomplete/util"); var event = require("./lib/event"); var lang = require("./lib/lang"); +var snippetManager = require("./snippets").snippetManager; var Autocomplete = function() { this.keyboardHandler = new HashHandler(); @@ -136,14 +137,15 @@ var Autocomplete = function() { if (data.completer && data.completer.insertMatch) { data.completer.insertMatch(this.editor); } else { - if (data.value) - data = data.value; if (this.completions.filterText) { var range = this.editor.selection.getRange(); range.start.column -= this.completions.filterText.length; this.editor.session.remove(range); } - this.editor.insert(data); + if (data.snippet) + snippetManager.insertSnippet(this.editor, data.snippet); + else + this.editor.insert(data.value || data); } }; @@ -172,7 +174,7 @@ var Autocomplete = function() { var matches = []; util.parForEach(editor.completers, function(completer, next) { - completer.getCompletions(session, pos, prefix, function(err, results) { + completer.getCompletions(editor, session, pos, prefix, function(err, results) { if (!err) matches = matches.concat(results); next(); diff --git a/lib/ace/autocomplete/popup.js b/lib/ace/autocomplete/popup.js index 5b7ce0b3..ece43d6a 100644 --- a/lib/ace/autocomplete/popup.js +++ b/lib/ace/autocomplete/popup.js @@ -128,11 +128,13 @@ var AcePopup = function(parentNode) { return tokens; if (typeof data == "string") data = {value: data}; + if (!data.caption) + data.caption = data.value; - tokens.push({type: data.className || "", value: data.value}); + tokens.push({type: data.className || "", value: data.caption}); if (data.meta) { var maxW = popup.renderer.$size.scrollerWidth / popup.renderer.layerConfig.characterWidth; - if (data.meta.length + data.value.length < maxW - 2) + if (data.meta.length + data.caption.length < maxW - 2) tokens.push({type: "rightAlignedText", value: data.meta}); } return tokens; diff --git a/lib/ace/autocomplete/text_completer.js b/lib/ace/autocomplete/text_completer.js index 2808ff6f..8e4bc019 100644 --- a/lib/ace/autocomplete/text_completer.js +++ b/lib/ace/autocomplete/text_completer.js @@ -74,7 +74,7 @@ define(function(require, exports, module) { return wordScores; } - exports.getCompletions = function(session, pos, prefix, callback) { + exports.getCompletions = function(editor, session, pos, prefix, callback) { var wordScore = wordDistance(session, pos, prefix); var wordList = filterPrefix(prefix, Object.keys(wordScore)); callback(null, wordList.map(function(word) { diff --git a/lib/ace/ext/language_tools.js b/lib/ace/ext/language_tools.js index 7133d740..0a9a3fd0 100644 --- a/lib/ace/ext/language_tools.js +++ b/lib/ace/ext/language_tools.js @@ -37,7 +37,7 @@ var config = require("../config"); var textCompleter = require("../autocomplete/text_completer"); var keyWordCompleter = { - getCompletions: function(session, pos, prefix, callback) { + getCompletions: function(editor, session, pos, prefix, callback) { var keywords = session.$mode.$keywordList || []; keywords = keywords.filter(function(w) { return w.lastIndexOf(prefix, 0) == 0; @@ -53,7 +53,28 @@ var keyWordCompleter = { } }; -var completers = [textCompleter, keyWordCompleter]; // todo add snippets completer +var snippetCompleter = { + getCompletions: function(editor, session, pos, prefix, callback) { + var scope = snippetManager.$getScope(editor); + var snippetMap = snippetManager.snippetMap; + var completions = []; + [scope, "_"].forEach(function(scope) { + var snippets = snippetMap[scope] || []; + for (var i = snippets.length; i--;) { + var s = snippets[i]; + if (s.tabTrigger && s.tabTrigger.indexOf(prefix) === 0) + completions.push({ + caption: s.tabTrigger, + snippet: s.content, + meta: "snippet" + }); + } + }, this); + callback(null, completions); + } +}; + +var completers = [snippetCompleter, textCompleter, keyWordCompleter]; exports.addCompleter = function(completer) { completers.push(completer); };