codemirror-rails 3.14 → 3.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/codemirror.js +178 -94
  4. data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +3 -3
  5. data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +3 -1
  6. data/vendor/assets/javascripts/codemirror/addons/edit/matchtags.js +51 -0
  7. data/vendor/assets/javascripts/codemirror/addons/fold/brace-fold.js +9 -6
  8. data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +9 -4
  9. data/vendor/assets/javascripts/codemirror/addons/fold/foldgutter.js +122 -0
  10. data/vendor/assets/javascripts/codemirror/addons/fold/indent-fold.js +3 -2
  11. data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +24 -17
  12. data/vendor/assets/javascripts/codemirror/addons/hint/anyword-hint.js +34 -0
  13. data/vendor/assets/javascripts/codemirror/addons/hint/html-hint.js +5 -3
  14. data/vendor/assets/javascripts/codemirror/addons/hint/javascript-hint.js +7 -3
  15. data/vendor/assets/javascripts/codemirror/addons/hint/pig-hint.js +4 -2
  16. data/vendor/assets/javascripts/codemirror/addons/hint/python-hint.js +4 -2
  17. data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +6 -2
  18. data/vendor/assets/javascripts/codemirror/addons/hint/xml-hint.js +5 -2
  19. data/vendor/assets/javascripts/codemirror/addons/lint/coffeescript-lint.js +3 -2
  20. data/vendor/assets/javascripts/codemirror/addons/lint/javascript-lint.js +3 -6
  21. data/vendor/assets/javascripts/codemirror/addons/lint/json-lint.js +3 -2
  22. data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +12 -6
  23. data/vendor/assets/javascripts/codemirror/addons/merge/dep/diff_match_patch.js +50 -0
  24. data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +40 -24
  25. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode-standalone.js +3 -1
  26. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +3 -1
  27. data/vendor/assets/javascripts/codemirror/addons/search/match-highlighter.js +11 -9
  28. data/vendor/assets/javascripts/codemirror/addons/selection/active-line.js +1 -1
  29. data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +608 -0
  30. data/vendor/assets/javascripts/codemirror/addons/tern/worker.js +39 -0
  31. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +120 -101
  32. data/vendor/assets/javascripts/codemirror/modes/clike.js +2 -1
  33. data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +2 -1
  34. data/vendor/assets/javascripts/codemirror/modes/css.js +33 -16
  35. data/vendor/assets/javascripts/codemirror/modes/groovy.js +2 -1
  36. data/vendor/assets/javascripts/codemirror/modes/jade.js +90 -0
  37. data/vendor/assets/javascripts/codemirror/modes/javascript.js +21 -18
  38. data/vendor/assets/javascripts/codemirror/modes/markdown.js +26 -1
  39. data/vendor/assets/javascripts/codemirror/modes/nginx.js +163 -0
  40. data/vendor/assets/javascripts/codemirror/modes/python.js +19 -2
  41. data/vendor/assets/javascripts/codemirror/modes/rst.js +30 -19
  42. data/vendor/assets/javascripts/codemirror/modes/ruby.js +4 -4
  43. data/vendor/assets/javascripts/codemirror/modes/rust.js +2 -1
  44. data/vendor/assets/javascripts/codemirror/modes/scss_test.js +1 -1
  45. data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +12 -2
  46. data/vendor/assets/javascripts/codemirror/modes/smartymixed.js +170 -0
  47. data/vendor/assets/javascripts/codemirror/modes/sparql.js +4 -2
  48. data/vendor/assets/javascripts/codemirror/modes/vbscript.js +330 -22
  49. data/vendor/assets/javascripts/codemirror/modes/xml.js +18 -3
  50. data/vendor/assets/stylesheets/codemirror.css +10 -0
  51. data/vendor/assets/stylesheets/codemirror/addons/merge/merge.css +39 -29
  52. data/vendor/assets/stylesheets/codemirror/addons/tern/tern.css +85 -0
  53. data/vendor/assets/stylesheets/codemirror/themes/3024-day.css +33 -0
  54. data/vendor/assets/stylesheets/codemirror/themes/3024-night.css +33 -0
  55. data/vendor/assets/stylesheets/codemirror/themes/base16-dark.css +33 -0
  56. data/vendor/assets/stylesheets/codemirror/themes/base16-light.css +33 -0
  57. data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +1 -1
  58. data/vendor/assets/stylesheets/codemirror/themes/midnight.css +5 -14
  59. data/vendor/assets/stylesheets/codemirror/themes/tomorrow-night-eighties.css +33 -0
  60. data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +2 -2
  61. metadata +17 -2
