codemirror-rails 2.2.1 → 2.3

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 (81) hide show
  1. data/README.md +8 -0
  2. data/codemirror-rails.gemspec +1 -1
  3. data/lib/codemirror/rails/version.rb +2 -2
  4. data/vendor/assets/javascripts/codemirror.js +842 -422
  5. data/vendor/assets/javascripts/codemirror/keymaps/emacs.js +2 -2
  6. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +722 -32
  7. data/vendor/assets/javascripts/codemirror/modes/clike.js +31 -9
  8. data/vendor/assets/javascripts/codemirror/modes/clojure.js +14 -14
  9. data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +59 -37
  10. data/vendor/assets/javascripts/codemirror/modes/css.js +1 -1
  11. data/vendor/assets/javascripts/codemirror/modes/diff.js +24 -5
  12. data/vendor/assets/javascripts/codemirror/modes/ecl.js +203 -0
  13. data/vendor/assets/javascripts/codemirror/modes/erlang.js +251 -0
  14. data/vendor/assets/javascripts/codemirror/modes/gfm.js +40 -4
  15. data/vendor/assets/javascripts/codemirror/modes/go.js +170 -0
  16. data/vendor/assets/javascripts/codemirror/modes/htmlembedded.js +1 -1
  17. data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +4 -2
  18. data/vendor/assets/javascripts/codemirror/modes/javascript.js +10 -9
  19. data/vendor/assets/javascripts/codemirror/modes/less.js +232 -0
  20. data/vendor/assets/javascripts/codemirror/modes/markdown.js +52 -49
  21. data/vendor/assets/javascripts/codemirror/modes/mysql.js +188 -0
  22. data/vendor/assets/javascripts/codemirror/modes/pascal.js +2 -46
  23. data/vendor/assets/javascripts/codemirror/modes/perl.js +1 -1
  24. data/vendor/assets/javascripts/codemirror/modes/php.js +55 -25
  25. data/vendor/assets/javascripts/codemirror/modes/pig.js +172 -0
  26. data/vendor/assets/javascripts/codemirror/modes/properties.js +63 -0
  27. data/vendor/assets/javascripts/codemirror/modes/python.js +37 -32
  28. data/vendor/assets/javascripts/codemirror/modes/rpm-spec.js +1 -1
  29. data/vendor/assets/javascripts/codemirror/modes/rst.js +1 -1
  30. data/vendor/assets/javascripts/codemirror/modes/ruby.js +14 -14
  31. data/vendor/assets/javascripts/codemirror/modes/rust.js +36 -15
  32. data/vendor/assets/javascripts/codemirror/modes/scheme.js +74 -46
  33. data/vendor/assets/javascripts/codemirror/modes/shell.js +103 -0
  34. data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +16 -16
  35. data/vendor/assets/javascripts/codemirror/modes/smarty.js +148 -0
  36. data/vendor/assets/javascripts/codemirror/modes/stex.js +21 -6
  37. data/vendor/assets/javascripts/codemirror/modes/tiddlywiki.js +55 -45
  38. data/vendor/assets/javascripts/codemirror/modes/tiki.js +316 -0
  39. data/vendor/assets/javascripts/codemirror/modes/vbscript.js +26 -0
  40. data/vendor/assets/javascripts/codemirror/modes/verilog.js +194 -0
  41. data/vendor/assets/javascripts/codemirror/modes/xml.js +89 -16
  42. data/vendor/assets/javascripts/codemirror/modes/xmlpure.js +5 -0
  43. data/vendor/assets/javascripts/codemirror/modes/xquery.js +448 -0
  44. data/vendor/assets/javascripts/codemirror/utils/closetag.js +146 -0
  45. data/vendor/assets/javascripts/codemirror/utils/dialog.js +63 -0
  46. data/vendor/assets/javascripts/codemirror/utils/foldcode.js +196 -0
  47. data/vendor/assets/javascripts/codemirror/utils/formatting.js +297 -0
  48. data/vendor/assets/javascripts/codemirror/utils/javascript-hint.js +134 -0
  49. data/vendor/assets/javascripts/codemirror/utils/loadmode.js +51 -0
  50. data/vendor/assets/javascripts/codemirror/utils/match-highlighter.js +44 -0
  51. data/vendor/assets/javascripts/codemirror/utils/multiplex.js +72 -0
  52. data/vendor/assets/javascripts/codemirror/{overlay.js → utils/overlay.js} +3 -2
  53. data/vendor/assets/javascripts/codemirror/utils/pig-hint.js +123 -0
  54. data/vendor/assets/javascripts/codemirror/utils/runmode.js +49 -0
  55. data/vendor/assets/javascripts/codemirror/utils/search.js +118 -0
  56. data/vendor/assets/javascripts/codemirror/utils/searchcursor.js +117 -0
  57. data/vendor/assets/javascripts/codemirror/utils/simple-hint.js +72 -0
  58. data/vendor/assets/stylesheets/codemirror.css +69 -5
  59. data/vendor/assets/stylesheets/codemirror/modes/tiddlywiki.css +14 -21
  60. data/vendor/assets/stylesheets/codemirror/modes/tiki.css +26 -0
  61. data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +81 -0
  62. data/vendor/assets/stylesheets/codemirror/themes/blackboard.css +25 -0
  63. data/vendor/assets/stylesheets/codemirror/themes/cobalt.css +1 -1
  64. data/vendor/assets/stylesheets/codemirror/themes/eclipse.css +1 -1
  65. data/vendor/assets/stylesheets/codemirror/themes/elegant.css +2 -2
  66. data/vendor/assets/stylesheets/codemirror/themes/erlang-dark.css +21 -0
  67. data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +44 -0
  68. data/vendor/assets/stylesheets/codemirror/themes/monokai.css +1 -1
  69. data/vendor/assets/stylesheets/codemirror/themes/neat.css +3 -3
  70. data/vendor/assets/stylesheets/codemirror/themes/night.css +1 -1
  71. data/vendor/assets/stylesheets/codemirror/themes/rubyblue.css +2 -2
  72. data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +27 -0
  73. data/vendor/assets/stylesheets/codemirror/themes/xq-dark.css +46 -0
  74. data/vendor/assets/stylesheets/codemirror/utils/dialog.css +23 -0
  75. data/vendor/assets/stylesheets/codemirror/utils/simple-hint.css +16 -0
  76. metadata +41 -10
  77. data/vendor/assets/javascripts/codemirror/runmode.js +0 -27
  78. data/vendor/assets/stylesheets/codemirror/modes/clike.css +0 -7
  79. data/vendor/assets/stylesheets/codemirror/modes/markdown.css +0 -10
  80. data/vendor/assets/stylesheets/codemirror/modes/rst.css +0 -75
  81. data/vendor/assets/stylesheets/codemirror/themes/default.css +0 -19
