From 156d9a7eebd3ec8135fc39cb33d97725da509966 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sun, 9 Jun 2013 17:49:11 +0400 Subject: [PATCH] load snippet files automatically --- demo/kitchen-sink/demo.js | 48 ++++++++++++-------------- lib/ace/autocomplete/text_completer.js | 2 +- lib/ace/ext/language_tools.js | 41 ++++++++++++++++++++-- 3 files changed, 61 insertions(+), 30 deletions(-) diff --git a/demo/kitchen-sink/demo.js b/demo/kitchen-sink/demo.js index 41ed5b19..253c0dda 100644 --- a/demo/kitchen-sink/demo.js +++ b/demo/kitchen-sink/demo.js @@ -517,17 +517,9 @@ net.loadScript("https://rawgithub.com/nightwing/emmet-core/master/emmet.js", fun }) -require("ace/placeholder").PlaceHolder; +// require("ace/placeholder").PlaceHolder; -var snippetManager = require("ace/snippets").snippetManager -var jsSnippets = require("ace/snippets/javascript"); -window.snippetManager = snippetManager -saveSnippets() - -function saveSnippets() { - jsSnippets.snippets = snippetManager.parseSnippetFile(jsSnippets.snippetText); - snippetManager.register(jsSnippets.snippets, "javascript") -} +var snippetManager = require("ace/snippets").snippetManager; env.editSnippets = function() { var sp = env.split; @@ -538,28 +530,32 @@ env.editSnippets = function() { sp.setSplits(1); sp.setSplits(2); sp.setOrientation(sp.BESIDE); - var editor = sp.$editors[1] - if (!env.snippetSession) { - var file = jsSnippets.snippetText; - env.snippetSession = doclist.initDoc(file, "", {}); - env.snippetSession.setMode("ace/mode/tmsnippet"); - env.snippetSession.setUseSoftTabs(false); + var editor = sp.$editors[1]; + var id = sp.$editors[0].session.$mode.$id || ""; + var m = snippetManager.files[id]; + if (!doclist["snippets/" + id]) { + var text = m.snippetText; + var s = doclist.initDoc(text, "", {}); + s.setMode("ace/mode/snippets"); + doclist["snippets/" + id] = s } editor.on("blur", function() { - jsSnippets.snippetText = editor.getValue(); - saveSnippets(); + m.snippetText = editor.getValue(); + snippetManager.unregister(m.snippets); + m.snippets = snippetManager.parseSnippetFile(m.snippetText); + snippetManager.register(m.snippets); }) - editor.setSession(env.snippetSession, 1); + sp.$editors[0].once("changeMode", function() { + sp.setSplits(1); + }) + editor.setSession(doclist["snippets/" + id], 1); editor.focus(); } -ace.commands.bindKey("Tab", function(editor) { - var success = snippetManager.expandWithTab(editor); - if (!success) - editor.execCommand("indent"); +require("ace/ext/language_tools"); +env.editor.setOptions({ + enableBasicAutocompletion: true, + enableSnippets: true }) -require("ace/ext/language_tools"); - - }); diff --git a/lib/ace/autocomplete/text_completer.js b/lib/ace/autocomplete/text_completer.js index 30b9352f..2808ff6f 100644 --- a/lib/ace/autocomplete/text_completer.js +++ b/lib/ace/autocomplete/text_completer.js @@ -42,7 +42,7 @@ define(function(require, exports, module) { function filterPrefix(prefix, words) { var results = []; for (var i = 0; i < words.length; i++) { - if (words[i].indexOf(prefix) === 0) { + if (words[i].lastIndexOf(prefix, 0) === 0) { results.push(words[i]); } } diff --git a/lib/ace/ext/language_tools.js b/lib/ace/ext/language_tools.js index 05e00129..1d54d3b9 100644 --- a/lib/ace/ext/language_tools.js +++ b/lib/ace/ext/language_tools.js @@ -33,10 +33,27 @@ define(function(require, exports, module) { var snippetManager = require("../snippets").snippetManager; var Autocomplete = require("../autocomplete").Autocomplete; +var config = require("../config"); var textCompleter = require("../autocomplete/text_completer"); +var keyWordCompleter = { + getCompletions: function(session, pos, prefix, callback) { + var keywords = session.$mode.$keywordList || []; + keywords.filter(function(w) { + return w.lastIndexOf(prefix, 0); + }); + callback(null, keywords.map(function(word) { + return { + name: word, + value: word, + score: 0, + meta: "keyword" + }; + })); + } +}; -var completers = [textCompleter]; +var completers = [textCompleter, keyWordCompleter]; // todo add snippets completer exports.addCompleter = function(completer) { completers.push(completer); }; @@ -51,6 +68,21 @@ var expandSnippet = { bindKey: "tab" } +var onChangeMode = function(e, editor) { + var mode = editor.session.$mode; + var id = mode.$id + if (!snippetManager.files) snippetManager.files = {}; + if (id && !snippetManager.files[id]) { + var snippetFilePath = id.replace("mode", "snippets"); + config.loadModule(snippetFilePath, function(m) { + if (m) { + snippetManager.files[id] = m; + m.snippets = snippetManager.parseSnippetFile(m.snippetText); + snippetManager.register(m.snippets, m.scope); + } + }); + } +}; var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { @@ -63,17 +95,20 @@ require("../config").defineOptions(Editor.prototype, "editor", { this.commands.removeCommand(Autocomplete.startCommand); } }, - value: true + value: false }, enableSnippets: { set: function(val) { if (val) { this.commands.addCommand(expandSnippet); + this.on("changeMode", onChangeMode); + onChangeMode(null, this) } else { this.commands.removeCommand(expandSnippet); + this.off("changeMode", onChangeMode); } }, - value: true + value: false } });