@@ -17,7 +17,7 @@
17
17
 
18
18
  CodeMirror.defineExtension("lineComment", function(from, to, options) {
19
19
  if (!options) options = noOptions;
20
- var self = this, mode = CodeMirror.innerMode(self.getMode(), self.getTokenAt(from).state).mode;
20
+ var self = this, mode = self.getModeAt(from);
21
21
  var commentString = options.lineComment || mode.lineComment;
22
22
  if (!commentString) {
23
23
  if (options.blockCommentStart || mode.blockCommentStart) {
@@ -52,7 +52,7 @@
52
52
 
53
53
  CodeMirror.defineExtension("blockComment", function(from, to, options) {
54
54
  if (!options) options = noOptions;
55
- var self = this, mode = CodeMirror.innerMode(self.getMode(), self.getTokenAt(from).state).mode;
55
+ var self = this, mode = self.getModeAt(from);
56
56
  var startString = options.blockCommentStart || mode.blockCommentStart;
57
57
  var endString = options.blockCommentEnd || mode.blockCommentEnd;
58
58
  if (!startString || !endString) {
@@ -85,7 +85,7 @@
85
85
 
86
86
  CodeMirror.defineExtension("uncomment", function(from, to, options) {
87
87
  if (!options) options = noOptions;
88
- var self = this, mode = CodeMirror.innerMode(self.getMode(), self.getTokenAt(from).state).mode;
88
+ var self = this, mode = self.getModeAt(from);
89
89
  var end = Math.min(to.line, self.lastLine()), start = Math.min(from.line, end);
90
90
 
91
91
  // Try finding line comments
@@ -54,7 +54,9 @@
54
54
  if (cm.somethingSelected()) return surround(cm);
55
55
  if (left == right && maybeOverwrite(cm) != CodeMirror.Pass) return;
56
56
  var cur = cm.getCursor(), ahead = CodeMirror.Pos(cur.line, cur.ch + 1);
57
- var line = cm.getLine(cur.line), nextChar = line.charAt(cur.ch);
57
+ var line = cm.getLine(cur.line), nextChar = line.charAt(cur.ch), curChar = cur.ch > 0 ? line.charAt(cur.ch - 1) : "";
58
+ if (left == right && CodeMirror.isWordChar(curChar))
59
+ return CodeMirror.Pass;
58
60
  if (line.length == cur.ch || closingBrackets.indexOf(nextChar) >= 0 || SPACE_CHAR_REGEX.test(nextChar))
59
61
  cm.replaceSelection(left + right, {head: ahead, anchor: ahead});
60
62
  else
@@ -0,0 +1,51 @@
1
+ (function() {
2
+ "use strict";
3
+
4
+ CodeMirror.defineOption("matchTags", false, function(cm, val, old) {
5
+ if (old && old != CodeMirror.Init) {
6
+ cm.off("cursorActivity", doMatchTags);
7
+ cm.off("viewportChange", maybeUpdateMatch);
8
+ clear(cm);
9
+ }
10
+ if (val) {
11
+ cm.on("cursorActivity", doMatchTags);
12
+ cm.on("viewportChange", maybeUpdateMatch);
13
+ doMatchTags(cm);
14
+ }
15
+ });
16
+
17
+ function clear(cm) {
18
+ if (cm.state.matchedTag) {
19
+ cm.state.matchedTag.clear();
20
+ cm.state.matchedTag = null;
21
+ }
22
+ }
23
+
24
+ function doMatchTags(cm) {
25
+ cm.state.failedTagMatch = false;
26
+ cm.operation(function() {
27
+ clear(cm);
28
+ var cur = cm.getCursor(), range = cm.getViewport();
29
+ range.from = Math.min(range.from, cur.line); range.to = Math.max(cur.line + 1, range.to);
30
+ var match = CodeMirror.findMatchingTag(cm, cur, range);
31
+ if (!match) return;
32
+ var other = match.at == "close" ? match.open : match.close;
33
+ if (other)
34
+ cm.state.matchedTag = cm.markText(other.from, other.to, {className: "CodeMirror-matchingtag"});
35
+ else
36
+ cm.state.failedTagMatch = true;
37
+ });
38
+ }
39
+
40
+ function maybeUpdateMatch(cm) {
41
+ if (cm.state.failedTagMatch) doMatchTags(cm);
42
+ }
43
+
44
+ CodeMirror.commands.toMatchingTag = function(cm) {
45
+ var found = CodeMirror.findMatchingTag(cm, cm.getCursor());
46
+ if (found) {
47
+ var other = found.at == "close" ? found.open : found.close;
48
+ if (other) cm.setSelection(other.to, other.from);
49
+ }
50
+ };
51
+ })();
@@ -1,4 +1,4 @@
1
- CodeMirror.braceRangeFinder = function(cm, start) {
1
+ CodeMirror.registerHelper("fold", "brace", function(cm, start) {
2
2
  var line = start.line, lineText = cm.getLine(line);
3
3
  var startCh, tokenType;
4
4
 
@@ -44,9 +44,10 @@ CodeMirror.braceRangeFinder = function(cm, start) {
44
44
  if (end == null || line == end && endCh == startCh) return;
45
45
  return {from: CodeMirror.Pos(line, startCh),
46
46
  to: CodeMirror.Pos(end, endCh)};
47
- };
47
+ });
48
+ CodeMirror.braceRangeFinder = CodeMirror.fold.brace; // deprecated
48
49
 
49
- CodeMirror.importRangeFinder = function(cm, start) {
50
+ CodeMirror.registerHelper("fold", "import", function(cm, start) {
50
51
  function hasImport(line) {
51
52
  if (line < cm.firstLine() || line > cm.lastLine()) return null;
52
53
  var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
@@ -68,9 +69,10 @@ CodeMirror.importRangeFinder = function(cm, start) {
68
69
  end = next.end;
69
70
  }
70
71
  return {from: cm.clipPos(CodeMirror.Pos(start, has.startCh + 1)), to: end};
71
- };
72
+ });
73
+ CodeMirror.importRangeFinder = CodeMirror.fold["import"]; // deprecated
72
74
 
73
- CodeMirror.includeRangeFinder = function(cm, start) {
75
+ CodeMirror.registerHelper("fold", "include", function(cm, start) {
74
76
  function hasInclude(line) {
75
77
  if (line < cm.firstLine() || line > cm.lastLine()) return null;
76
78
  var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
@@ -87,4 +89,5 @@ CodeMirror.includeRangeFinder = function(cm, start) {
87
89
  }
88
90
  return {from: CodeMirror.Pos(start, has + 1),
89
91
  to: cm.clipPos(CodeMirror.Pos(end))};
90
- };
92
+ });
93
+ CodeMirror.includeRangeFinder = CodeMirror.fold.include; // deprecated
@@ -2,7 +2,8 @@
2
2
  "use strict";
3
3
 
4
4
  function doFold(cm, pos, options) {
5
- var finder = options.call ? options : (options && options.rangeFinder);
5
+ var finder = options && (options.call ? options : options.rangeFinder);
6
+ if (!finder) finder = cm.getHelper(pos, "fold");
6
7
  if (!finder) return;
7
8
  if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0);
8
9
  var minSize = options && options.minFoldSize || 0;
@@ -29,12 +30,16 @@
29
30
  if (!range || range.cleared) return;
30
31
 
31
32
  var myWidget = makeWidget(options);
32
- CodeMirror.on(myWidget, "mousedown", function() {myRange.clear();});
33
+ CodeMirror.on(myWidget, "mousedown", function() { myRange.clear(); });
33
34
  var myRange = cm.markText(range.from, range.to, {
34
35
  replacedWith: myWidget,
35
36
  clearOnEnter: true,
36
37
  __isFold: true
37
38
  });
39
+ myRange.on("clear", function(from, to) {
40
+ CodeMirror.signal(cm, "unfold", cm, from, to);
41
+ });
42
+ CodeMirror.signal(cm, "fold", cm, range.from, range.to);
38
43
  }
39
44
 
40
45
  function makeWidget(options) {
@@ -56,7 +61,7 @@
56
61
  // New-style interface
57
62
  CodeMirror.defineExtension("foldCode", function(pos, options) { doFold(this, pos, options); });
58
63
 
59
- CodeMirror.combineRangeFinders = function() {
64
+ CodeMirror.registerHelper("fold", "combine", function() {
60
65
  var funcs = Array.prototype.slice.call(arguments, 0);
61
66
  return function(cm, start) {
62
67
  for (var i = 0; i < funcs.length; ++i) {
@@ -64,5 +69,5 @@
64
69
  if (found) return found;
65
70
  }
66
71
  };
67
- };
72
+ });
68
73
  })();
@@ -0,0 +1,122 @@
1
+ (function() {
2
+ "use strict";
3
+
4
+ CodeMirror.defineOption("foldGutter", false, function(cm, val, old) {
5
+ if (old && old != CodeMirror.Init) {
6
+ cm.clearGutter(cm.state.foldGutter.options.gutter);
7
+ cm.state.foldGutter = null;
8
+ cm.off("gutterClick", onGutterClick);
9
+ cm.off("change", onChange);
10
+ cm.off("viewportChange", onViewportChange);
11
+ cm.off("fold", onFold);
12
+ cm.off("unfold", onFold);
13
+ }
14
+ if (val) {
15
+ cm.state.foldGutter = new State(parseOptions(val));
16
+ updateInViewport(cm);
17
+ cm.on("gutterClick", onGutterClick);
18
+ cm.on("change", onChange);
19
+ cm.on("viewportChange", onViewportChange);
20
+ cm.on("fold", onFold);
21
+ cm.on("unfold", onFold);
22
+ }
23
+ });
24
+
25
+ var Pos = CodeMirror.Pos;
26
+
27
+ function State(options) {
28
+ this.options = options;
29
+ this.from = this.to = 0;
30
+ }
31
+
32
+ function parseOptions(opts) {
33
+ if (opts === true) opts = {};
34
+ if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter";
35
+ if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open";
36
+ if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded";
37
+ return opts;
38
+ }
39
+
40
+ function isFolded(cm, line) {
41
+ var marks = cm.findMarksAt(Pos(line));
42
+ for (var i = 0; i < marks.length; ++i)
43
+ if (marks[i].__isFold && marks[i].find().from.line == line) return true;
44
+ }
45
+
46
+ function marker(spec) {
47
+ if (typeof spec == "string") {
48
+ var elt = document.createElement("div");
49
+ elt.className = spec;
50
+ return elt;
51
+ } else {
52
+ return spec.cloneNode(true);
53
+ }
54
+ }
55
+
56
+ function updateFoldInfo(cm, from, to) {
57
+ var opts = cm.state.foldGutter.options, cur = from;
58
+ cm.eachLine(from, to, function(line) {
59
+ var mark = null;
60
+ if (isFolded(cm, cur)) {
61
+ mark = marker(opts.indicatorFolded);
62
+ } else {
63
+ var pos = Pos(cur, 0), func = opts.rangeFinder || cm.getHelper(pos, "fold");
64
+ var range = func && func(cm, pos);
65
+ if (range && range.from.line + 1 < range.to.line)
66
+ mark = marker(opts.indicatorOpen);
67
+ }
68
+ cm.setGutterMarker(line, opts.gutter, mark);
69
+ ++cur;
70
+ });
71
+ }
72
+
73
+ function updateInViewport(cm) {
74
+ var vp = cm.getViewport(), state = cm.state.foldGutter;
75
+ if (!state) return;
76
+ cm.operation(function() {
77
+ updateFoldInfo(cm, vp.from, vp.to);
78
+ });
79
+ state.from = vp.from; state.to = vp.to;
80
+ }
81
+
82
+ function onGutterClick(cm, line, gutter) {
83
+ var opts = cm.state.foldGutter.options;
84
+ if (gutter != opts.gutter) return;
85
+ cm.foldCode(Pos(line, 0), opts.rangeFinder);
86
+ }
87
+
88
+ function onChange(cm) {
89
+ var state = cm.state.foldGutter;
90
+ state.from = state.to = 0;
91
+ clearTimeout(state.changeUpdate);
92
+ state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, 600);
93
+ }
94
+
95
+ function onViewportChange(cm) {
96
+ var state = cm.state.foldGutter;
97
+ clearTimeout(state.changeUpdate);
98
+ state.changeUpdate = setTimeout(function() {
99
+ var vp = cm.getViewport();
100
+ if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {
101
+ updateInViewport(cm);
102
+ } else {
103
+ cm.operation(function() {
104
+ if (vp.from < state.from) {
105
+ updateFoldInfo(cm, vp.from, state.from);
106
+ state.from = vp.from;
107
+ }
108
+ if (vp.to > state.to) {
109
+ updateFoldInfo(cm, state.to, vp.to);
110
+ state.to = vp.to;
111
+ }
112
+ });
113
+ }
114
+ }, 400);
115
+ }
116
+
117
+ function onFold(cm, from) {
118
+ var state = cm.state.foldGutter, line = from.line;
119
+ if (line >= state.from && line < state.to)
120
+ updateFoldInfo(cm, line, line + 1);
121
+ }
122
+ })();
@@ -1,4 +1,4 @@
1
- CodeMirror.indentRangeFinder = function(cm, start) {
1
+ CodeMirror.registerHelper("fold", "indent", function(cm, start) {
2
2
  var tabSize = cm.getOption("tabSize"), firstLine = cm.getLine(start.line);
3
3
  var myIndent = CodeMirror.countColumn(firstLine, null, tabSize);
4
4
  for (var i = start.line + 1, end = cm.lineCount(); i < end; ++i) {
@@ -8,4 +8,5 @@ CodeMirror.indentRangeFinder = function(cm, start) {
8
8
  return {from: CodeMirror.Pos(start.line, firstLine.length),
9
9
  to: CodeMirror.Pos(i, curLine.length)};
10
10
  }
11
- };
11
+ });
12
+ CodeMirror.indentRangeFinder = CodeMirror.fold.indent; // deprecated
@@ -2,14 +2,17 @@
2
2
  "use strict";
3
3
 
4
4
  var Pos = CodeMirror.Pos;
5
+ function cmp(a, b) { return a.line - b.line || a.ch - b.ch; }
5
6
 
6
7
  var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
7
8
  var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
8
9
  var xmlTagStart = new RegExp("<(/?)([" + nameStartChar + "][" + nameChar + "]*)", "g");
9
10
 
10
- function Iter(cm, line, ch) {
11
+ function Iter(cm, line, ch, range) {
11
12
  this.line = line; this.ch = ch;
12
13
  this.cm = cm; this.text = cm.getLine(line);
14
+ this.min = range ? range.from : cm.firstLine();
15
+ this.max = range ? range.to - 1 : cm.lastLine();
13
16
  }
14
17
 
15
18
  function tagAt(iter, ch) {
@@ -18,13 +21,13 @@
18
21
  }
19
22
 
20
23
  function nextLine(iter) {
21
- if (iter.line >= iter.cm.lastLine()) return;
24
+ if (iter.line >= iter.max) return;
22
25
  iter.ch = 0;
23
26
  iter.text = iter.cm.getLine(++iter.line);
24
27
  return true;
25
28
  }
26
29
  function prevLine(iter) {
27
- if (iter.line <= iter.cm.firstLine()) return;
30
+ if (iter.line <= iter.min) return;
28
31
  iter.text = iter.cm.getLine(--iter.line);
29
32
  iter.ch = iter.text.length;
30
33
  return true;
@@ -43,7 +46,7 @@
43
46
  }
44
47
  function toTagStart(iter) {
45
48
  for (;;) {
46
- var lt = iter.text.lastIndexOf("<", iter.ch - 1);
49
+ var lt = iter.ch ? iter.text.lastIndexOf("<", iter.ch - 1) : -1;
47
50
  if (lt == -1) { if (prevLine(iter)) continue; else return; }
48
51
  if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; }
49
52
  xmlTagStart.lastIndex = lt;
@@ -65,7 +68,7 @@
65
68
  }
66
69
  function toPrevTag(iter) {
67
70
  for (;;) {
68
- var gt = iter.text.lastIndexOf(">", iter.ch - 1);
71
+ var gt = iter.ch ? iter.text.lastIndexOf(">", iter.ch - 1) : -1;
69
72
  if (gt == -1) { if (prevLine(iter)) continue; else return; }
70
73
  if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; }
71
74
  var lastSlash = iter.text.lastIndexOf("/", gt);
@@ -121,7 +124,7 @@
121
124
  }
122
125
  }
123
126
 
124
- CodeMirror.tagRangeFinder = function(cm, start) {
127
+ CodeMirror.registerHelper("fold", "xml", function(cm, start) {
125
128
  var iter = new Iter(cm, start.line, 0);
126
129
  for (;;) {
127
130
  var openTag = toNextTag(iter), end;
@@ -132,27 +135,31 @@
132
135
  return close && {from: start, to: close.from};
133
136
  }
134
137
  }
135
- };
138
+ });
139
+ CodeMirror.tagRangeFinder = CodeMirror.fold.xml; // deprecated
136
140
 
137
- CodeMirror.findMatchingTag = function(cm, pos) {
138
- var iter = new Iter(cm, pos.line, pos.ch);
139
- var end = toTagEnd(iter), start = toTagStart(iter);
140
- if (!end || end == "selfClose" || !start) return;
141
+ CodeMirror.findMatchingTag = function(cm, pos, range) {
142
+ var iter = new Iter(cm, pos.line, pos.ch, range);
143
+ if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return;
144
+ var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch);
145
+ var start = end && toTagStart(iter);
146
+ if (!end || end == "selfClose" || !start || cmp(iter, pos) > 0) return;
147
+ var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]};
141
148
 
142
149
  if (start[1]) { // closing tag
143
- return findMatchingOpen(iter, start[2]);
150
+ return {open: findMatchingOpen(iter, start[2]), close: here, at: "close"};
144
151
  } else { // opening tag
145
- toTagEnd(iter);
146
- return findMatchingClose(iter, start[2]);
152
+ iter = new Iter(cm, to.line, to.ch, range);
153
+ return {open: here, close: findMatchingClose(iter, start[2]), at: "open"};
147
154
  }
148
155
  };
149
156
 
150
- CodeMirror.findEnclosingTag = function(cm, pos) {
151
- var iter = new Iter(cm, pos.line, pos.ch);
157
+ CodeMirror.findEnclosingTag = function(cm, pos, range) {
158
+ var iter = new Iter(cm, pos.line, pos.ch, range);
152
159
  for (;;) {
153
160
  var open = findMatchingOpen(iter);
154
161
  if (!open) break;
155
- var forward = new Iter(cm, pos.line, pos.ch);
162
+ var forward = new Iter(cm, pos.line, pos.ch, range);
156
163
  var close = findMatchingClose(forward, open.tag);
157
164
  if (close) return {open: open, close: close};
158
165
  }
@@ -0,0 +1,34 @@
1
+ (function() {
2
+ "use strict";
3
+
4
+ var WORD = /[\w$]+/, RANGE = 500;
5
+
6
+ CodeMirror.registerHelper("hint", "anyword", function(editor, options) {
7
+ var word = options && options.word || WORD;
8
+ var range = options && options.range || RANGE;
9
+ var cur = editor.getCursor(), curLine = editor.getLine(cur.line);
10
+ var start = cur.ch, end = start;
11
+ while (end < curLine.length && word.test(curLine.charAt(end))) ++end;
12
+ while (start && word.test(curLine.charAt(start - 1))) --start;
13
+ var curWord = start != end && curLine.slice(start, end);
14
+
15
+ var list = [], seen = {};
16
+ function scan(dir) {
17
+ var line = cur.line, end = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir;
18
+ for (; line != end; line += dir) {
19
+ var text = editor.getLine(line), m;
20
+ var re = new RegExp(word.source, "g");
21
+ while (m = re.exec(text)) {
22
+ if (line == cur.line && m[0] === curWord) continue;
23
+ if ((!curWord || m[0].indexOf(curWord) == 0) && !seen.hasOwnProperty(m[0])) {
24
+ seen[m[0]] = true;
25
+ list.push(m[0]);
26
+ }
27
+ }
28
+ }
29
+ }
30
+ scan(-1);
31
+ scan(1);
32
+ return {list: list, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)};
33
+ });
34
+ })();