@@ -0,0 +1,251 @@
1
+ // erlang -> CodeMirror tag
2
+ //
3
+ // atom -> atom
4
+ // attribute -> attribute
5
+ // builtin -> builtin
6
+ // comment -> comment
7
+ // error -> error
8
+ // fun -> meta
9
+ // function -> tag
10
+ // guard -> property
11
+ // keyword -> keyword
12
+ // macro -> variable-2
13
+ // number -> number
14
+ // operator -> operator
15
+ // record -> bracket
16
+ // string -> string
17
+ // type -> def
18
+ // variable -> variable
19
+
20
+ CodeMirror.defineMIME("text/x-erlang", "erlang");
21
+
22
+ CodeMirror.defineMode("erlang", function(cmCfg, modeCfg) {
23
+
24
+ var typeWords = [
25
+ "-type", "-spec", "-export_type", "-opaque"];
26
+
27
+ var keywordWords = [
28
+ "after","begin","catch","case","cond","end","fun","if",
29
+ "let","of","query","receive","try","when"];
30
+
31
+ var operatorWords = [
32
+ "and","andalso","band","bnot","bor","bsl","bsr","bxor",
33
+ "div","not","or","orelse","rem","xor"];
34
+
35
+ var operatorSymbols = [
36
+ "+","-","*","/",">",">=","<","=<","=:=","==","=/=","/=","||","<-"];
37
+
38
+ var guardWords = [
39
+ "is_atom","is_binary","is_bitstring","is_boolean","is_float",
40
+ "is_function","is_integer","is_list","is_number","is_pid",
41
+ "is_port","is_record","is_reference","is_tuple",
42
+ "atom","binary","bitstring","boolean","function","integer","list",
43
+ "number","pid","port","record","reference","tuple"];
44
+
45
+ var bifWords = [
46
+ "abs","adler32","adler32_combine","alive","apply","atom_to_binary",
47
+ "atom_to_list","binary_to_atom","binary_to_existing_atom",
48
+ "binary_to_list","binary_to_term","bit_size","bitstring_to_list",
49
+ "byte_size","check_process_code","contact_binary","crc32",
50
+ "crc32_combine","date","decode_packet","delete_module",
51
+ "disconnect_node","element","erase","exit","float","float_to_list",
52
+ "garbage_collect","get","get_keys","group_leader","halt","hd",
53
+ "integer_to_list","internal_bif","iolist_size","iolist_to_binary",
54
+ "is_alive","is_atom","is_binary","is_bitstring","is_boolean",
55
+ "is_float","is_function","is_integer","is_list","is_number","is_pid",
56
+ "is_port","is_process_alive","is_record","is_reference","is_tuple",
57
+ "length","link","list_to_atom","list_to_binary","list_to_bitstring",
58
+ "list_to_existing_atom","list_to_float","list_to_integer",
59
+ "list_to_pid","list_to_tuple","load_module","make_ref","module_loaded",
60
+ "monitor_node","node","node_link","node_unlink","nodes","notalive",
61
+ "now","open_port","pid_to_list","port_close","port_command",
62
+ "port_connect","port_control","pre_loaded","process_flag",
63
+ "process_info","processes","purge_module","put","register",
64
+ "registered","round","self","setelement","size","spawn","spawn_link",
65
+ "spawn_monitor","spawn_opt","split_binary","statistics",
66
+ "term_to_binary","time","throw","tl","trunc","tuple_size",
67
+ "tuple_to_list","unlink","unregister","whereis"];
68
+
69
+ function isMember(element,list) {
70
+ return (-1 < list.indexOf(element));
71
+ }
72
+
73
+ function isPrev(stream,string) {
74
+ var start = stream.start;
75
+ var len = string.length;
76
+ if (len <= start) {
77
+ var word = stream.string.slice(start-len,start);
78
+ return word == string;
79
+ }else{
80
+ return false;
81
+ }
82
+ }
83
+
84
+ var smallRE = /[a-z_]/;
85
+ var largeRE = /[A-Z_]/;
86
+ var digitRE = /[0-9]/;
87
+ var octitRE = /[0-7]/;
88
+ var idRE = /[a-z_A-Z0-9]/;
89
+
90
+ function tokenize(stream, state) {
91
+ if (stream.eatSpace()) {
92
+ return null;
93
+ }
94
+
95
+ // attributes and type specs
96
+ if (stream.sol() && stream.peek() == '-') {
97
+ stream.next();
98
+ if (stream.eat(smallRE) && stream.eatWhile(idRE)) {
99
+ if (stream.peek() == "(") {
100
+ return "attribute";
101
+ }else if (isMember(stream.current(),typeWords)) {
102
+ return "def";
103
+ }else{
104
+ return null;
105
+ }
106
+ }
107
+ stream.backUp(1);
108
+ }
109
+
110
+ var ch = stream.next();
111
+
112
+ // comment
113
+ if (ch == '%') {
114
+ stream.skipToEnd();
115
+ return "comment";
116
+ }
117
+
118
+ // macro
119
+ if (ch == '?') {
120
+ stream.eatWhile(idRE);
121
+ return "variable-2";
122
+ }
123
+
124
+ // record
125
+ if ( ch == "#") {
126
+ stream.eatWhile(idRE);
127
+ return "bracket";
128
+ }
129
+
130
+ // char
131
+ if ( ch == "$") {
132
+ if (stream.next() == "\\") {
133
+ if (!stream.eatWhile(octitRE)) {
134
+ stream.next();
135
+ }
136
+ }
137
+ return "string";
138
+ }
139
+
140
+ // quoted atom
141
+ if (ch == '\'') {
142
+ return singleQuote(stream);
143
+ }
144
+
145
+ // string
146
+ if (ch == '"') {
147
+ return doubleQuote(stream);
148
+ }
149
+
150
+ // variable
151
+ if (largeRE.test(ch)) {
152
+ stream.eatWhile(idRE);
153
+ return "variable";
154
+ }
155
+
156
+ // atom/keyword/BIF/function
157
+ if (smallRE.test(ch)) {
158
+ stream.eatWhile(idRE);
159
+
160
+ if (stream.peek() == "/") {
161
+ stream.next();
162
+ if (stream.eatWhile(digitRE)) {
163
+ return "meta"; // f/0 style fun
164
+ }else{
165
+ stream.backUp(1);
166
+ return "atom";
167
+ }
168
+ }
169
+
170
+ var w = stream.current();
171
+
172
+ if (isMember(w,keywordWords)) {
173
+ return "keyword"; // keyword
174
+ }
175
+ if (stream.peek() == "(") {
176
+ if (isMember(w,bifWords) &&
177
+ (!isPrev(stream,":") || isPrev(stream,"erlang:"))) {
178
+ return "builtin"; // BIF
179
+ }else{
180
+ return "tag"; // function
181
+ }
182
+ }
183
+ if (isMember(w,guardWords)) {
184
+ return "property"; // guard
185
+ }
186
+ if (isMember(w,operatorWords)) {
187
+ return "operator"; // operator
188
+ }
189
+
190
+
191
+ if (stream.peek() == ":") {
192
+ if (w == "erlang") { // f:now() is highlighted incorrectly
193
+ return "builtin";
194
+ } else {
195
+ return "tag"; // function application
196
+ }
197
+ }
198
+
199
+ return "atom";
200
+ }
201
+
202
+ // number
203
+ if (digitRE.test(ch)) {
204
+ stream.eatWhile(digitRE);
205
+ if (stream.eat('#')) {
206
+ stream.eatWhile(digitRE); // 16#10 style integer
207
+ } else {
208
+ if (stream.eat('.')) { // float
209
+ stream.eatWhile(digitRE);
210
+ }
211
+ if (stream.eat(/[eE]/)) {
212
+ stream.eat(/[-+]/); // float with exponent
213
+ stream.eatWhile(digitRE);
214
+ }
215
+ }
216
+ return "number"; // normal integer
217
+ }
218
+
219
+ return null;
220
+ }
221
+
222
+ function doubleQuote(stream) {
223
+ return Quote(stream, '"', '\\', "string");
224
+ }
225
+
226
+ function singleQuote(stream) {
227
+ return Quote(stream,'\'','\\',"atom");
228
+ }
229
+
230
+ function Quote(stream,quoteChar,escapeChar,tag) {
231
+ while (!stream.eol()) {
232
+ var ch = stream.next();
233
+ if (ch == quoteChar) {
234
+ return tag;
235
+ }else if (ch == escapeChar) {
236
+ stream.next();
237
+ }
238
+ }
239
+ return "error";
240
+ }
241
+
242
+ return {
243
+ startState: function() {
244
+ return {};
245
+ },
246
+
247
+ token: function(stream, state) {
248
+ return tokenize(stream, state);
249
+ }
250
+ };
251
+ });
@@ -8,7 +8,7 @@ CodeMirror.defineMode("gfm", function(config, parserConfig) {
8
8
  "c++": "text/x-c++src",
9
9
  java: "text/x-java",
10
10
  csharp: "text/x-csharp",
11
- "c#": "text/x-csharp",
11
+ "c#": "text/x-csharp"
12
12
  };
13
13
 
14
14
  // make this lazy so that we don't need to load GFM last
@@ -69,7 +69,7 @@ CodeMirror.defineMode("gfm", function(config, parserConfig) {
69
69
  function handleText(stream, mdState) {
70
70
  var match;
71
71
  if (stream.match(/^\w+:\/\/\S+/)) {
72
- return 'linkhref';
72
+ return 'link';
73
73
  }
74
74
  if (stream.match(/^[^\[*\\<>` _][^\[*\\<>` ]*[^\[*\\<>` _]/)) {
75
75
  return mdMode.getType(mdState);
@@ -102,7 +102,43 @@ CodeMirror.defineMode("gfm", function(config, parserConfig) {
102
102
  },
103
103
 
104
104
  token: function(stream, state) {
105
- return state.token(stream, state);
105
+ /* Parse GFM double bracket links */
106
+ if ((ch = stream.peek()) != undefined && ch == '[') {
107
+ stream.next(); // Advance the stream
108
+
109
+ /* Only handle double bracket links */
110
+ if ((ch = stream.peek()) == undefined || ch != '[') {
111
+ stream.backUp(1);
112
+ return state.token(stream, state);
113
+ }
114
+
115
+ while ((ch = stream.next()) != undefined && ch != ']') {}
116
+
117
+ if (ch == ']' && (ch = stream.next()) != undefined && ch == ']')
118
+ return 'link';
119
+
120
+ /* If we did not find the second ']' */
121
+ stream.backUp(1);
122
+ }
123
+
124
+ /* Match GFM latex formulas, as well as latex formulas within '$' */
125
+ if (stream.match(/^\$[^\$]+\$/)) {
126
+ return "string";
127
+ }
128
+
129
+ if (stream.match(/^\\\((.*?)\\\)/)) {
130
+ return "string";
131
+ }
132
+
133
+ if (stream.match(/^\$\$[^\$]+\$\$/)) {
134
+ return "string";
135
+ }
136
+
137
+ if (stream.match(/^\\\[(.*?)\\\]/)) {
138
+ return "string";
139
+ }
140
+
141
+ return state.token(stream, state);
106
142
  }
107
143
  }
108
- });
144
+ }, "markdown");
@@ -0,0 +1,170 @@
1
+ CodeMirror.defineMode("go", function(config, parserConfig) {
2
+ var indentUnit = config.indentUnit;
3
+
4
+ var keywords = {
5
+ "break":true, "case":true, "chan":true, "const":true, "continue":true,
6
+ "default":true, "defer":true, "else":true, "fallthrough":true, "for":true,
7
+ "func":true, "go":true, "goto":true, "if":true, "import":true,
8
+ "interface":true, "map":true, "package":true, "range":true, "return":true,
9
+ "select":true, "struct":true, "switch":true, "type":true, "var":true,
10
+ "bool":true, "byte":true, "complex64":true, "complex128":true,
11
+ "float32":true, "float64":true, "int8":true, "int16":true, "int32":true,
12
+ "int64":true, "string":true, "uint8":true, "uint16":true, "uint32":true,
13
+ "uint64":true, "int":true, "uint":true, "uintptr":true
14
+ };
15
+
16
+ var atoms = {
17
+ "true":true, "false":true, "iota":true, "nil":true, "append":true,
18
+ "cap":true, "close":true, "complex":true, "copy":true, "imag":true,
19
+ "len":true, "make":true, "new":true, "panic":true, "print":true,
20
+ "println":true, "real":true, "recover":true
21
+ };
22
+
23
+ var blockKeywords = {
24
+ "else":true, "for":true, "func":true, "if":true, "interface":true,
25
+ "select":true, "struct":true, "switch":true
26
+ };
27
+
28
+ var isOperatorChar = /[+\-*&^%:=<>!|\/]/;
29
+
30
+ var curPunc;
31
+
32
+ function tokenBase(stream, state) {
33
+ var ch = stream.next();
34
+ if (ch == '"' || ch == "'" || ch == "`") {
35
+ state.tokenize = tokenString(ch);
36
+ return state.tokenize(stream, state);
37
+ }
38
+ if (/[\d\.]/.test(ch)) {
39
+ if (ch == ".") {
40
+ stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/);
41
+ } else if (ch == "0") {
42
+ stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/);
43
+ } else {
44
+ stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/);
45
+ }
46
+ return "number";
47
+ }
48
+ if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
49
+ curPunc = ch;
50
+ return null
51
+ }
52
+ if (ch == "/") {
53
+ if (stream.eat("*")) {
54
+ state.tokenize = tokenComment;
55
+ return tokenComment(stream, state);
56
+ }
57
+ if (stream.eat("/")) {
58
+ stream.skipToEnd();
59
+ return "comment";
60
+ }
61
+ }
62
+ if (isOperatorChar.test(ch)) {
63
+ stream.eatWhile(isOperatorChar);
64
+ return "operator";
65
+ }
66
+ stream.eatWhile(/[\w\$_]/);
67
+ var cur = stream.current();
68
+ if (keywords.propertyIsEnumerable(cur)) {
69
+ if (cur == "case" || cur == "default") curPunc = "case";
70
+ return "keyword";
71
+ }
72
+ if (atoms.propertyIsEnumerable(cur)) return "atom";
73
+ return "word";
74
+ }
75
+
76
+ function tokenString(quote) {
77
+ return function(stream, state) {
78
+ var escaped = false, next, end = false;
79
+ while ((next = stream.next()) != null) {
80
+ if (next == quote && !escaped) {end = true; break;}
81
+ escaped = !escaped && next == "\\";
82
+ }
83
+ if (end || !(escaped || quote == "`"))
84
+ state.tokenize = tokenBase;
85
+ return "string";
86
+ };
87
+ }
88
+
89
+ function tokenComment(stream, state) {
90
+ var maybeEnd = false, ch;
91
+ while (ch = stream.next()) {
92
+ if (ch == "/" && maybeEnd) {
93
+ state.tokenize = tokenBase;
94
+ break;
95
+ }
96
+ maybeEnd = (ch == "*");
97
+ }
98
+ return "comment";
99
+ }
100
+
101
+ function Context(indented, column, type, align, prev) {
102
+ this.indented = indented;
103
+ this.column = column;
104
+ this.type = type;
105
+ this.align = align;
106
+ this.prev = prev;
107
+ }
108
+ function pushContext(state, col, type) {
109
+ return state.context = new Context(state.indented, col, type, null, state.context);
110
+ }
111
+ function popContext(state) {
112
+ var t = state.context.type;
113
+ if (t == ")" || t == "]" || t == "}")
114
+ state.indented = state.context.indented;
115
+ return state.context = state.context.prev;
116
+ }
117
+
118
+ // Interface
119
+
120
+ return {
121
+ startState: function(basecolumn) {
122
+ return {
123
+ tokenize: null,
124
+ context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
125
+ indented: 0,
126
+ startOfLine: true
127
+ };
128
+ },
129
+
130
+ token: function(stream, state) {
131
+ var ctx = state.context;
132
+ if (stream.sol()) {
133
+ if (ctx.align == null) ctx.align = false;
134
+ state.indented = stream.indentation();
135
+ state.startOfLine = true;
136
+ if (ctx.type == "case") ctx.type = "}";
137
+ }
138
+ if (stream.eatSpace()) return null;
139
+ curPunc = null;
140
+ var style = (state.tokenize || tokenBase)(stream, state);
141
+ if (style == "comment") return style;
142
+ if (ctx.align == null) ctx.align = true;
143
+
144
+ if (curPunc == "{") pushContext(state, stream.column(), "}");
145
+ else if (curPunc == "[") pushContext(state, stream.column(), "]");
146
+ else if (curPunc == "(") pushContext(state, stream.column(), ")");
147
+ else if (curPunc == "case") ctx.type = "case"
148
+ else if (curPunc == "}" && ctx.type == "}") ctx = popContext(state);
149
+ else if (curPunc == ctx.type) popContext(state);
150
+ state.startOfLine = false;
151
+ return style;
152
+ },
153
+
154
+ indent: function(state, textAfter) {
155
+ if (state.tokenize != tokenBase && state.tokenize != null) return 0;
156
+ var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
157
+ if (ctx.type == "case" && /^(?:case|default)\b/.test(textAfter)) {
158
+ state.context.type = "}";
159
+ return ctx.indented;
160
+ }
161
+ var closing = firstChar == ctx.type;
162
+ if (ctx.align) return ctx.column + (closing ? 0 : 1);
163
+ else return ctx.indented + (closing ? 0 : indentUnit);
164
+ },
165
+
166
+ electricChars: "{}:"
167
+ };
168
+ });
169
+
170
+ CodeMirror.defineMIME("text/x-go", "go");