codemirror-rails 3.14 → 3.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ })();