From d276f10bcdc01b1928d4331523a0935c8fe0d8e8 Mon Sep 17 00:00:00 2001 From: DanyaPostfactum Date: Sun, 30 Jun 2013 04:07:24 +1000 Subject: [PATCH] add snippet completer --- lib/ace/autocomplete.js | 5 +++-- lib/ace/autocomplete/popup.js | 6 ++++-- lib/ace/autocomplete/text_completer.js | 2 +- lib/ace/ext/language_tools.js | 25 +++++++++++++++++++++++-- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/lib/ace/autocomplete.js b/lib/ace/autocomplete.js index 5b6d4c30..4638d959 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(); @@ -143,7 +144,7 @@ var Autocomplete = function() { range.start.column -= this.completions.filterText.length; this.editor.session.remove(range); } - this.editor.insert(data); + snippetManager.insertSnippet(this.editor, data); } }; @@ -172,7 +173,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..4c6cbe08 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, + value: s.content, + meta: 'snippet' + }); + } + }, this); + callback(null, completions); + } +}; + +var completers = [snippetCompleter, textCompleter, keyWordCompleter]; exports.addCompleter = function(completer) { completers.push(completer); };