add snippet completer

This commit is contained in:
DanyaPostfactum 2013-06-30 04:07:24 +10:00
commit d276f10bcd
4 changed files with 31 additions and 7 deletions

View file

@ -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();

View file

@ -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;

View file

@ -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) {

View file

@ -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);
};