diff --git a/demo/kitchen-sink/demo.js b/demo/kitchen-sink/demo.js index a4ba5c53..2b0fcb68 100644 --- a/demo/kitchen-sink/demo.js +++ b/demo/kitchen-sink/demo.js @@ -450,14 +450,20 @@ 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.snipp SnippetManager.register(jsSnippets.snippets, "javascript") } env.editSnippets = function() { var sp = env.split; + if (sp.getSplits() == 2) { + sp.setSplits(1); + return; + } sp.setSplits(1); sp.setSplits(2); sp.setOrientation(sp.BESIDE); diff --git a/lib/ace/snippets.js b/lib/ace/snippets.js index 5b41f078..b786aed5 100644 --- a/lib/ace/snippets.js +++ b/lib/ace/snippets.js @@ -404,6 +404,7 @@ var SnippetManager = function() { this.register = function(snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; + var self = this; function wrapRegexp(src) { if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) src = "(?:" + src + ")" @@ -433,9 +434,15 @@ var SnippetManager = function() { snippetMap[scope] = []; snippetNameMap[scope] = {}; } + + var map = snippetNameMap[scope]; + if (s.name) { + var old = map[s.name]; + if (old) + self.unregister(old); + map[s.name] = s; + } snippetMap[scope].push(s); - if (s.name) - snippetNameMap[scope][s.name] = s; if (s.tabTrigger && !s.trigger) { if (!s.guard && /^\w/.test(s.tabTrigger)) @@ -455,6 +462,25 @@ var SnippetManager = function() { else if (Array.isArray(snippets)) snippets.forEach(addSnippet); }; + this.unregister = function(snippets, scope) { + var snippetMap = this.snippetMap; + var snippetNameMap = this.snippetNameMap; + + function removeSnippet(s) { + var map = snippetNameMap[scope]; + if (map && map[s.name]) { + delete map[s.name]; + map = snippetMap[scope]; + var i = map && map.indexOf(s); + if (i >= 0) + map.splice(i, 1); + } + } + if (snippets.content) + removeSnippet(snippets); + else if (Array.isArray(snippets)) + snippets.forEach(removeSnippet); + }; this.parseSnippetFile = function(str) { var list = [], snippet = {}; var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm; diff --git a/lib/ace/snippets/javascript.snippets b/lib/ace/snippets/javascript.snippets index 813876e2..9c2ad1b2 100644 --- a/lib/ace/snippets/javascript.snippets +++ b/lib/ace/snippets/javascript.snippets @@ -163,13 +163,13 @@ snippet for- } # for (...) {...} snippet for - for (var ${1:i} = 0; $1 < ${2:Things}.length; $1${3:++}) { - ${0:$2[$1]} + for (var ${1:i} = 0; $1 < ${2:Things}.length; $1$++) { + ${3:$2[$1]}$0 } # for (...) {...} (Improved Native For-Loop) snippet forr - for (var ${1:i} = ${2:Things}.length - 1; $1 >= 0; $1${3:--}) { - ${0:$2[$1]} + for (var ${1:i} = ${2:Things}.length - 1; $1 >= 0; $1$--) { + ${3:$2[$1]}$0 }