From dfb497cb797667850f1908bcc57cfe6a2c8c1e39 Mon Sep 17 00:00:00 2001
From: Benedikt Meurer
Date: Mon, 22 Jun 2020 21:08:44 +0200
Subject: [PATCH 001/342] [wast mode] Rename atomic.notify and *.atomic.wait
Refs: WebAssembly/threads#149
---
mode/wast/test.js | 6 +++---
mode/wast/wast.js | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/mode/wast/test.js b/mode/wast/test.js
index a8097768a7..f167087f63 100644
--- a/mode/wast/test.js
+++ b/mode/wast/test.js
@@ -72,9 +72,9 @@
'[keyword f64.store] [keyword offset]=[number 4] [keyword align]=[number 4]');
MT('atomic-memory-instructions',
- '[keyword atomic.notify] [keyword offset]=[number 32] [keyword align]=[number 4]',
- '[keyword i32.atomic.wait] [keyword offset]=[number 32] [keyword align]=[number 4]',
- '[keyword i64.atomic.wait] [keyword offset]=[number 32] [keyword align]=[number 4]',
+ '[keyword memory.atomic.notify] [keyword offset]=[number 32] [keyword align]=[number 4]',
+ '[keyword memory.atomic.wait32] [keyword offset]=[number 32] [keyword align]=[number 4]',
+ '[keyword memory.atomic.wait64] [keyword offset]=[number 32] [keyword align]=[number 4]',
'[keyword i32.atomic.load] [keyword offset]=[number 32] [keyword align]=[number 4]',
'[keyword i32.atomic.load8_u] [keyword offset]=[number 32] [keyword align]=[number 4]',
'[keyword i32.atomic.load16_u] [keyword offset]=[number 32] [keyword align]=[number 4]',
diff --git a/mode/wast/wast.js b/mode/wast/wast.js
index 8c517a4985..a0112a5176 100644
--- a/mode/wast/wast.js
+++ b/mode/wast/wast.js
@@ -14,7 +14,7 @@
CodeMirror.defineSimpleMode('wast', {
start: [
{regex: /[+\-]?(?:nan(?::0x[0-9a-fA-F]+)?|infinity|inf|0x[0-9a-fA-F]+\.?[0-9a-fA-F]*p[+\/-]?\d+|\d+(?:\.\d*)?[eE][+\-]?\d*|\d+\.\d*|0x[0-9a-fA-F]+|\d+)/, token: "number"},
- {regex: /mut|nop|block|if|then|else|loop|br_if|br_table|br|call(_indirect)?|drop|end|return(_call(_indirect)?)?|local\.(get|set|tee)|global\.(get|set)|i(32|64)\.(store(8|16)|(load(8|16)_[su]))|i64\.(load32_[su]|store32)|[fi](32|64)\.(const|load|store)|f(32|64)\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)|i(32|64)\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)|i64\.extend_[su]_i32|i32\.wrap_i64|i(32|64)\.trunc_f(32|64)_[su]|f(32|64)\.convert_i(32|64)_[su]|f64\.promote_f32|f32\.demote_f64|f32\.reinterpret_i32|i32\.reinterpret_f32|f64\.reinterpret_i64|i64\.reinterpret_f64|select|unreachable|current_memory|memory\.(size|grow)|type|func|param|result|local|global|module|table|memory|start|elem|data|align|offset|import|export|atomic\.notify|i64\.atomic\.(load32_u|store32|rmw32\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)|i(32|64)\.atomic\.(wait|load((8|16)_u)?|store(8|16)?|rmw(\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))/, token: "keyword"},
+ {regex: /mut|nop|block|if|then|else|loop|br_if|br_table|br|call(_indirect)?|drop|end|return(_call(_indirect)?)?|local\.(get|set|tee)|global\.(get|set)|i(32|64)\.(store(8|16)|(load(8|16)_[su]))|i64\.(load32_[su]|store32)|[fi](32|64)\.(const|load|store)|f(32|64)\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)|i(32|64)\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)|i64\.extend_[su]_i32|i32\.wrap_i64|i(32|64)\.trunc_f(32|64)_[su]|f(32|64)\.convert_i(32|64)_[su]|f64\.promote_f32|f32\.demote_f64|f32\.reinterpret_i32|i32\.reinterpret_f32|f64\.reinterpret_i64|i64\.reinterpret_f64|select|unreachable|current_memory|memory(\.((atomic\.(notify|wait(32|64)))|grow|size))?|type|func|param|result|local|global|module|table|start|elem|data|align|offset|import|export|i64\.atomic\.(load32_u|store32|rmw32\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)|i(32|64)\.atomic\.(load((8|16)_u)?|store(8|16)?|rmw(\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))/, token: "keyword"},
{regex: /\b(anyfunc|[fi](32|64))\b/, token: "atom"},
{regex: /\$([a-zA-Z0-9_`\+\-\*\/\\\^~=<>!\?@#$%&|:\.]+)/, token: "variable-2"},
{regex: /"(?:[^"\\\x00-\x1f\x7f]|\\[nt\\'"]|\\[0-9a-fA-F][0-9a-fA-F])*"/, token: "string"},
From c0120793f1e9986b631411b6112e207866d3db81 Mon Sep 17 00:00:00 2001
From: Ng Zhi An
Date: Fri, 26 Jun 2020 11:57:14 -0700
Subject: [PATCH 002/342] [wast mode] Support some Wasm SIMD instructions
These keywords can be found at
https://github.com/WebAssembly/simd/blob/master/proposals/simd/BinarySIMD.md.
---
mode/wast/test.js | 55 +++++++++++++++++++++++++++++++++++++++++++++++
mode/wast/wast.js | 2 +-
2 files changed, 56 insertions(+), 1 deletion(-)
diff --git a/mode/wast/test.js b/mode/wast/test.js
index f167087f63..b6ee52a60e 100644
--- a/mode/wast/test.js
+++ b/mode/wast/test.js
@@ -138,4 +138,59 @@
'[keyword i64.atomic.rmw8.cmpxchg_u] [keyword offset]=[number 32] [keyword align]=[number 4]',
'[keyword i64.atomic.rmw16.cmpxchg_u] [keyword offset]=[number 32] [keyword align]=[number 4]',
'[keyword i64.atomic.rmw32.cmpxchg_u] [keyword offset]=[number 32] [keyword align]=[number 4]');
+
+ MT('simd-instructions',
+ '[keyword v128.load] [keyword offset]=[number 32] [keyword align]=[number 4]',
+ '[keyword v128.store] [keyword offset]=[number 32] [keyword align]=[number 4]',
+ '[keyword v128.const] [number 0] [number 1] [number 2] [number 3] [number 4] [number 5] [number 6] [number 7] [number 8] [number 9] [number 10] [number 11] [number 12] [number 13] [number 14] [number 15]',
+ '[keyword i8x16.splat]',
+ '[keyword i16x8.splat]',
+ '[keyword i32x4.splat]',
+ '[keyword i64x2.splat]',
+ '[keyword f32x4.splat]',
+ '[keyword f64x2.splat]',
+ '[keyword i8x16.extract_lane_s] [number 1]',
+ '[keyword i8x16.extract_lane_u] [number 1]',
+ '[keyword i8x16.replace_lane] [number 1]',
+ '[keyword i16x8.extract_lane_s] [number 1]',
+ '[keyword i16x8.extract_lane_u] [number 1]',
+ '[keyword i16x8.replace_lane] [number 1]',
+ '[keyword i32x4.extract_lane] [number 1]',
+ '[keyword i32x4.replace_lane] [number 1]',
+ '[keyword i64x2.extract_lane] [number 1]',
+ '[keyword i64x2.replace_lane] [number 1]',
+ '[keyword f32x4.extract_lane] [number 1]',
+ '[keyword f32x4.replace_lane] [number 1]',
+ '[keyword f64x2.extract_lane] [number 1]',
+ '[keyword f64x2.replace_lane] [number 1]',
+ '[keyword v128.not]',
+ '[keyword v128.andnot]',
+ '[keyword v128.and]',
+ '[keyword v128.or]',
+ '[keyword v128.xor]',
+ '[keyword v128.bitselect]',
+ '[keyword i8x16.neg]',
+ '[keyword i8x16.shl]',
+ '[keyword i8x16.shr_s]',
+ '[keyword i8x16.shr_u]',
+ '[keyword i8x16.add]',
+ '[keyword i8x16.sub]',
+ '[keyword i16x8.add]',
+ '[keyword i16x8.neg]',
+ '[keyword i16x8.shl]',
+ '[keyword i16x8.shr_s]',
+ '[keyword i16x8.shr_u]',
+ '[keyword i16x8.sub]',
+ '[keyword i32x4.add]',
+ '[keyword i32x4.neg]',
+ '[keyword i32x4.shl]',
+ '[keyword i32x4.shr_s]',
+ '[keyword i32x4.shr_u]',
+ '[keyword i32x4.sub]',
+ '[keyword i64x2.add]',
+ '[keyword i64x2.neg]',
+ '[keyword i64x2.shl]',
+ '[keyword i64x2.shr_s]',
+ '[keyword i64x2.shr_u]',
+ '[keyword i64x2.sub]');
})();
diff --git a/mode/wast/wast.js b/mode/wast/wast.js
index a0112a5176..7d3d111f5f 100644
--- a/mode/wast/wast.js
+++ b/mode/wast/wast.js
@@ -14,7 +14,7 @@
CodeMirror.defineSimpleMode('wast', {
start: [
{regex: /[+\-]?(?:nan(?::0x[0-9a-fA-F]+)?|infinity|inf|0x[0-9a-fA-F]+\.?[0-9a-fA-F]*p[+\/-]?\d+|\d+(?:\.\d*)?[eE][+\-]?\d*|\d+\.\d*|0x[0-9a-fA-F]+|\d+)/, token: "number"},
- {regex: /mut|nop|block|if|then|else|loop|br_if|br_table|br|call(_indirect)?|drop|end|return(_call(_indirect)?)?|local\.(get|set|tee)|global\.(get|set)|i(32|64)\.(store(8|16)|(load(8|16)_[su]))|i64\.(load32_[su]|store32)|[fi](32|64)\.(const|load|store)|f(32|64)\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)|i(32|64)\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)|i64\.extend_[su]_i32|i32\.wrap_i64|i(32|64)\.trunc_f(32|64)_[su]|f(32|64)\.convert_i(32|64)_[su]|f64\.promote_f32|f32\.demote_f64|f32\.reinterpret_i32|i32\.reinterpret_f32|f64\.reinterpret_i64|i64\.reinterpret_f64|select|unreachable|current_memory|memory(\.((atomic\.(notify|wait(32|64)))|grow|size))?|type|func|param|result|local|global|module|table|start|elem|data|align|offset|import|export|i64\.atomic\.(load32_u|store32|rmw32\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)|i(32|64)\.atomic\.(load((8|16)_u)?|store(8|16)?|rmw(\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))/, token: "keyword"},
+ {regex: /mut|nop|block|if|then|else|loop|br_if|br_table|br|call(_indirect)?|drop|end|return(_call(_indirect)?)?|local\.(get|set|tee)|global\.(get|set)|i(32|64)\.(store(8|16)|(load(8|16)_[su]))|i64\.(load32_[su]|store32)|[fi](32|64)\.(const|load|store)|f(32|64)\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)|i(32|64)\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)|i64\.extend_[su]_i32|i32\.wrap_i64|i(32|64)\.trunc_f(32|64)_[su]|f(32|64)\.convert_i(32|64)_[su]|f64\.promote_f32|f32\.demote_f64|f32\.reinterpret_i32|i32\.reinterpret_f32|f64\.reinterpret_i64|i64\.reinterpret_f64|select|unreachable|current_memory|memory(\.((atomic\.(notify|wait(32|64)))|grow|size))?|type|func|param|result|local|global|module|table|start|elem|data|align|offset|import|export|i64\.atomic\.(load32_u|store32|rmw32\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)|i(32|64)\.atomic\.(load((8|16)_u)?|store(8|16)?|rmw(\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))|v128\.(load|store|const|not|andnot|and|or|xor|bitselect)|i(8x16|16x8|32x4|64x2)\.(shl|shr_[su])|(i(8x16|16x8|32x4|64x2)|f(32x4|64x2))\.(splat|replace_lane|neg|add|sub)|i(8x16|16x8)\.extract_lane_[su]|[fi](32x4|64x2)\.extract_lane/, token: "keyword"},
{regex: /\b(anyfunc|[fi](32|64))\b/, token: "atom"},
{regex: /\$([a-zA-Z0-9_`\+\-\*\/\\\^~=<>!\?@#$%&|:\.]+)/, token: "variable-2"},
{regex: /"(?:[^"\\\x00-\x1f\x7f]|\\[nt\\'"]|\\[0-9a-fA-F][0-9a-fA-F])*"/, token: "string"},
From 4a36584eacad26521adddc468cd0f741cf2d0aa2 Mon Sep 17 00:00:00 2001
From: Ng Zhi An
Date: Fri, 26 Jun 2020 14:07:27 -0700
Subject: [PATCH 003/342] [wast mode] Add more SIMD instructions
This adds all comparison (eq, ne, lt, gt, le, ge), and v8x16.shuffle and
v8x16.swizzle.
Full list of instructions found at:
https://github.com/WebAssembly/simd/blob/master/proposals/simd/BinarySIMD.md
The ordering in the test file follows this the ordering in the binary
form. The regex ordering is more arbitrary due to grouping.
---
mode/wast/test.js | 44 ++++++++++++++++++++++++++++++++++++++++++++
mode/wast/wast.js | 2 +-
2 files changed, 45 insertions(+), 1 deletion(-)
diff --git a/mode/wast/test.js b/mode/wast/test.js
index b6ee52a60e..1812b115ec 100644
--- a/mode/wast/test.js
+++ b/mode/wast/test.js
@@ -143,6 +143,8 @@
'[keyword v128.load] [keyword offset]=[number 32] [keyword align]=[number 4]',
'[keyword v128.store] [keyword offset]=[number 32] [keyword align]=[number 4]',
'[keyword v128.const] [number 0] [number 1] [number 2] [number 3] [number 4] [number 5] [number 6] [number 7] [number 8] [number 9] [number 10] [number 11] [number 12] [number 13] [number 14] [number 15]',
+ '[keyword v8x16.shuffle] [number 0] [number 1] [number 2] [number 3] [number 4] [number 5] [number 6] [number 7] [number 8] [number 9] [number 10] [number 11] [number 12] [number 13] [number 14] [number 15]',
+ '[keyword v8x16.swizzle]',
'[keyword i8x16.splat]',
'[keyword i16x8.splat]',
'[keyword i32x4.splat]',
@@ -163,6 +165,48 @@
'[keyword f32x4.replace_lane] [number 1]',
'[keyword f64x2.extract_lane] [number 1]',
'[keyword f64x2.replace_lane] [number 1]',
+ '[keyword i8x16.eq]',
+ '[keyword i8x16.ne]',
+ '[keyword i8x16.lt_s]',
+ '[keyword i8x16.lt_u]',
+ '[keyword i8x16.gt_s]',
+ '[keyword i8x16.gt_u]',
+ '[keyword i8x16.le_s]',
+ '[keyword i8x16.le_u]',
+ '[keyword i8x16.ge_s]',
+ '[keyword i8x16.ge_u]',
+ '[keyword i16x8.eq]',
+ '[keyword i16x8.ne]',
+ '[keyword i16x8.lt_s]',
+ '[keyword i16x8.lt_u]',
+ '[keyword i16x8.gt_s]',
+ '[keyword i16x8.gt_u]',
+ '[keyword i16x8.le_s]',
+ '[keyword i16x8.le_u]',
+ '[keyword i16x8.ge_s]',
+ '[keyword i16x8.ge_u]',
+ '[keyword i32x4.eq]',
+ '[keyword i32x4.ne]',
+ '[keyword i32x4.lt_s]',
+ '[keyword i32x4.lt_u]',
+ '[keyword i32x4.gt_s]',
+ '[keyword i32x4.gt_u]',
+ '[keyword i32x4.le_s]',
+ '[keyword i32x4.le_u]',
+ '[keyword i32x4.ge_s]',
+ '[keyword i32x4.ge_u]',
+ '[keyword f32x4.eq]',
+ '[keyword f32x4.ne]',
+ '[keyword f32x4.lt]',
+ '[keyword f32x4.gt]',
+ '[keyword f32x4.le]',
+ '[keyword f32x4.ge]',
+ '[keyword f64x2.eq]',
+ '[keyword f64x2.ne]',
+ '[keyword f64x2.lt]',
+ '[keyword f64x2.gt]',
+ '[keyword f64x2.le]',
+ '[keyword f64x2.ge]',
'[keyword v128.not]',
'[keyword v128.andnot]',
'[keyword v128.and]',
diff --git a/mode/wast/wast.js b/mode/wast/wast.js
index 7d3d111f5f..90bf57fc46 100644
--- a/mode/wast/wast.js
+++ b/mode/wast/wast.js
@@ -14,7 +14,7 @@
CodeMirror.defineSimpleMode('wast', {
start: [
{regex: /[+\-]?(?:nan(?::0x[0-9a-fA-F]+)?|infinity|inf|0x[0-9a-fA-F]+\.?[0-9a-fA-F]*p[+\/-]?\d+|\d+(?:\.\d*)?[eE][+\-]?\d*|\d+\.\d*|0x[0-9a-fA-F]+|\d+)/, token: "number"},
- {regex: /mut|nop|block|if|then|else|loop|br_if|br_table|br|call(_indirect)?|drop|end|return(_call(_indirect)?)?|local\.(get|set|tee)|global\.(get|set)|i(32|64)\.(store(8|16)|(load(8|16)_[su]))|i64\.(load32_[su]|store32)|[fi](32|64)\.(const|load|store)|f(32|64)\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)|i(32|64)\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)|i64\.extend_[su]_i32|i32\.wrap_i64|i(32|64)\.trunc_f(32|64)_[su]|f(32|64)\.convert_i(32|64)_[su]|f64\.promote_f32|f32\.demote_f64|f32\.reinterpret_i32|i32\.reinterpret_f32|f64\.reinterpret_i64|i64\.reinterpret_f64|select|unreachable|current_memory|memory(\.((atomic\.(notify|wait(32|64)))|grow|size))?|type|func|param|result|local|global|module|table|start|elem|data|align|offset|import|export|i64\.atomic\.(load32_u|store32|rmw32\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)|i(32|64)\.atomic\.(load((8|16)_u)?|store(8|16)?|rmw(\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))|v128\.(load|store|const|not|andnot|and|or|xor|bitselect)|i(8x16|16x8|32x4|64x2)\.(shl|shr_[su])|(i(8x16|16x8|32x4|64x2)|f(32x4|64x2))\.(splat|replace_lane|neg|add|sub)|i(8x16|16x8)\.extract_lane_[su]|[fi](32x4|64x2)\.extract_lane/, token: "keyword"},
+ {regex: /mut|nop|block|if|then|else|loop|br_if|br_table|br|call(_indirect)?|drop|end|return(_call(_indirect)?)?|local\.(get|set|tee)|global\.(get|set)|i(32|64)\.(store(8|16)|(load(8|16)_[su]))|i64\.(load32_[su]|store32)|[fi](32|64)\.(const|load|store)|f(32|64)\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)|i(32|64)\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)|i64\.extend_[su]_i32|i32\.wrap_i64|i(32|64)\.trunc_f(32|64)_[su]|f(32|64)\.convert_i(32|64)_[su]|f64\.promote_f32|f32\.demote_f64|f32\.reinterpret_i32|i32\.reinterpret_f32|f64\.reinterpret_i64|i64\.reinterpret_f64|select|unreachable|current_memory|memory(\.((atomic\.(notify|wait(32|64)))|grow|size))?|type|func|param|result|local|global|module|table|start|elem|data|align|offset|import|export|i64\.atomic\.(load32_u|store32|rmw32\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)|i(32|64)\.atomic\.(load((8|16)_u)?|store(8|16)?|rmw(\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))|v128\.(load|store|const|not|andnot|and|or|xor|bitselect)|i(8x16|16x8|32x4|64x2)\.(shl|shr_[su])|(i(8x16|16x8|32x4|64x2)|f(32x4|64x2))\.(splat|replace_lane|neg|add|sub)|i(8x16|16x8)\.extract_lane_[su]|i(8x16|16x8|32x4)\.(eq|ne|([lg][te]_[su]))|f(32x4|64x2)\.(eq|ne|[lg][te])|[fi](32x4|64x2)\.extract_lane|v8x16\.(shuffle|swizzle)/, token: "keyword"},
{regex: /\b(anyfunc|[fi](32|64))\b/, token: "atom"},
{regex: /\$([a-zA-Z0-9_`\+\-\*\/\\\^~=<>!\?@#$%&|:\.]+)/, token: "variable-2"},
{regex: /"(?:[^"\\\x00-\x1f\x7f]|\\[nt\\'"]|\\[0-9a-fA-F][0-9a-fA-F])*"/, token: "string"},
From cab432b243cd0c505bf384ee93b8350de778aa75 Mon Sep 17 00:00:00 2001
From: Ng Zhi An
Date: Fri, 26 Jun 2020 15:00:42 -0700
Subject: [PATCH 004/342] [wast mode] Add more SIMD instructions
Some arithmetic instructions, had to shuffle the regex a bit so that we
will attempt to match i8x16.add_saturate_s first before i8x16.add.
Full list available at:
https://github.com/WebAssembly/simd/blob/master/proposals/simd/BinarySIMD.md
---
mode/wast/test.js | 40 +++++++++++++++++++++++++++++++++++++++-
mode/wast/wast.js | 2 +-
2 files changed, 40 insertions(+), 2 deletions(-)
diff --git a/mode/wast/test.js b/mode/wast/test.js
index 1812b115ec..5cc12e29c2 100644
--- a/mode/wast/test.js
+++ b/mode/wast/test.js
@@ -201,36 +201,74 @@
'[keyword f32x4.gt]',
'[keyword f32x4.le]',
'[keyword f32x4.ge]',
+ '[keyword f32x4.abs]',
+ '[keyword f32x4.neg]',
'[keyword f64x2.eq]',
'[keyword f64x2.ne]',
'[keyword f64x2.lt]',
'[keyword f64x2.gt]',
'[keyword f64x2.le]',
'[keyword f64x2.ge]',
+ '[keyword f64x2.abs]',
+ '[keyword f64x2.neg]',
'[keyword v128.not]',
'[keyword v128.andnot]',
'[keyword v128.and]',
'[keyword v128.or]',
'[keyword v128.xor]',
'[keyword v128.bitselect]',
+ '[keyword i8x16.abs]',
'[keyword i8x16.neg]',
+ '[keyword i8x16.any_true]',
+ '[keyword i8x16.all_true]',
+ '[keyword i8x16.bitmask]',
'[keyword i8x16.shl]',
'[keyword i8x16.shr_s]',
'[keyword i8x16.shr_u]',
'[keyword i8x16.add]',
+ '[keyword i8x16.add_saturate_s]',
+ '[keyword i8x16.add_saturate_u]',
'[keyword i8x16.sub]',
- '[keyword i16x8.add]',
+ '[keyword i8x16.sub_saturate_s]',
+ '[keyword i8x16.sub_saturate_u]',
+ '[keyword i8x16.min_s]',
+ '[keyword i8x16.min_u]',
+ '[keyword i8x16.max_s]',
+ '[keyword i8x16.max_u]',
+ '[keyword i8x16.avgr_u]',
+ '[keyword i16x8.abs]',
'[keyword i16x8.neg]',
+ '[keyword i16x8.any_true]',
+ '[keyword i16x8.all_true]',
+ '[keyword i16x8.bitmask]',
'[keyword i16x8.shl]',
'[keyword i16x8.shr_s]',
'[keyword i16x8.shr_u]',
+ '[keyword i16x8.add]',
+ '[keyword i16x8.add_saturate_s]',
+ '[keyword i16x8.add_saturate_u]',
'[keyword i16x8.sub]',
+ '[keyword i16x8.sub_saturate_s]',
+ '[keyword i16x8.sub_saturate_u]',
+ '[keyword i16x8.min_s]',
+ '[keyword i16x8.min_u]',
+ '[keyword i16x8.max_s]',
+ '[keyword i16x8.max_u]',
+ '[keyword i16x8.avgr_u]',
'[keyword i32x4.add]',
+ '[keyword i32x4.abs]',
'[keyword i32x4.neg]',
+ '[keyword i32x4.any_true]',
+ '[keyword i32x4.all_true]',
+ '[keyword i32x4.bitmask]',
'[keyword i32x4.shl]',
'[keyword i32x4.shr_s]',
'[keyword i32x4.shr_u]',
'[keyword i32x4.sub]',
+ '[keyword i32x4.min_s]',
+ '[keyword i32x4.min_u]',
+ '[keyword i32x4.max_s]',
+ '[keyword i32x4.max_u]',
'[keyword i64x2.add]',
'[keyword i64x2.neg]',
'[keyword i64x2.shl]',
diff --git a/mode/wast/wast.js b/mode/wast/wast.js
index 90bf57fc46..15b384d6f8 100644
--- a/mode/wast/wast.js
+++ b/mode/wast/wast.js
@@ -14,7 +14,7 @@
CodeMirror.defineSimpleMode('wast', {
start: [
{regex: /[+\-]?(?:nan(?::0x[0-9a-fA-F]+)?|infinity|inf|0x[0-9a-fA-F]+\.?[0-9a-fA-F]*p[+\/-]?\d+|\d+(?:\.\d*)?[eE][+\-]?\d*|\d+\.\d*|0x[0-9a-fA-F]+|\d+)/, token: "number"},
- {regex: /mut|nop|block|if|then|else|loop|br_if|br_table|br|call(_indirect)?|drop|end|return(_call(_indirect)?)?|local\.(get|set|tee)|global\.(get|set)|i(32|64)\.(store(8|16)|(load(8|16)_[su]))|i64\.(load32_[su]|store32)|[fi](32|64)\.(const|load|store)|f(32|64)\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)|i(32|64)\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)|i64\.extend_[su]_i32|i32\.wrap_i64|i(32|64)\.trunc_f(32|64)_[su]|f(32|64)\.convert_i(32|64)_[su]|f64\.promote_f32|f32\.demote_f64|f32\.reinterpret_i32|i32\.reinterpret_f32|f64\.reinterpret_i64|i64\.reinterpret_f64|select|unreachable|current_memory|memory(\.((atomic\.(notify|wait(32|64)))|grow|size))?|type|func|param|result|local|global|module|table|start|elem|data|align|offset|import|export|i64\.atomic\.(load32_u|store32|rmw32\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)|i(32|64)\.atomic\.(load((8|16)_u)?|store(8|16)?|rmw(\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))|v128\.(load|store|const|not|andnot|and|or|xor|bitselect)|i(8x16|16x8|32x4|64x2)\.(shl|shr_[su])|(i(8x16|16x8|32x4|64x2)|f(32x4|64x2))\.(splat|replace_lane|neg|add|sub)|i(8x16|16x8)\.extract_lane_[su]|i(8x16|16x8|32x4)\.(eq|ne|([lg][te]_[su]))|f(32x4|64x2)\.(eq|ne|[lg][te])|[fi](32x4|64x2)\.extract_lane|v8x16\.(shuffle|swizzle)/, token: "keyword"},
+ {regex: /mut|nop|block|if|then|else|loop|br_if|br_table|br|call(_indirect)?|drop|end|return(_call(_indirect)?)?|local\.(get|set|tee)|global\.(get|set)|i(32|64)\.(store(8|16)|(load(8|16)_[su]))|i64\.(load32_[su]|store32)|[fi](32|64)\.(const|load|store)|f(32|64)\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)|i(32|64)\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)|i64\.extend_[su]_i32|i32\.wrap_i64|i(32|64)\.trunc_f(32|64)_[su]|f(32|64)\.convert_i(32|64)_[su]|f64\.promote_f32|f32\.demote_f64|f32\.reinterpret_i32|i32\.reinterpret_f32|f64\.reinterpret_i64|i64\.reinterpret_f64|select|unreachable|current_memory|memory(\.((atomic\.(notify|wait(32|64)))|grow|size))?|type|func|param|result|local|global|module|table|start|elem|data|align|offset|import|export|i64\.atomic\.(load32_u|store32|rmw32\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)|i(32|64)\.atomic\.(load((8|16)_u)?|store(8|16)?|rmw(\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))|v128\.(load|store|const|not|andnot|and|or|xor|bitselect)|i(8x16|16x8|32x4|64x2)\.(shl|shr_[su])|i(8x16|16x8)\.(extract_lane_[su]|((add|sub)_saturate_[su])|avgr_u)|(i(8x16|16x8|32x4|64x2)|f(32x4|64x2))\.(splat|replace_lane|neg|add|sub)|i(8x16|16x8|32x4)\.(eq|ne|([lg][te]_[su])|abs|any_true|all_true|bitmask|((min|max)_[su]))|f(32x4|64x2)\.(eq|ne|[lg][te]|abs)|[fi](32x4|64x2)\.extract_lane|v8x16\.(shuffle|swizzle)/, token: "keyword"},
{regex: /\b(anyfunc|[fi](32|64))\b/, token: "atom"},
{regex: /\$([a-zA-Z0-9_`\+\-\*\/\\\^~=<>!\?@#$%&|:\.]+)/, token: "variable-2"},
{regex: /"(?:[^"\\\x00-\x1f\x7f]|\\[nt\\'"]|\\[0-9a-fA-F][0-9a-fA-F])*"/, token: "string"},
From ae507dc0c4c39ebed999cde806889fac1ded2076 Mon Sep 17 00:00:00 2001
From: Ng Zhi An
Date: Fri, 26 Jun 2020 15:07:25 -0700
Subject: [PATCH 005/342] [wast mode] More SIMD instructions
f32x4 and f64x2 arithmetic instructions.
Sorted test cases to match the order in
https://github.com/WebAssembly/simd/blob/master/proposals/simd/BinarySIMD.md
to make it easier to spot missing instructions.
---
mode/wast/test.js | 24 +++++++++++++++++++-----
mode/wast/wast.js | 2 +-
2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/mode/wast/test.js b/mode/wast/test.js
index 5cc12e29c2..ca6de4640c 100644
--- a/mode/wast/test.js
+++ b/mode/wast/test.js
@@ -201,16 +201,12 @@
'[keyword f32x4.gt]',
'[keyword f32x4.le]',
'[keyword f32x4.ge]',
- '[keyword f32x4.abs]',
- '[keyword f32x4.neg]',
'[keyword f64x2.eq]',
'[keyword f64x2.ne]',
'[keyword f64x2.lt]',
'[keyword f64x2.gt]',
'[keyword f64x2.le]',
'[keyword f64x2.ge]',
- '[keyword f64x2.abs]',
- '[keyword f64x2.neg]',
'[keyword v128.not]',
'[keyword v128.andnot]',
'[keyword v128.and]',
@@ -274,5 +270,23 @@
'[keyword i64x2.shl]',
'[keyword i64x2.shr_s]',
'[keyword i64x2.shr_u]',
- '[keyword i64x2.sub]');
+ '[keyword i64x2.sub]',
+ '[keyword f32x4.abs]',
+ '[keyword f32x4.neg]',
+ '[keyword f32x4.sqrt]',
+ '[keyword f32x4.add]',
+ '[keyword f32x4.sub]',
+ '[keyword f32x4.mul]',
+ '[keyword f32x4.div]',
+ '[keyword f32x4.min]',
+ '[keyword f32x4.max]',
+ '[keyword f64x2.abs]',
+ '[keyword f64x2.neg]',
+ '[keyword f64x2.sqrt]',
+ '[keyword f64x2.add]',
+ '[keyword f64x2.sub]',
+ '[keyword f64x2.mul]',
+ '[keyword f64x2.div]',
+ '[keyword f64x2.min]',
+ '[keyword f64x2.max]');
})();
diff --git a/mode/wast/wast.js b/mode/wast/wast.js
index 15b384d6f8..4b1c910e63 100644
--- a/mode/wast/wast.js
+++ b/mode/wast/wast.js
@@ -14,7 +14,7 @@
CodeMirror.defineSimpleMode('wast', {
start: [
{regex: /[+\-]?(?:nan(?::0x[0-9a-fA-F]+)?|infinity|inf|0x[0-9a-fA-F]+\.?[0-9a-fA-F]*p[+\/-]?\d+|\d+(?:\.\d*)?[eE][+\-]?\d*|\d+\.\d*|0x[0-9a-fA-F]+|\d+)/, token: "number"},
- {regex: /mut|nop|block|if|then|else|loop|br_if|br_table|br|call(_indirect)?|drop|end|return(_call(_indirect)?)?|local\.(get|set|tee)|global\.(get|set)|i(32|64)\.(store(8|16)|(load(8|16)_[su]))|i64\.(load32_[su]|store32)|[fi](32|64)\.(const|load|store)|f(32|64)\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)|i(32|64)\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)|i64\.extend_[su]_i32|i32\.wrap_i64|i(32|64)\.trunc_f(32|64)_[su]|f(32|64)\.convert_i(32|64)_[su]|f64\.promote_f32|f32\.demote_f64|f32\.reinterpret_i32|i32\.reinterpret_f32|f64\.reinterpret_i64|i64\.reinterpret_f64|select|unreachable|current_memory|memory(\.((atomic\.(notify|wait(32|64)))|grow|size))?|type|func|param|result|local|global|module|table|start|elem|data|align|offset|import|export|i64\.atomic\.(load32_u|store32|rmw32\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)|i(32|64)\.atomic\.(load((8|16)_u)?|store(8|16)?|rmw(\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))|v128\.(load|store|const|not|andnot|and|or|xor|bitselect)|i(8x16|16x8|32x4|64x2)\.(shl|shr_[su])|i(8x16|16x8)\.(extract_lane_[su]|((add|sub)_saturate_[su])|avgr_u)|(i(8x16|16x8|32x4|64x2)|f(32x4|64x2))\.(splat|replace_lane|neg|add|sub)|i(8x16|16x8|32x4)\.(eq|ne|([lg][te]_[su])|abs|any_true|all_true|bitmask|((min|max)_[su]))|f(32x4|64x2)\.(eq|ne|[lg][te]|abs)|[fi](32x4|64x2)\.extract_lane|v8x16\.(shuffle|swizzle)/, token: "keyword"},
+ {regex: /mut|nop|block|if|then|else|loop|br_if|br_table|br|call(_indirect)?|drop|end|return(_call(_indirect)?)?|local\.(get|set|tee)|global\.(get|set)|i(32|64)\.(store(8|16)|(load(8|16)_[su]))|i64\.(load32_[su]|store32)|[fi](32|64)\.(const|load|store)|f(32|64)\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)|i(32|64)\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)|i64\.extend_[su]_i32|i32\.wrap_i64|i(32|64)\.trunc_f(32|64)_[su]|f(32|64)\.convert_i(32|64)_[su]|f64\.promote_f32|f32\.demote_f64|f32\.reinterpret_i32|i32\.reinterpret_f32|f64\.reinterpret_i64|i64\.reinterpret_f64|select|unreachable|current_memory|memory(\.((atomic\.(notify|wait(32|64)))|grow|size))?|type|func|param|result|local|global|module|table|start|elem|data|align|offset|import|export|i64\.atomic\.(load32_u|store32|rmw32\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)|i(32|64)\.atomic\.(load((8|16)_u)?|store(8|16)?|rmw(\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))|v128\.(load|store|const|not|andnot|and|or|xor|bitselect)|i(8x16|16x8|32x4|64x2)\.(shl|shr_[su])|i(8x16|16x8)\.(extract_lane_[su]|((add|sub)_saturate_[su])|avgr_u)|(i(8x16|16x8|32x4|64x2)|f(32x4|64x2))\.(splat|replace_lane|neg|add|sub)|i(8x16|16x8|32x4)\.(eq|ne|([lg][te]_[su])|abs|any_true|all_true|bitmask|((min|max)_[su]))|f(32x4|64x2)\.(eq|ne|[lg][te]|abs|sqrt|mul|div|min|max)|[fi](32x4|64x2)\.extract_lane|v8x16\.(shuffle|swizzle)/, token: "keyword"},
{regex: /\b(anyfunc|[fi](32|64))\b/, token: "atom"},
{regex: /\$([a-zA-Z0-9_`\+\-\*\/\\\^~=<>!\?@#$%&|:\.]+)/, token: "variable-2"},
{regex: /"(?:[^"\\\x00-\x1f\x7f]|\\[nt\\'"]|\\[0-9a-fA-F][0-9a-fA-F])*"/, token: "string"},
From c8ef5e8e9a52e94e6199021155b9097ab57803c6 Mon Sep 17 00:00:00 2001
From: Ng Zhi An
Date: Fri, 26 Jun 2020 15:30:19 -0700
Subject: [PATCH 006/342] [wast mode] Complete SIMD instructions
This finished the set of SIMD instructions 178 of them in total, also
sorted tests by their ordering in
https://github.com/WebAssembly/simd/blob/master/proposals/simd/BinarySIMD.md.
---
mode/wast/test.js | 37 +++++++++++++++++++++++++++++++++----
mode/wast/wast.js | 2 +-
2 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/mode/wast/test.js b/mode/wast/test.js
index ca6de4640c..9998cfd965 100644
--- a/mode/wast/test.js
+++ b/mode/wast/test.js
@@ -141,6 +141,16 @@
MT('simd-instructions',
'[keyword v128.load] [keyword offset]=[number 32] [keyword align]=[number 4]',
+ '[keyword i16x8.load8x8_s] [keyword offset]=[number 64] [keyword align]=[number 0]',
+ '[keyword i16x8.load8x8_u] [keyword offset]=[number 64] [keyword align]=[number 0]',
+ '[keyword i32x4.load16x4_s] [keyword offset]=[number 64] [keyword align]=[number 0]',
+ '[keyword i32x4.load16x4_u] [keyword offset]=[number 64] [keyword align]=[number 0]',
+ '[keyword i64x2.load32x2_s] [keyword offset]=[number 64] [keyword align]=[number 0]',
+ '[keyword i64x2.load32x2_u] [keyword offset]=[number 64] [keyword align]=[number 0]',
+ '[keyword v8x16.load_splat] [keyword offset]=[number 64] [keyword align]=[number 0]',
+ '[keyword v16x8.load_splat] [keyword offset]=[number 64] [keyword align]=[number 0]',
+ '[keyword v32x4.load_splat] [keyword offset]=[number 64] [keyword align]=[number 0]',
+ '[keyword v64x2.load_splat] [keyword offset]=[number 64] [keyword align]=[number 0]',
'[keyword v128.store] [keyword offset]=[number 32] [keyword align]=[number 4]',
'[keyword v128.const] [number 0] [number 1] [number 2] [number 3] [number 4] [number 5] [number 6] [number 7] [number 8] [number 9] [number 10] [number 11] [number 12] [number 13] [number 14] [number 15]',
'[keyword v8x16.shuffle] [number 0] [number 1] [number 2] [number 3] [number 4] [number 5] [number 6] [number 7] [number 8] [number 9] [number 10] [number 11] [number 12] [number 13] [number 14] [number 15]',
@@ -208,8 +218,8 @@
'[keyword f64x2.le]',
'[keyword f64x2.ge]',
'[keyword v128.not]',
- '[keyword v128.andnot]',
'[keyword v128.and]',
+ '[keyword v128.andnot]',
'[keyword v128.or]',
'[keyword v128.xor]',
'[keyword v128.bitselect]',
@@ -218,6 +228,8 @@
'[keyword i8x16.any_true]',
'[keyword i8x16.all_true]',
'[keyword i8x16.bitmask]',
+ '[keyword i8x16.narrow_i16x8_s]',
+ '[keyword i8x16.narrow_i16x8_u]',
'[keyword i8x16.shl]',
'[keyword i8x16.shr_s]',
'[keyword i8x16.shr_u]',
@@ -237,6 +249,12 @@
'[keyword i16x8.any_true]',
'[keyword i16x8.all_true]',
'[keyword i16x8.bitmask]',
+ '[keyword i16x8.narrow_i32x4_s]',
+ '[keyword i16x8.narrow_i32x4_u]',
+ '[keyword i16x8.widen_low_i8x16_s]',
+ '[keyword i16x8.widen_high_i8x16_s]',
+ '[keyword i16x8.widen_low_i8x16_u]',
+ '[keyword i16x8.widen_high_i8x16_u]',
'[keyword i16x8.shl]',
'[keyword i16x8.shr_s]',
'[keyword i16x8.shr_u]',
@@ -246,31 +264,38 @@
'[keyword i16x8.sub]',
'[keyword i16x8.sub_saturate_s]',
'[keyword i16x8.sub_saturate_u]',
+ '[keyword i16x8.mul]',
'[keyword i16x8.min_s]',
'[keyword i16x8.min_u]',
'[keyword i16x8.max_s]',
'[keyword i16x8.max_u]',
'[keyword i16x8.avgr_u]',
- '[keyword i32x4.add]',
'[keyword i32x4.abs]',
'[keyword i32x4.neg]',
'[keyword i32x4.any_true]',
'[keyword i32x4.all_true]',
'[keyword i32x4.bitmask]',
+ '[keyword i32x4.widen_low_i16x8_s]',
+ '[keyword i32x4.widen_high_i16x8_s]',
+ '[keyword i32x4.widen_low_i16x8_u]',
+ '[keyword i32x4.widen_high_i16x8_u]',
'[keyword i32x4.shl]',
'[keyword i32x4.shr_s]',
'[keyword i32x4.shr_u]',
+ '[keyword i32x4.add]',
'[keyword i32x4.sub]',
+ '[keyword i32x4.mul]',
'[keyword i32x4.min_s]',
'[keyword i32x4.min_u]',
'[keyword i32x4.max_s]',
'[keyword i32x4.max_u]',
- '[keyword i64x2.add]',
'[keyword i64x2.neg]',
'[keyword i64x2.shl]',
'[keyword i64x2.shr_s]',
'[keyword i64x2.shr_u]',
+ '[keyword i64x2.add]',
'[keyword i64x2.sub]',
+ '[keyword i64x2.mul]',
'[keyword f32x4.abs]',
'[keyword f32x4.neg]',
'[keyword f32x4.sqrt]',
@@ -288,5 +313,9 @@
'[keyword f64x2.mul]',
'[keyword f64x2.div]',
'[keyword f64x2.min]',
- '[keyword f64x2.max]');
+ '[keyword f64x2.max]',
+ '[keyword i32x4.trunc_sat_f32x4_s]',
+ '[keyword i32x4.trunc_sat_f32x4_u]',
+ '[keyword f32x4.convert_i32x4_s]',
+ '[keyword f32x4.convert_i32x4_u]');
})();
diff --git a/mode/wast/wast.js b/mode/wast/wast.js
index 4b1c910e63..9348ad3e0a 100644
--- a/mode/wast/wast.js
+++ b/mode/wast/wast.js
@@ -14,7 +14,7 @@
CodeMirror.defineSimpleMode('wast', {
start: [
{regex: /[+\-]?(?:nan(?::0x[0-9a-fA-F]+)?|infinity|inf|0x[0-9a-fA-F]+\.?[0-9a-fA-F]*p[+\/-]?\d+|\d+(?:\.\d*)?[eE][+\-]?\d*|\d+\.\d*|0x[0-9a-fA-F]+|\d+)/, token: "number"},
- {regex: /mut|nop|block|if|then|else|loop|br_if|br_table|br|call(_indirect)?|drop|end|return(_call(_indirect)?)?|local\.(get|set|tee)|global\.(get|set)|i(32|64)\.(store(8|16)|(load(8|16)_[su]))|i64\.(load32_[su]|store32)|[fi](32|64)\.(const|load|store)|f(32|64)\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)|i(32|64)\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)|i64\.extend_[su]_i32|i32\.wrap_i64|i(32|64)\.trunc_f(32|64)_[su]|f(32|64)\.convert_i(32|64)_[su]|f64\.promote_f32|f32\.demote_f64|f32\.reinterpret_i32|i32\.reinterpret_f32|f64\.reinterpret_i64|i64\.reinterpret_f64|select|unreachable|current_memory|memory(\.((atomic\.(notify|wait(32|64)))|grow|size))?|type|func|param|result|local|global|module|table|start|elem|data|align|offset|import|export|i64\.atomic\.(load32_u|store32|rmw32\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)|i(32|64)\.atomic\.(load((8|16)_u)?|store(8|16)?|rmw(\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))|v128\.(load|store|const|not|andnot|and|or|xor|bitselect)|i(8x16|16x8|32x4|64x2)\.(shl|shr_[su])|i(8x16|16x8)\.(extract_lane_[su]|((add|sub)_saturate_[su])|avgr_u)|(i(8x16|16x8|32x4|64x2)|f(32x4|64x2))\.(splat|replace_lane|neg|add|sub)|i(8x16|16x8|32x4)\.(eq|ne|([lg][te]_[su])|abs|any_true|all_true|bitmask|((min|max)_[su]))|f(32x4|64x2)\.(eq|ne|[lg][te]|abs|sqrt|mul|div|min|max)|[fi](32x4|64x2)\.extract_lane|v8x16\.(shuffle|swizzle)/, token: "keyword"},
+ {regex: /mut|nop|block|if|then|else|loop|br_if|br_table|br|call(_indirect)?|drop|end|return(_call(_indirect)?)?|local\.(get|set|tee)|global\.(get|set)|i(32|64)\.(store(8|16)|(load(8|16)_[su]))|i64\.(load32_[su]|store32)|[fi](32|64)\.(const|load|store)|f(32|64)\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)|i(32|64)\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)|i64\.extend_[su]_i32|i32\.wrap_i64|i(32|64)\.trunc_f(32|64)_[su]|f(32|64)\.convert_i(32|64)_[su]|f64\.promote_f32|f32\.demote_f64|f32\.reinterpret_i32|i32\.reinterpret_f32|f64\.reinterpret_i64|i64\.reinterpret_f64|select|unreachable|current_memory|memory(\.((atomic\.(notify|wait(32|64)))|grow|size))?|type|func|param|result|local|global|module|table|start|elem|data|align|offset|import|export|i64\.atomic\.(load32_u|store32|rmw32\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)|i(32|64)\.atomic\.(load((8|16)_u)?|store(8|16)?|rmw(\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))|v128\.(load|store|const|not|andnot|and|or|xor|bitselect)|i(8x16|16x8|32x4|64x2)\.(shl|shr_[su])|i(8x16|16x8)\.(extract_lane_[su]|((add|sub)_saturate_[su])|avgr_u)|(i(8x16|16x8|32x4|64x2)|f(32x4|64x2))\.(splat|replace_lane|neg|add|sub)|i(8x16|16x8|32x4)\.(eq|ne|([lg][te]_[su])|abs|any_true|all_true|bitmask|((min|max)_[su]))|f(32x4|64x2)\.(eq|ne|[lg][te]|abs|sqrt|mul|div|min|max)|[fi](32x4|64x2)\.extract_lane|v8x16\.(shuffle|swizzle)|i16x8\.(load8x8_[su]|narrow_i32x4_[su]|widen_(low|high)_i8x16_[su]|mul)|i32x4\.(load16x4_[su]|widen_(low|high)_i16x8_[su]|mul|trunc_sat_f32x4_[su])|i64x2\.(load32x2_[su]|mul)|(v(8x16|16x8|32x4|64x2)\.load_splat)|i8x16\.narrow_i16x8_[su]|f32x4\.convert_i32x4_[su]/, token: "keyword"},
{regex: /\b(anyfunc|[fi](32|64))\b/, token: "atom"},
{regex: /\$([a-zA-Z0-9_`\+\-\*\/\\\^~=<>!\?@#$%&|:\.]+)/, token: "variable-2"},
{regex: /"(?:[^"\\\x00-\x1f\x7f]|\\[nt\\'"]|\\[0-9a-fA-F][0-9a-fA-F])*"/, token: "string"},
From 3008203e8fd69195a47d39556ebe78cbf528fb84 Mon Sep 17 00:00:00 2001
From: Paul Schmidt
Date: Tue, 30 Jun 2020 00:07:27 +0200
Subject: [PATCH 007/342] [sas mode] Add missing keywords
I've noticed these few are missing. All from PROC MIXED
---
mode/sas/sas.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mode/sas/sas.js b/mode/sas/sas.js
index c6f528e0a9..49b96b66de 100755
--- a/mode/sas/sas.js
+++ b/mode/sas/sas.js
@@ -88,7 +88,7 @@
define('def', 'source2 nosource2 page pageno pagesize', ['ALL']);
//proc and datastep
- define('def', '_all_ _character_ _cmd_ _freq_ _i_ _infile_ _last_ _msg_ _null_ _numeric_ _temporary_ _type_ abort abs addr adjrsq airy alpha alter altlog altprint and arcos array arsin as atan attrc attrib attrn authserver autoexec awscontrol awsdef awsmenu awsmenumerge awstitle backward band base betainv between blocksize blshift bnot bor brshift bufno bufsize bxor by byerr byline byte calculated call cards cards4 catcache cbufno cdf ceil center cexist change chisq cinv class cleanup close cnonct cntllev coalesce codegen col collate collin column comamid comaux1 comaux2 comdef compbl compound compress config continue convert cos cosh cpuid create cross crosstab css curobs cv daccdb daccdbsl daccsl daccsyd dacctab dairy datalines datalines4 datejul datepart datetime day dbcslang dbcstype dclose ddm delete delimiter depdb depdbsl depsl depsyd deptab dequote descending descript design= device dflang dhms dif digamma dim dinfo display distinct dkricond dkrocond dlm dnum do dopen doptname doptnum dread drop dropnote dsname dsnferr echo else emaildlg emailid emailpw emailserver emailsys encrypt end endsas engine eof eov erf erfc error errorcheck errors exist exp fappend fclose fcol fdelete feedback fetch fetchobs fexist fget file fileclose fileexist filefmt filename fileref fmterr fmtsearch fnonct fnote font fontalias fopen foptname foptnum force formatted formchar formdelim formdlim forward fpoint fpos fput fread frewind frlen from fsep fuzz fwrite gaminv gamma getoption getvarc getvarn go goto group gwindow hbar hbound helpenv helploc hms honorappearance hosthelp hostprint hour hpct html hvar ibessel ibr id if index indexc indexw initcmd initstmt inner input inputc inputn inr insert int intck intnx into intrr invaliddata irr is jbessel join juldate keep kentb kurtosis label lag last lbound leave left length levels lgamma lib library libref line linesize link list log log10 log2 logpdf logpmf logsdf lostcard lowcase lrecl ls macro macrogen maps mautosource max maxdec maxr mdy mean measures median memtype merge merror min minute missing missover mlogic mod mode model modify month mopen mort mprint mrecall msglevel msymtabmax mvarsize myy n nest netpv new news nmiss no nobatch nobs nocaps nocardimage nocenter nocharcode nocmdmac nocol nocum nodate nodbcs nodetails nodmr nodms nodmsbatch nodup nodupkey noduplicates noechoauto noequals noerrorabend noexitwindows nofullstimer noicon noimplmac noint nolist noloadlist nomiss nomlogic nomprint nomrecall nomsgcase nomstored nomultenvappl nonotes nonumber noobs noovp nopad nopercent noprint noprintinit normal norow norsasuser nosetinit nosplash nosymbolgen note notes notitle notitles notsorted noverbose noxsync noxwait npv null number numkeys nummousekeys nway obs on open order ordinal otherwise out outer outp= output over ovp p(1 5 10 25 50 75 90 95 99) pad pad2 paired parm parmcards path pathdll pathname pdf peek peekc pfkey pmf point poisson poke position printer probbeta probbnml probchi probf probgam probhypr probit probnegb probnorm probsig probt procleave prt ps pw pwreq qtr quote r ranbin rancau ranexp rangam range ranks rannor ranpoi rantbl rantri ranuni read recfm register regr remote remove rename repeat replace resolve retain return reuse reverse rewind right round rsquare rtf rtrace rtraceloc s s2 samploc sasautos sascontrol sasfrscr sasmsg sasmstore sasscript sasuser saving scan sdf second select selection separated seq serror set setcomm setot sign simple sin sinh siteinfo skewness skip sle sls sortedby sortpgm sortseq sortsize soundex spedis splashlocation split spool sqrt start std stderr stdin stfips stimer stname stnamel stop stopover subgroup subpopn substr sum sumwgt symbol symbolgen symget symput sysget sysin sysleave sysmsg sysparm sysprint sysprintfont sysprod sysrc system t table tables tan tanh tapeclose tbufsize terminal test then timepart tinv tnonct to today tol tooldef totper transformout translate trantab tranwrd trigamma trim trimn trunc truncover type unformatted uniform union until upcase update user usericon uss validate value var weight when where while wincharset window work workinit workterm write wsum xsync xwait yearcutoff yes yyq min max', ['inDataStep', 'inProc']);
+ define('def', '_all_ _character_ _cmd_ _freq_ _i_ _infile_ _last_ _msg_ _null_ _numeric_ _temporary_ _type_ abort abs addr adjrsq airy alpha alter altlog altprint and arcos array arsin as atan attrc attrib attrn authserver autoexec awscontrol awsdef awsmenu awsmenumerge awstitle backward band base betainv between blocksize blshift bnot bor brshift bufno bufsize bxor by byerr byline byte calculated call cards cards4 catcache cbufno cdf ceil center cexist change chisq cinv class cleanup close cnonct cntllev coalesce codegen col collate collin column comamid comaux1 comaux2 comdef compbl compound compress config continue convert cos cosh cpuid create cross crosstab css curobs cv daccdb daccdbsl daccsl daccsyd dacctab dairy datalines datalines4 datejul datepart datetime day dbcslang dbcstype dclose ddfm ddm delete delimiter depdb depdbsl depsl depsyd deptab dequote descending descript design= device dflang dhms dif digamma dim dinfo display distinct dkricond dkrocond dlm dnum do dopen doptname doptnum dread drop dropnote dsname dsnferr echo else emaildlg emailid emailpw emailserver emailsys encrypt end endsas engine eof eov erf erfc error errorcheck errors exist exp fappend fclose fcol fdelete feedback fetch fetchobs fexist fget file fileclose fileexist filefmt filename fileref fmterr fmtsearch fnonct fnote font fontalias fopen foptname foptnum force formatted formchar formdelim formdlim forward fpoint fpos fput fread frewind frlen from fsep fuzz fwrite gaminv gamma getoption getvarc getvarn go goto group gwindow hbar hbound helpenv helploc hms honorappearance hosthelp hostprint hour hpct html hvar ibessel ibr id if index indexc indexw initcmd initstmt inner input inputc inputn inr insert int intck intnx into intrr invaliddata irr is jbessel join juldate keep kentb kurtosis label lag last lbound leave left length levels lgamma lib library libref line linesize link list log log10 log2 logpdf logpmf logsdf lostcard lowcase lrecl ls macro macrogen maps mautosource max maxdec maxr mdy mean measures median memtype merge merror min minute missing missover mlogic mod mode model modify month mopen mort mprint mrecall msglevel msymtabmax mvarsize myy n nest netpv new news nmiss no nobatch nobs nocaps nocardimage nocenter nocharcode nocmdmac nocol nocum nodate nodbcs nodetails nodmr nodms nodmsbatch nodup nodupkey noduplicates noechoauto noequals noerrorabend noexitwindows nofullstimer noicon noimplmac noint nolist noloadlist nomiss nomlogic nomprint nomrecall nomsgcase nomstored nomultenvappl nonotes nonumber noobs noovp nopad nopercent noprint noprintinit normal norow norsasuser nosetinit nosplash nosymbolgen note notes notitle notitles notsorted noverbose noxsync noxwait npv null number numkeys nummousekeys nway obs on open order ordinal otherwise out outer outp= output over ovp p(1 5 10 25 50 75 90 95 99) pad pad2 paired parm parmcards path pathdll pathname pdf peek peekc pfkey pmf point poisson poke position printer probbeta probbnml probchi probf probgam probhypr probit probnegb probnorm probsig probt procleave prt ps pw pwreq qtr quote r ranbin rancau random ranexp rangam range ranks rannor ranpoi rantbl rantri ranuni rcorr read recfm register regr remote remove rename repeat repeated replace resolve retain return reuse reverse rewind right round rsquare rtf rtrace rtraceloc s s2 samploc sasautos sascontrol sasfrscr sasmsg sasmstore sasscript sasuser saving scan sdf second select selection separated seq serror set setcomm setot sign simple sin sinh siteinfo skewness skip sle sls sortedby sortpgm sortseq sortsize soundex spedis splashlocation split spool sqrt start std stderr stdin stfips stimer stname stnamel stop stopover sub subgroup subpopn substr sum sumwgt symbol symbolgen symget symput sysget sysin sysleave sysmsg sysparm sysprint sysprintfont sysprod sysrc system t table tables tan tanh tapeclose tbufsize terminal test then timepart tinv tnonct to today tol tooldef totper transformout translate trantab tranwrd trigamma trim trimn trunc truncover type unformatted uniform union until upcase update user usericon uss validate value var weight when where while wincharset window work workinit workterm write wsum xsync xwait yearcutoff yes yyq min max', ['inDataStep', 'inProc']);
define('operator', 'and not ', ['inDataStep', 'inProc']);
// Main function
From e2d786c7583371dedc432cf70755f01df0299a49 Mon Sep 17 00:00:00 2001
From: benhormann
Date: Wed, 8 Jul 2020 07:15:31 +0100
Subject: [PATCH 008/342] [vim bindings] Document events fired by vim mode
---
doc/manual.html | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/doc/manual.html b/doc/manual.html
index 8f42eeff60..e779008384 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -58,6 +58,7 @@
Vim Mode API
@@ -3559,6 +3560,21 @@ Configuration
+ Events
+
+ VIM mode signals a few events on the editor instance. For an example usage, see demo/vim.html#L101.
+
+
+ "vim-command-done" (reason: undefined)
+ - Fired on keypress and mousedown where command has completed or no command found.
+
+ "vim-keypress" (vimKey: string)
+ - Fired on keypress,
vimKey
is in Vim's key notation.
+
+ "vim-mode-change" (modeObj: object)
+ - Fired after mode change,
modeObj
parameter is a {mode: string, ?subMode: string}
object. Modes: "insert", "normal", "replace", "visual"
. Visual sub-modes: "linewise", "blockwise"
.
+
+
Extending VIM
CodeMirror's VIM mode implements a large subset of VIM's core
From b5ce22f1e350431adaefbad40cbfc54dbfdb1c77 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Wed, 8 Jul 2020 08:35:24 +0200
Subject: [PATCH 009/342] Fix line-wise pasting on Chrome Windows
Closes #6337
---
src/input/input.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/input/input.js b/src/input/input.js
index 8519ecfb7c..32adbf9b2a 100644
--- a/src/input/input.js
+++ b/src/input/input.js
@@ -51,7 +51,7 @@ export function applyTextInput(cm, inserted, deleted, sel, origin) {
from = Pos(from.line, from.ch - deleted)
else if (cm.state.overwrite && !paste) // Handle overwrite
to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length))
- else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == inserted)
+ else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == textLines.join("\n"))
from = to = Pos(from.line, 0)
}
let changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines,
@@ -132,4 +132,4 @@ export function hiddenTextarea() {
if (ios) te.style.border = "1px solid black"
disableBrowserMagic(te)
return div
-}
\ No newline at end of file
+}
From 0682bcc8d5d5f03cebfbb9d14c3ffa7dcc3e0e6d Mon Sep 17 00:00:00 2001
From: Kaushik Kulkarni
Date: Thu, 2 Jul 2020 00:54:59 -0500
Subject: [PATCH 010/342] [hardwrap addon] introduce forceBreak
---
addon/wrap/hardwrap.js | 30 ++++++++++++++++++++++--------
doc/manual.html | 5 +++++
2 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/addon/wrap/hardwrap.js b/addon/wrap/hardwrap.js
index 29cc15f01f..2259e0e11e 100644
--- a/addon/wrap/hardwrap.js
+++ b/addon/wrap/hardwrap.js
@@ -29,11 +29,20 @@
return {from: start, to: end};
}
- function findBreakPoint(text, column, wrapOn, killTrailingSpace) {
+ function findBreakPoint(text, column, wrapOn, killTrailingSpace, forceBreak) {
var at = column
while (at < text.length && text.charAt(at) == " ") at++
for (; at > 0; --at)
if (wrapOn.test(text.slice(at - 1, at + 1))) break;
+
+ if ((at == 0) && (!forceBreak)) {
+ // didn't find a break point before column, in non-forceBreak mode try to
+ // find one after 'column'.
+ for (at = column+1; at < text.length-1; ++at) {
+ if (wrapOn.test(text.slice(at - 1, at + 1))) break;
+ }
+ }
+
for (var first = true;; first = false) {
var endOfText = at;
if (killTrailingSpace)
@@ -47,6 +56,7 @@
from = cm.clipPos(from); to = cm.clipPos(to);
var column = options.column || 80;
var wrapOn = options.wrapOn || /\s\S|-[^\.\d]/;
+ var forceBreak = options.forceBreak !== false;
var killTrailing = options.killTrailingSpace !== false;
var changes = [], curLine = "", curNo = from.line;
var lines = cm.getRange(from, to, false);
@@ -68,7 +78,7 @@
curLine += text;
if (i) {
var firstBreak = curLine.length > column && leadingSpace == spaceTrimmed &&
- findBreakPoint(curLine, column, wrapOn, killTrailing);
+ findBreakPoint(curLine, column, wrapOn, killTrailing, forceBreak);
// If this isn't broken, or is broken at a different point, remove old break
if (!firstBreak || firstBreak.from != oldLen || firstBreak.to != oldLen + spaceInserted) {
changes.push({text: [spaceInserted ? " " : ""],
@@ -80,12 +90,16 @@
}
}
while (curLine.length > column) {
- var bp = findBreakPoint(curLine, column, wrapOn, killTrailing);
- changes.push({text: ["", leadingSpace],
- from: Pos(curNo, bp.from),
- to: Pos(curNo, bp.to)});
- curLine = leadingSpace + curLine.slice(bp.to);
- ++curNo;
+ var bp = findBreakPoint(curLine, column, wrapOn, killTrailing, forceBreak);
+ if ((bp.from != bp.to) || (forceBreak)) {
+ changes.push({text: ["", leadingSpace],
+ from: Pos(curNo, bp.from),
+ to: Pos(curNo, bp.to)});
+ curLine = leadingSpace + curLine.slice(bp.to);
+ ++curNo;
+ } else {
+ break;
+ }
}
}
if (changes.length) cm.operation(function() {
diff --git a/doc/manual.html b/doc/manual.html
index e779008384..8008002a40 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -3135,6 +3135,11 @@ Addons
killTrailingSpace: boolean
Whether trailing space caused by wrapping should be
preserved, or deleted. Defaults to true.
+ forceBreak: boolean
+ If set to true forces a break at column
in the case
+ when no wrapOn
pattern is found in the range. If set to
+ false allows line to overflow the column
limit if no
+ wrapOn
pattern found. Defaults to true.
A demo of the addon is available here.
From 09943f9eafe7997747821946c67c4fd97c9700d9 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Wed, 8 Jul 2020 09:30:29 +0200
Subject: [PATCH 011/342] [hardbreak addon] Adjust formatting
Issue #6338
---
addon/wrap/hardwrap.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/addon/wrap/hardwrap.js b/addon/wrap/hardwrap.js
index 2259e0e11e..f194946c5d 100644
--- a/addon/wrap/hardwrap.js
+++ b/addon/wrap/hardwrap.js
@@ -35,10 +35,10 @@
for (; at > 0; --at)
if (wrapOn.test(text.slice(at - 1, at + 1))) break;
- if ((at == 0) && (!forceBreak)) {
+ if (at == 0 && !forceBreak) {
// didn't find a break point before column, in non-forceBreak mode try to
// find one after 'column'.
- for (at = column+1; at < text.length-1; ++at) {
+ for (at = column + 1; at < text.length - 1; ++at) {
if (wrapOn.test(text.slice(at - 1, at + 1))) break;
}
}
@@ -56,7 +56,7 @@
from = cm.clipPos(from); to = cm.clipPos(to);
var column = options.column || 80;
var wrapOn = options.wrapOn || /\s\S|-[^\.\d]/;
- var forceBreak = options.forceBreak !== false;
+ var forceBreak = options.forceBreak !== false;
var killTrailing = options.killTrailingSpace !== false;
var changes = [], curLine = "", curNo = from.line;
var lines = cm.getRange(from, to, false);
@@ -91,7 +91,7 @@
}
while (curLine.length > column) {
var bp = findBreakPoint(curLine, column, wrapOn, killTrailing, forceBreak);
- if ((bp.from != bp.to) || (forceBreak)) {
+ if (bp.from != bp.to || forceBreak) {
changes.push({text: ["", leadingSpace],
from: Pos(curNo, bp.from),
to: Pos(curNo, bp.to)});
From a0179ed7e0f935d309b1874759a15ee37cc36b60 Mon Sep 17 00:00:00 2001
From: Axel Lewenhaupt
Date: Fri, 3 Jul 2020 18:29:15 +0200
Subject: [PATCH 012/342] Add support for import expressions.
Committer: Axel Lewenhaupt
---
mode/soy/soy.js | 24 ++++++++++++++++++++++++
mode/soy/test.js | 3 +++
2 files changed, 27 insertions(+)
diff --git a/mode/soy/soy.js b/mode/soy/soy.js
index 1b19923da5..c97109b27d 100644
--- a/mode/soy/soy.js
+++ b/mode/soy/soy.js
@@ -402,6 +402,26 @@
}
return expression(stream, state);
+ case "import":
+ if (stream.eat(";")) {
+ state.soyState.pop();
+ state.indent -= 2 * config.indentUnit;
+ return null;
+ }
+ if (stream.match(/\w+(?=\s+as)/)) {
+ return "variable";
+ }
+ if (match = stream.match(/\w+/)) {
+ return /(from|as)/.test(match[0]) ? "keyword" : "def";
+ }
+ if (match = stream.match(/^["']/)) {
+ state.soyState.push("string");
+ state.quoteKind = match[0];
+ return "string";
+ }
+ stream.next();
+ return null;
+
case "tag":
var endTag = state.tag[0] == "/";
var tagName = endTag ? state.tag.substring(1) : state.tag;
@@ -499,6 +519,10 @@
state.indent += 2 * config.indentUnit;
state.soyState.push("tag");
return "keyword";
+ } else if (!state.context && stream.match(/\bimport\b/)) {
+ state.soyState.push("import");
+ state.indent += 2 * config.indentUnit;
+ return "keyword";
}
return tokenUntil(stream, state, /\{|\s+\/\/|\/\*/);
diff --git a/mode/soy/test.js b/mode/soy/test.js
index 2fb450e32e..11b49bccaa 100644
--- a/mode/soy/test.js
+++ b/mode/soy/test.js
@@ -252,4 +252,7 @@
'[keyword {let] [def $myList]: [[[[[string \'a\'] ] ] [keyword /}] ' +
'[keyword {let] [def $test]: [[[variable $a] [operator +] [atom 1] [keyword for] ' +
'[def $a] [keyword in] [variable-2 $myList] [keyword if] [variable-2 $a] [operator >=] [atom 3] ] [keyword /}]');
+
+ MT('import',
+ '[keyword import] {[def Name], [variable Person] [keyword as] [def P]} [keyword from] [string \'examples/proto/example.proto\'];');
})();
From 82d0f4aacf307763cfae1ac6d60dbeefc221a230 Mon Sep 17 00:00:00 2001
From: Axel Lewenhaupt
Date: Thu, 9 Jul 2020 15:58:34 +0200
Subject: [PATCH 013/342] [soy mode] Support template type
Co-authored-by: Axel Lewenhaupt
---
mode/soy/soy.js | 21 +++++++++++++++++++++
mode/soy/test.js | 7 +++++++
2 files changed, 28 insertions(+)
diff --git a/mode/soy/soy.js b/mode/soy/soy.js
index c97109b27d..3539f313fc 100644
--- a/mode/soy/soy.js
+++ b/mode/soy/soy.js
@@ -256,6 +256,11 @@
// Otherwise
return "variable";
}
+ if (match = stream.match(/^\$([\w]+)/)) {
+ state.soyState.pop();
+ return ref(state.variables, match[1], !state.lookupVariables);
+ }
+
stream.next();
return null;
@@ -300,6 +305,9 @@
} else if (peekChar == "[") {
state.soyState.push('param-type-record');
return null;
+ } else if (peekChar == "(") {
+ state.soyState.push('param-type-template');
+ return null;
} else if (peekChar == "<") {
state.soyState.push('param-type-parameter');
return null;
@@ -334,6 +342,19 @@
stream.next();
return null;
+ case "param-type-template":
+ if (stream.match(/[>]/)) {
+ state.soyState.pop();
+ state.soyState.push('param-type');
+ return null;
+ }
+ if (stream.match(/^\w+/)) {
+ state.soyState.push('param-type');
+ return "def";
+ }
+ stream.next();
+ return null;
+
case "var-def":
if (match = stream.match(/^\$([\w]+)/)) {
state.variables = prepend(state.variables, match[1]);
diff --git a/mode/soy/test.js b/mode/soy/test.js
index 11b49bccaa..8253b47357 100644
--- a/mode/soy/test.js
+++ b/mode/soy/test.js
@@ -178,6 +178,13 @@
'[keyword {/template}]',
'');
+ MT('param-type-template',
+ '[keyword {template] [def .foo][keyword }]',
+ ' [keyword {@param] [def renderer]: ([def s]:[type string])=>[type html][keyword }]',
+ ' [keyword {call] [variable-2 $renderer] [keyword /}]',
+ '[keyword {/template}]',
+ '');
+
MT('single-quote-strings',
'[keyword {][string "foo"] [string \'bar\'][keyword }]',
'');
From 0ec092019c98ce39584f3cc814732e348b69d570 Mon Sep 17 00:00:00 2001
From: Axel Lewenhaupt
Date: Thu, 9 Jul 2020 22:28:01 +0200
Subject: [PATCH 014/342] [soy mode] Add support for index in for loops
- Fix variable scrope issue with list comprehensions.
Co-authored-by: Axel Lewenhaupt
---
mode/soy/soy.js | 24 ++++++++++++++++++------
mode/soy/test.js | 19 +++++++++++++++++++
2 files changed, 37 insertions(+), 6 deletions(-)
diff --git a/mode/soy/soy.js b/mode/soy/soy.js
index 3539f313fc..d31c947eed 100644
--- a/mode/soy/soy.js
+++ b/mode/soy/soy.js
@@ -34,9 +34,9 @@
"switch": {},
"case": { noEndTag: true, reduceIndent: true},
"default": { noEndTag: true, reduceIndent: true},
- "foreach": { variableScope: true, soyState: "var-def" },
+ "foreach": { variableScope: true, soyState: "for-loop" },
"ifempty": { noEndTag: true, reduceIndent: true},
- "for": { variableScope: true, soyState: "var-def" },
+ "for": { variableScope: true, soyState: "for-loop" },
"call": { soyState: "templ-ref" },
"param": { soyState: "param-ref"},
"print": { noEndTag: true },
@@ -129,6 +129,7 @@
var match;
if (stream.match(/[[]/)) {
state.soyState.push("list-literal");
+ state.context = new Context(state.context, "list-literal", state.variables);
state.lookupVariables = false;
return null;
} else if (stream.match(/map\b/)) {
@@ -364,6 +365,18 @@
stream.next();
return null;
+ case "for-loop":
+ if (stream.match(/\bin\b/)) {
+ state.soyState.pop();
+ return "keyword";
+ }
+ if (stream.peek() == "$") {
+ state.soyState.push('var-def');
+ return null;
+ }
+ stream.next();
+ return null;
+
case "record-literal":
if (stream.match(/^[)]/)) {
state.soyState.pop();
@@ -394,13 +407,12 @@
if (stream.match(/\]/)) {
state.soyState.pop();
state.lookupVariables = true;
+ popcontext(state);
return null;
}
- if (stream.match(/for\b/)) {
- state.soyState.push("var-def")
- return "keyword";
- } else if (stream.match(/in\b/)) {
+ if (stream.match(/\bfor\b/)) {
state.lookupVariables = true;
+ state.soyState.push('for-loop');
return "keyword";
}
return expression(stream, state);
diff --git a/mode/soy/test.js b/mode/soy/test.js
index 8253b47357..57cd4be477 100644
--- a/mode/soy/test.js
+++ b/mode/soy/test.js
@@ -138,6 +138,11 @@
'[keyword {/foreach}]',
'');
+ MT('foreach-index',
+ '[keyword {foreach] [def $foo],[def $index] [keyword in] [[]] [keyword }]',
+ ' [keyword {][variable-2 $foo][keyword }] [keyword {][variable-2 $index][keyword }]',
+ '[keyword {/foreach}]');
+
MT('nested-kind-test',
'[keyword {template] [def .foo] [attribute kind]=[string "html"][keyword }]',
' [tag&bracket <][tag div][tag&bracket >]',
@@ -260,6 +265,20 @@
'[keyword {let] [def $test]: [[[variable $a] [operator +] [atom 1] [keyword for] ' +
'[def $a] [keyword in] [variable-2 $myList] [keyword if] [variable-2 $a] [operator >=] [atom 3] ] [keyword /}]');
+ MT('list-comprehension-index',
+ '[keyword {let] [def $test]: [[[variable $a] [operator +] [variable $index] [keyword for] ' +
+ '[def $a],[def $index] [keyword in] [[]] [keyword if] [variable-2 $a] [operator >=] [variable-2 $index] ] [keyword /}]');
+
+
+ MT('list-comprehension-variable-scope',
+ '[keyword {let] [def $name]: [string "world"][keyword /}]',
+ '[keyword {let] [def $test]: [[[variable $a] [operator +] [variable $index] [keyword for] ' +
+ '[def $a],[def $index] [keyword in] [[]] [keyword if] [variable-2 $a] [operator >=] [variable-2 $index] ] [keyword /}]',
+ '[keyword {][variable-2&error $a][keyword }]',
+ '[keyword {][variable-2&error $index][keyword }]',
+ '[keyword {][variable-2 $test][keyword }]',
+ '[keyword {][variable-2 $name][keyword }]');
+
MT('import',
'[keyword import] {[def Name], [variable Person] [keyword as] [def P]} [keyword from] [string \'examples/proto/example.proto\'];');
})();
From f5bf57b39816f0e6524a1b7d0212e9f26135ba08 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Sun, 12 Jul 2020 13:26:09 +0200
Subject: [PATCH 015/342] [sql-hint addon] Treat single quotes like double
quotes when looking at tokens
See https://discuss.codemirror.net/t/codemirror-ignore-show-hints-if-the-class-is-cm-string/2513
---
addon/hint/sql-hint.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addon/hint/sql-hint.js b/addon/hint/sql-hint.js
index 0b89b79fab..de84707db3 100644
--- a/addon/hint/sql-hint.js
+++ b/addon/hint/sql-hint.js
@@ -264,7 +264,7 @@
token.string = token.string.slice(0, cur.ch - token.start);
}
- if (token.string.match(/^[.`"\w@][\w$#]*$/g)) {
+ if (token.string.match(/^[.`"'\w@][\w$#]*$/g)) {
search = token.string;
start = token.start;
end = token.end;
From feed5d5325e97f7414bef999347db338aa93f340 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Mon, 20 Jul 2020 22:07:20 +0200
Subject: [PATCH 016/342] Stop linking to the github wiki
---
doc/manual.html | 6 +++---
index.html | 5 -----
2 files changed, 3 insertions(+), 8 deletions(-)
diff --git a/doc/manual.html b/doc/manual.html
index 8008002a40..a76378470d 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -79,9 +79,9 @@
functionality. It does provide a rich API on top of which such
functionality can be straightforwardly implemented. See
the addons included in the distribution,
- and the list
- of externally hosted addons, for reusable
- implementations of extra features.
+ and 3rd party
+ packages on npm, for reusable implementations of extra
+ features.
CodeMirror works with language-specific modes. Modes are
JavaScript programs that help color (and optionally indent) text
diff --git a/index.html b/index.html
index 520fce4ec2..27cf8fc7fe 100644
--- a/index.html
+++ b/index.html
@@ -171,11 +171,6 @@
Community
that explicit, we have
a code of
conduct that applies to communication around the project.
-
- A list of CodeMirror-related software that is not part of the
- main distribution is maintained
- on our
- wiki. Feel free to add your project.
From c8c4565d09f240afc33a31561e42943dfeee4784 Mon Sep 17 00:00:00 2001
From: Bin Ni
Date: Mon, 20 Jul 2020 13:09:25 -0700
Subject: [PATCH 017/342] [show-hint addon] Introduced option 'scrollMargin'
---
addon/hint/show-hint.js | 12 +++++++-----
doc/manual.html | 3 +++
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/addon/hint/show-hint.js b/addon/hint/show-hint.js
index c55deab3a6..cd0d6a7bd5 100644
--- a/addon/hint/show-hint.js
+++ b/addon/hint/show-hint.js
@@ -379,12 +379,14 @@
},
scrollToActive: function() {
- var node = this.hints.childNodes[this.selectedHint]
+ var margin = this.completion.options.scrollMargin || 0;
+ var node1 = this.hints.childNodes[Math.max(0, this.selectedHint - margin)];
+ var node2 = this.hints.childNodes[Math.min(this.data.list.length - 1, this.selectedHint + margin)];
var firstNode = this.hints.firstChild;
- if (node.offsetTop < this.hints.scrollTop)
- this.hints.scrollTop = node.offsetTop - firstNode.offsetTop;
- else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight)
- this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + firstNode.offsetTop;
+ if (node1.offsetTop < this.hints.scrollTop)
+ this.hints.scrollTop = node1.offsetTop - firstNode.offsetTop;
+ else if (node2.offsetTop + node2.offsetHeight > this.hints.scrollTop + this.hints.clientHeight)
+ this.hints.scrollTop = node2.offsetTop + node2.offsetHeight - this.hints.clientHeight + firstNode.offsetTop;
},
screenAmount: function() {
diff --git a/doc/manual.html b/doc/manual.html
index a76378470d..1bcd395e63 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -2790,6 +2790,9 @@ Addons
Like customKeys
above, but the bindings will
be added to the set of default bindings, instead of replacing
them.
+ scrollMargin: integer
+ Show this many lines before and after the selected item.
+ Default is 0.
The following events will be fired on the completions object
during completion:
From 772d09e697612889ec5dbed2cc058e754232c29d Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Mon, 20 Jul 2020 22:28:58 +0200
Subject: [PATCH 018/342] Mark version 5.56.0
---
AUTHORS | 2 ++
CHANGELOG.md | 20 +++++++++++++++++++-
doc/manual.html | 2 +-
doc/releases.html | 12 ++++++++++++
index.html | 2 +-
package.json | 2 +-
src/edit/main.js | 2 +-
7 files changed, 37 insertions(+), 5 deletions(-)
diff --git a/AUTHORS b/AUTHORS
index f041a0572a..a9e79126b6 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -441,6 +441,7 @@ jwallers@gmail.com
kaniga
karevn
Karol
+Kaushik Kulkarni
Kayur Patel
Kazuhito Hokamura
kcwiakala
@@ -657,6 +658,7 @@ Patrick Strawderman
Paul Garvin
Paul Ivanov
Paul Masson
+Paul Schmidt
Pavel
Pavel Feldman
Pavel Petržela
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b87340b524..13039b9701 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,22 @@
-## 5.55.0 (2020-05-20)
+## 5.56.0 (2020-07-20)
+
+### Bug fixes
+
+Line-wise pasting was fixed on Chrome Windows.
+
+[wast mode](https://codemirror.net/mode/wast/): Follow standard changes.
+
+[soy mode](https://codemirror.net/mode/soy/): Support import expressions, template type, and loop indices.
+
+[sql-hint addon](https://codemirror.net/doc/manual.html#addon_sql-hint): Improve handling of double quotes.
+
+### New features
+
+[show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint): New option `scrollMargin` to control how many options are visible beyond the selected one.
+
+[hardwrap addon](https://codemirror.net/doc/manual.html#addon_hardwrap): New option `forceBreak` to disable breaking of words that are longer than a line.
+
+## 5.55.0 (2020-06-21)
### Bug fixes
diff --git a/doc/manual.html b/doc/manual.html
index 1bcd395e63..ba46c099f0 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -70,7 +70,7 @@
User manual and reference guide
- version 5.55.0
+ version 5.56.0
CodeMirror is a code-editor component that can be embedded in
diff --git a/doc/releases.html b/doc/releases.html
index fd02a7fbd9..6ab175a7b3 100644
--- a/doc/releases.html
+++ b/doc/releases.html
@@ -30,6 +30,18 @@
Release notes and version history
Version 5.x
+ 20-07-2020: Version 5.56.0:
+
+
+ - Line-wise pasting was fixed on Chrome Windows.
+ - wast mode: Follow standard changes.
+ - soy mode: Support import expressions, template type, and loop indices.
+ - sql-hint addon: Improve handling of double quotes.
+ New features
+ - show-hint addon: New option
scrollMargin
to control how many options are visible beyond the selected one.
+ - hardwrap addon: New option
forceBreak
to disable breaking of words that are longer than a line.
+
+
21-06-2020: Version 5.55.0:
diff --git a/index.html b/index.html
index 27cf8fc7fe..8ee9b384b2 100644
--- a/index.html
+++ b/index.html
@@ -99,7 +99,7 @@ This is CodeMirror
- Get the current version:
5.55.0.
+ Get the current version:
5.56.0.
You can see the
code,
read the
release notes,
or study the
user manual.
diff --git a/package.json b/package.json
index dcffa6d998..374bd877d2 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "codemirror",
- "version": "5.55.0",
+ "version": "5.56.0",
"main": "lib/codemirror.js",
"style": "lib/codemirror.css",
"author": {
diff --git a/src/edit/main.js b/src/edit/main.js
index 04efb81564..3b378e8f33 100644
--- a/src/edit/main.js
+++ b/src/edit/main.js
@@ -66,4 +66,4 @@ import { addLegacyProps } from "./legacy.js"
addLegacyProps(CodeMirror)
-CodeMirror.version = "5.55.0"
+CodeMirror.version = "5.56.0"
From fdbc04a94a3b0064b896effa6da6544f1c2bb39a Mon Sep 17 00:00:00 2001
From: Howard
Date: Thu, 23 Jul 2020 14:45:56 -0400
Subject: [PATCH 019/342] [vim bindings] Support tag text objects in xml /
htmlmixed mode
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
User can use `t` to operate on tag text objects. For example, given the
following html:
```
hello world!
```
If the user's cursor (denoted by █) is inside "hello world!":
```
hello█world!
```
And they enter `dit` (delete inner tag), then the text inside the
enclosing tag is deleted -- the following is the expected result:
```
```
If they enter `dat` (delete around tag), then the surrounding tags are
deleted as well:
```
```
This logic depends on the following:
- mode/xml/xml.js
- addon/fold/xml-fold.js
- editor is in htmlmixedmode / xml mode
Caveats
This is _NOT_ a 100% accurate implementation of vim tag text objects.
For example, the following cases noop / are inconsistent with vim
behavior:
- Does not work inside comments:
```
```
- Does not work when tags have different cases:
```
broken
```
- Does not work when inside a broken tag:
```
```
This addresses #3828.
---
keymap/vim.js | 47 ++++++++++++++++++++++++++++++++++++++++++++++-
test/index.html | 1 +
test/vim_test.js | 30 ++++++++++++++++++++++++++++--
3 files changed, 75 insertions(+), 3 deletions(-)
diff --git a/keymap/vim.js b/keymap/vim.js
index bca6d46d72..5a4860c65a 100644
--- a/keymap/vim.js
+++ b/keymap/vim.js
@@ -2069,6 +2069,8 @@
if (operatorArgs) { operatorArgs.linewise = true; }
tmp.end.line--;
}
+ } else if (character === 't') {
+ tmp = expandTagUnderCursor(cm, head, inclusive);
} else {
// No text object defined for this, don't move.
return null;
@@ -3295,6 +3297,49 @@
return { start: Pos(cur.line, start), end: Pos(cur.line, end) };
}
+ /**
+ * Depends on the following:
+ *
+ * - editor mode should be htmlmixedmode / xml
+ * - mode/xml/xml.js should be loaded
+ * - addon/fold/xml-fold.js should be loaded
+ *
+ * If any of the above requirements are not true, this function noops.
+ *
+ * This is _NOT_ a 100% accurate implementation of vim tag text objects.
+ * The following caveats apply (based off cursory testing, I'm sure there
+ * are other discrepancies):
+ *
+ * - Does not work inside comments:
+ * ```
+ *
+ * ```
+ * - Does not work when tags have different cases:
+ * ```
+ * broken
+ * ```
+ * - Does not work when cursor is inside a broken tag:
+ * ```
+ *
+ * ```
+ */
+ function expandTagUnderCursor(cm, head, inclusive) {
+ var cur = head;
+ if (!CodeMirror.findMatchingTag || !CodeMirror.findEnclosingTag) {
+ return { start: cur, end: cur };
+ }
+
+ var tags = CodeMirror.findMatchingTag(cm, head) || CodeMirror.findEnclosingTag(cm, head);
+ if (!tags || !tags.open || !tags.close) {
+ return { start: cur, end: cur };
+ }
+
+ if (inclusive) {
+ return { start: tags.open.from, end: tags.close.to };
+ }
+ return { start: tags.open.to, end: tags.close.from };
+ }
+
function recordJumpPosition(cm, oldCur, newCur) {
if (!cursorEqual(oldCur, newCur)) {
vimGlobalState.jumpList.add(cm, oldCur, newCur);
@@ -3836,7 +3881,7 @@
return Pos(curr_index.ln, curr_index.pos);
}
- // TODO: perhaps this finagling of start and end positions belonds
+ // TODO: perhaps this finagling of start and end positions belongs
// in codemirror/replaceRange?
function selectCompanionObject(cm, head, symb, inclusive) {
var cur = head, start, end;
diff --git a/test/index.html b/test/index.html
index b68ce18964..6566fc436e 100644
--- a/test/index.html
+++ b/test/index.html
@@ -156,6 +156,7 @@ Test Suite
+
diff --git a/test/vim_test.js b/test/vim_test.js
index 71284bdf59..57d276e871 100644
--- a/test/vim_test.js
+++ b/test/vim_test.js
@@ -1317,9 +1317,13 @@ testVim('=', function(cm, vim, helpers) {
eq(expectedValue, cm.getValue());
}, { value: ' word1\n word2\n word3', indentUnit: 2 });
-// Edit tests
-function testEdit(name, before, pos, edit, after) {
+// Edit tests - configureCm is an optional argument that gives caller
+// access to the cm object.
+function testEdit(name, before, pos, edit, after, configureCm) {
return testVim(name, function(cm, vim, helpers) {
+ if (configureCm) {
+ configureCm(cm);
+ }
var ch = before.search(pos)
var line = before.substring(0, ch).split('\n').length - 1;
if (line) {
@@ -1424,6 +1428,28 @@ testEdit('di>_middle_spc', 'a\t<\n\tbar\n>b', /r/, 'di>', 'a\t<>b');
testEdit('da<_middle_spc', 'a\t<\n\tbar\n>b', /r/, 'da<', 'a\tb');
testEdit('da>_middle_spc', 'a\t<\n\tbar\n>b', /r/, 'da>', 'a\tb');
+// deleting tag objects
+testEdit('dat_noop', 'hello', /n/, 'dat', 'hello');
+testEdit('dat_open_tag', 'hello', /n/, 'dat', '', function(cm) {
+ cm.setOption('mode', 'xml');
+});
+testEdit('dat_inside_tag', 'hello', /l/, 'dat', '', function(cm) {
+ cm.setOption('mode', 'xml');
+});
+testEdit('dat_close_tag', 'hello', /\//, 'dat', '', function(cm) {
+ cm.setOption('mode', 'xml');
+});
+
+testEdit('dit_open_tag', 'hello', /n/, 'dit', '', function(cm) {
+ cm.setOption('mode', 'xml');
+});
+testEdit('dit_inside_tag', 'hello', /l/, 'dit', '', function(cm) {
+ cm.setOption('mode', 'xml');
+});
+testEdit('dit_close_tag', 'hello', /\//, 'dit', '', function(cm) {
+ cm.setOption('mode', 'xml');
+});
+
function testSelection(name, before, pos, keys, sel) {
return testVim(name, function(cm, vim, helpers) {
var ch = before.search(pos)
From 3e3c21cbe5d10ac14ab69c16da5a0fa035a22b33 Mon Sep 17 00:00:00 2001
From: Haoran Yu
Date: Thu, 30 Jul 2020 15:42:44 +0800
Subject: [PATCH 020/342] [real-world uses] Add CodeMirror-Record (#6360)
---
doc/realworld.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/doc/realworld.html b/doc/realworld.html
index a08d754550..1cde8ace62 100644
--- a/doc/realworld.html
+++ b/doc/realworld.html
@@ -52,6 +52,7 @@ CodeMirror real-world uses
- CodeFights (practice programming)
- CodeMirror Eclipse (embed CM in Eclipse)
- CodeMirror movie (scripted editing demos)
+ - CodeMirror Record (codemirror activity recording and playback)
- CodeMirror2-GWT (Google Web Toolkit wrapper)
- Code Monster & Code Maven (learning environment)
- Codepen (gallery of animations)
From 68d4da261d1e24b744773467b4d06c62c965b34a Mon Sep 17 00:00:00 2001
From: orionlee
Date: Thu, 30 Jul 2020 21:32:35 -0700
Subject: [PATCH 021/342] [real-world uses] Add Violentmonkey
---
doc/realworld.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/doc/realworld.html b/doc/realworld.html
index 1cde8ace62..bb2dc7f8b3 100644
--- a/doc/realworld.html
+++ b/doc/realworld.html
@@ -182,6 +182,7 @@ CodeMirror real-world uses
- TurboPY (web publishing framework)
- UmpleOnline (model-oriented programming tool)
- Upsource (code browser and review tool)
+ - Violentmonkey (userscript manager / editor)
- Waliki (wiki engine)
- Wamer (web application builder)
- webappfind (windows file bindings for webapps)
From 5bff5502c813ef773c0a6a47a7c761d017f0361d Mon Sep 17 00:00:00 2001
From: orionlee
Date: Thu, 30 Jul 2020 20:52:29 -0700
Subject: [PATCH 022/342] [css] add missing 1) property all, 2) media feature
prefers-color-scheme
---
mode/css/css.js | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/mode/css/css.js b/mode/css/css.js
index 441ba4abfd..85f1bdc767 100644
--- a/mode/css/css.js
+++ b/mode/css/css.js
@@ -442,17 +442,18 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
"monochrome", "min-monochrome", "max-monochrome", "resolution",
"min-resolution", "max-resolution", "scan", "grid", "orientation",
"device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio",
- "pointer", "any-pointer", "hover", "any-hover"
+ "pointer", "any-pointer", "hover", "any-hover", "prefers-color-scheme"
], mediaFeatures = keySet(mediaFeatures_);
var mediaValueKeywords_ = [
"landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover",
- "interlace", "progressive"
+ "interlace", "progressive",
+ "dark", "light"
], mediaValueKeywords = keySet(mediaValueKeywords_);
var propertyKeywords_ = [
"align-content", "align-items", "align-self", "alignment-adjust",
- "alignment-baseline", "anchor-point", "animation", "animation-delay",
+ "alignment-baseline", "all", "anchor-point", "animation", "animation-delay",
"animation-direction", "animation-duration", "animation-fill-mode",
"animation-iteration-count", "animation-name", "animation-play-state",
"animation-timing-function", "appearance", "azimuth", "backdrop-filter",
From fd3e439fd07121b58e2efd4b7c92ee1201d9be64 Mon Sep 17 00:00:00 2001
From: Lucas Buchala
Date: Thu, 6 Aug 2020 03:38:54 -0300
Subject: [PATCH 023/342] [mode meta] Escape dot in mode's filename regex
---
mode/meta.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mode/meta.js b/mode/meta.js
index 9f64f41048..d3efdc172f 100644
--- a/mode/meta.js
+++ b/mode/meta.js
@@ -24,7 +24,7 @@
{name: "Clojure", mime: "text/x-clojure", mode: "clojure", ext: ["clj", "cljc", "cljx"]},
{name: "ClojureScript", mime: "text/x-clojurescript", mode: "clojure", ext: ["cljs"]},
{name: "Closure Stylesheets (GSS)", mime: "text/x-gss", mode: "css", ext: ["gss"]},
- {name: "CMake", mime: "text/x-cmake", mode: "cmake", ext: ["cmake", "cmake.in"], file: /^CMakeLists.txt$/},
+ {name: "CMake", mime: "text/x-cmake", mode: "cmake", ext: ["cmake", "cmake.in"], file: /^CMakeLists\.txt$/},
{name: "CoffeeScript", mimes: ["application/vnd.coffeescript", "text/coffeescript", "text/x-coffeescript"], mode: "coffeescript", ext: ["coffee"], alias: ["coffee", "coffee-script"]},
{name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp", ext: ["cl", "lisp", "el"], alias: ["lisp"]},
{name: "Cypher", mime: "application/x-cypher-query", mode: "cypher", ext: ["cyp", "cypher"]},
@@ -55,7 +55,7 @@
{name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"], alias: ["fsharp"]},
{name: "Gas", mime: "text/x-gas", mode: "gas", ext: ["s"]},
{name: "Gherkin", mime: "text/x-feature", mode: "gherkin", ext: ["feature"]},
- {name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm", file: /^(readme|contributing|history).md$/i},
+ {name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm", file: /^(readme|contributing|history)\.md$/i},
{name: "Go", mime: "text/x-go", mode: "go", ext: ["go"]},
{name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy", "gradle"], file: /^Jenkinsfile$/},
{name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"]},
From 26b739ffef2187ce942474cef4a636e9c65f9294 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Fri, 7 Aug 2020 17:44:41 +0200
Subject: [PATCH 024/342] [comment addon] Keep selection in front of closing
marker when block-commenting
... with fullLines==false when the end of the selection is directly on the closing
marker.
Closes #6375
---
addon/comment/comment.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/addon/comment/comment.js b/addon/comment/comment.js
index 8394e85a4d..dac48d0387 100644
--- a/addon/comment/comment.js
+++ b/addon/comment/comment.js
@@ -13,7 +13,7 @@
var noOptions = {};
var nonWS = /[^\s\u00a0]/;
- var Pos = CodeMirror.Pos;
+ var Pos = CodeMirror.Pos, cmp = CodeMirror.cmpPos;
function firstNonWS(str) {
var found = str.search(nonWS);
@@ -126,7 +126,9 @@
if (i != end || lastLineHasText)
self.replaceRange(lead + pad, Pos(i, 0));
} else {
+ var atCursor = cmp(self.getCursor("to"), to) == 0, empty = !self.somethingSelected()
self.replaceRange(endString, to);
+ if (atCursor) self.setSelection(empty ? to : self.getCursor("from"), to)
self.replaceRange(startString, from);
}
});
From def6f5b125a77607085ce17c371e0995be96832a Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Sat, 8 Aug 2020 10:15:34 +0200
Subject: [PATCH 025/342] [julia mode] Make sure dedent tokens end in a word
boundary
Closes #6376
---
mode/julia/julia.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mode/julia/julia.js b/mode/julia/julia.js
index 2aadf36724..f1d2cd5c4b 100644
--- a/mode/julia/julia.js
+++ b/mode/julia/julia.js
@@ -401,8 +401,8 @@ CodeMirror.defineMode("julia", function(config, parserConf) {
indent: function(state, textAfter) {
var delta = 0;
- if ( textAfter === ']' || textAfter === ')' || /^end/.test(textAfter) ||
- /^else/.test(textAfter) || /^catch/.test(textAfter) || /^elseif/.test(textAfter) ||
+ if ( textAfter === ']' || textAfter === ')' || /^end\b/.test(textAfter) ||
+ /^else/.test(textAfter) || /^catch\b/.test(textAfter) || /^elseif\b/.test(textAfter) ||
/^finally/.test(textAfter) ) {
delta = -1;
}
From a2e86b6211518abd2bd1820e4810edf461fdee9a Mon Sep 17 00:00:00 2001
From: orionlee
Date: Sat, 1 Aug 2020 13:14:49 -0700
Subject: [PATCH 026/342] [css mode] Add missing standard property names per
MDN
---
mode/css/css.js | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/mode/css/css.js b/mode/css/css.js
index 85f1bdc767..e7e5dca837 100644
--- a/mode/css/css.js
+++ b/mode/css/css.js
@@ -504,7 +504,9 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
"list-style-image", "list-style-position", "list-style-type", "margin",
"margin-bottom", "margin-left", "margin-right", "margin-top", "marks",
"marquee-direction", "marquee-loop", "marquee-play-count", "marquee-speed",
- "marquee-style", "max-block-size", "max-height", "max-inline-size",
+ "marquee-style", "mask-clip", "mask-composite", "mask-image", "mask-mode",
+ "mask-origin", "mask-position", "mask-repeat", "mask-size","mask-type",
+ "max-block-size", "max-height", "max-inline-size",
"max-width", "min-block-size", "min-height", "min-inline-size", "min-width",
"mix-blend-mode", "move-to", "nav-down", "nav-index", "nav-left", "nav-right",
"nav-up", "object-fit", "object-position", "offset", "offset-anchor",
@@ -541,7 +543,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
"text-height", "text-indent", "text-justify", "text-orientation",
"text-outline", "text-overflow", "text-rendering", "text-shadow",
"text-size-adjust", "text-space-collapse", "text-transform",
- "text-underline-position", "text-wrap", "top", "transform", "transform-origin",
+ "text-underline-position", "text-wrap", "top", "touch-action", "transform", "transform-origin",
"transform-style", "transition", "transition-delay", "transition-duration",
"transition-property", "transition-timing-function", "translate",
"unicode-bidi", "user-select", "vertical-align", "visibility", "voice-balance",
@@ -553,11 +555,11 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
"flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events",
"color-interpolation", "color-interpolation-filters",
"color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering",
- "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke",
+ "marker", "marker-end", "marker-mid", "marker-start", "paint-order", "shape-rendering", "stroke",
"stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin",
"stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering",
"baseline-shift", "dominant-baseline", "glyph-orientation-horizontal",
- "glyph-orientation-vertical", "text-anchor", "writing-mode"
+ "glyph-orientation-vertical", "text-anchor", "writing-mode",
], propertyKeywords = keySet(propertyKeywords_);
var nonStandardPropertyKeywords_ = [
@@ -725,8 +727,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
var maybeEnd = false, ch;
while ((ch = stream.next()) != null) {
if (maybeEnd && ch == "/") {
- state.tokenize = null;
- break;
+ state.tokenize = null; break;
}
maybeEnd = (ch == "*");
}
From 1ac4e320224eb00643129e29f4800edbe77d9f49 Mon Sep 17 00:00:00 2001
From: orionlee
Date: Sat, 1 Aug 2020 14:00:07 -0700
Subject: [PATCH 027/342] [css] missing CSS property values - for mask-image,
mask-origin, touch-action just added
---
mode/css/css.js | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/mode/css/css.js b/mode/css/css.js
index e7e5dca837..77ca0c10e2 100644
--- a/mode/css/css.js
+++ b/mode/css/css.js
@@ -626,7 +626,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
"after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate",
"always", "amharic", "amharic-abegede", "antialiased", "appworkspace",
"arabic-indic", "armenian", "asterisks", "attr", "auto", "auto-flow", "avoid", "avoid-column", "avoid-page",
- "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary",
+ "avoid-region", "axis-pan", "background", "backwards", "baseline", "below", "bidi-override", "binary",
"bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box",
"both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel",
"buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian",
@@ -650,7 +650,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
"ethiopic-halehame-sid-et", "ethiopic-halehame-so-et",
"ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig",
"ethiopic-numeric", "ew-resize", "exclusion", "expanded", "extends", "extra-condensed",
- "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes",
+ "extra-expanded", "fantasy", "fast", "fill", "fill-box", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes",
"forwards", "from", "geometricPrecision", "georgian", "graytext", "grid", "groove",
"gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hard-light", "hebrew",
"help", "hidden", "hide", "higher", "highlight", "highlighttext",
@@ -665,7 +665,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
"line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem",
"local", "logical", "loud", "lower", "lower-alpha", "lower-armenian",
"lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian",
- "lower-roman", "lowercase", "ltr", "luminosity", "malayalam", "match", "matrix", "matrix3d",
+ "lower-roman", "lowercase", "ltr", "luminosity", "malayalam", "manipulation", "match", "matrix", "matrix3d",
"media-controls-background", "media-current-time-display",
"media-fullscreen-button", "media-mute-button", "media-play-button",
"media-return-to-realtime-button", "media-rewind-button",
@@ -674,13 +674,13 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
"media-volume-slider-container", "media-volume-sliderthumb", "medium",
"menu", "menulist", "menulist-button", "menulist-text",
"menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic",
- "mix", "mongolian", "monospace", "move", "multiple", "multiply", "myanmar", "n-resize",
+ "mix", "mongolian", "monospace", "move", "multiple", "multiple_mask_images", "multiply", "myanmar", "n-resize",
"narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop",
"no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap",
"ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "opacity", "open-quote",
"optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset",
"outside", "outside-shape", "overlay", "overline", "padding", "padding-box",
- "painted", "page", "paused", "persian", "perspective", "plus-darker", "plus-lighter",
+ "painted", "page", "paused", "persian", "perspective", "pinch-zoom", "plus-darker", "plus-lighter",
"pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d",
"progress", "push-button", "radial-gradient", "radio", "read-only",
"read-write", "read-write-plaintext-only", "rectangle", "region",
@@ -698,8 +698,8 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
"slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow",
"small", "small-caps", "small-caption", "smaller", "soft-light", "solid", "somali",
"source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "space-evenly", "spell-out", "square",
- "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub",
- "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "system-ui", "table",
+ "square-button", "start", "static", "status-bar", "stretch", "stroke", "stroke-box", "sub",
+ "subpixel-antialiased", "svg_masks", "super", "sw-resize", "symbolic", "symbols", "system-ui", "table",
"table-caption", "table-cell", "table-column", "table-column-group",
"table-footer-group", "table-header-group", "table-row", "table-row-group",
"tamil",
@@ -709,10 +709,10 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
"tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top",
"trad-chinese-formal", "trad-chinese-informal", "transform",
"translate", "translate3d", "translateX", "translateY", "translateZ",
- "transparent", "ultra-condensed", "ultra-expanded", "underline", "unset", "up",
+ "transparent", "ultra-condensed", "ultra-expanded", "underline", "unidirectional-pan", "unset", "up",
"upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal",
"upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url",
- "var", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted",
+ "var", "vertical", "vertical-text", "view-box", "visible", "visibleFill", "visiblePainted",
"visibleStroke", "visual", "w-resize", "wait", "wave", "wider",
"window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor",
"xx-large", "xx-small"
@@ -727,7 +727,8 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
var maybeEnd = false, ch;
while ((ch = stream.next()) != null) {
if (maybeEnd && ch == "/") {
- state.tokenize = null; break;
+ state.tokenize = null;
+ break;
}
maybeEnd = (ch == "*");
}
From 43822831dc670ab1ee18eeb54f4d57ac44b080fc Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Thu, 13 Aug 2020 08:33:21 +0200
Subject: [PATCH 028/342] Document the scrollpastend addon
Closes #6381
---
doc/manual.html | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/doc/manual.html b/doc/manual.html
index ba46c099f0..9c04d7fadf 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -3147,6 +3147,11 @@ Addons
A demo of the addon is available here.
+ scroll/scrollpastend.js
+ - Defines an option `"scrollPastEnd"` that, when set to a
+ truthy value, allows the user to scroll one editor height of
+ empty space into view at the bottom of the editor.
+
merge/merge.js
- Implements an interface for merging changes, using either a
2-way or a 3-way view. The
CodeMirror.MergeView
From 50cd959fe7939eba01d4647d9081976f48df9bb7 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Thu, 13 Aug 2020 09:10:52 +0200
Subject: [PATCH 029/342] Add issue and pr templates that warn about common
problems
---
.github/ISSUE_TEMPLATE.md | 5 +++++
.github/PULL_REQUEST_TEMPLATE.md | 5 +++++
2 files changed, 10 insertions(+)
create mode 100644 .github/ISSUE_TEMPLATE.md
create mode 100644 .github/PULL_REQUEST_TEMPLATE.md
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000000..49e2dcb09d
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000000..ea7cbc75db
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,5 @@
+
From 83b9f82f411274407755f80f403a48448faf81d0 Mon Sep 17 00:00:00 2001
From: "Jan T. Sott"
Date: Fri, 14 Aug 2020 10:12:06 +0200
Subject: [PATCH 030/342] [nsis mode] Add NSIS 3.06 commands
---
mode/nsis/nsis.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mode/nsis/nsis.js b/mode/nsis/nsis.js
index 10816608c1..636940f502 100644
--- a/mode/nsis/nsis.js
+++ b/mode/nsis/nsis.js
@@ -31,7 +31,7 @@ CodeMirror.defineSimpleMode("nsis",{
{regex: /^\s*(?:\!(else|endif|macroend))\b/, token: "keyword", dedent: true},
// Runtime Commands
- {regex: /^\s*(?:Abort|AddBrandingImage|AddSize|AllowRootDirInstall|AllowSkipFiles|AutoCloseWindow|BGFont|BGGradient|BrandingText|BringToFront|Call|CallInstDLL|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|CreateDirectory|CreateFont|CreateShortCut|Delete|DeleteINISec|DeleteINIStr|DeleteRegKey|DeleteRegValue|DetailPrint|DetailsButtonText|DirText|DirVar|DirVerify|EnableWindow|EnumRegKey|EnumRegValue|Exch|Exec|ExecShell|ExecShellWait|ExecWait|ExpandEnvStrings|File|FileBufSize|FileClose|FileErrorText|FileOpen|FileRead|FileReadByte|FileReadUTF16LE|FileReadWord|FileWriteUTF16LE|FileSeek|FileWrite|FileWriteByte|FileWriteWord|FindClose|FindFirst|FindNext|FindWindow|FlushINI|GetCurInstType|GetCurrentAddress|GetDlgItem|GetDLLVersion|GetDLLVersionLocal|GetErrorLevel|GetFileTime|GetFileTimeLocal|GetFullPathName|GetFunctionAddress|GetInstDirError|GetLabelAddress|GetTempFileName|Goto|HideWindow|Icon|IfAbort|IfErrors|IfFileExists|IfRebootFlag|IfSilent|InitPluginsDir|InstallButtonText|InstallColors|InstallDir|InstallDirRegKey|InstProgressFlags|InstType|InstTypeGetText|InstTypeSetText|Int64Cmp|Int64CmpU|Int64Fmt|IntCmp|IntCmpU|IntFmt|IntOp|IntPtrCmp|IntPtrCmpU|IntPtrOp|IsWindow|LangString|LicenseBkColor|LicenseData|LicenseForceSelection|LicenseLangString|LicenseText|LoadAndSetImage|LoadLanguageFile|LockWindow|LogSet|LogText|ManifestDPIAware|ManifestLongPathAware|ManifestMaxVersionTested|ManifestSupportedOS|MessageBox|MiscButtonText|Name|Nop|OutFile|Page|PageCallbacks|PEAddResource|PEDllCharacteristics|PERemoveResource|PESubsysVer|Pop|Push|Quit|ReadEnvStr|ReadINIStr|ReadRegDWORD|ReadRegStr|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|SectionGetFlags|SectionGetInstTypes|SectionGetSize|SectionGetText|SectionIn|SectionSetFlags|SectionSetInstTypes|SectionSetSize|SectionSetText|SendMessage|SetAutoClose|SetBrandingImage|SetCompress|SetCompressor|SetCompressorDictSize|SetCtlColors|SetCurInstType|SetDatablockOptimize|SetDateSave|SetDetailsPrint|SetDetailsView|SetErrorLevel|SetErrors|SetFileAttributes|SetFont|SetOutPath|SetOverwrite|SetRebootFlag|SetRegView|SetShellVarContext|SetSilent|ShowInstDetails|ShowUninstDetails|ShowWindow|SilentInstall|SilentUnInstall|Sleep|SpaceTexts|StrCmp|StrCmpS|StrCpy|StrLen|SubCaption|Unicode|UninstallButtonText|UninstallCaption|UninstallIcon|UninstallSubCaption|UninstallText|UninstPage|UnRegDLL|Var|VIAddVersionKey|VIFileVersion|VIProductVersion|WindowIcon|WriteINIStr|WriteRegBin|WriteRegDWORD|WriteRegExpandStr|WriteRegMultiStr|WriteRegNone|WriteRegStr|WriteUninstaller|XPStyle)\b/, token: "keyword"},
+ {regex: /^\s*(?:Abort|AddBrandingImage|AddSize|AllowRootDirInstall|AllowSkipFiles|AutoCloseWindow|BGFont|BGGradient|BrandingText|BringToFront|Call|CallInstDLL|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|CreateDirectory|CreateFont|CreateShortCut|Delete|DeleteINISec|DeleteINIStr|DeleteRegKey|DeleteRegValue|DetailPrint|DetailsButtonText|DirText|DirVar|DirVerify|EnableWindow|EnumRegKey|EnumRegValue|Exch|Exec|ExecShell|ExecShellWait|ExecWait|ExpandEnvStrings|File|FileBufSize|FileClose|FileErrorText|FileOpen|FileRead|FileReadByte|FileReadUTF16LE|FileReadWord|FileWriteUTF16LE|FileSeek|FileWrite|FileWriteByte|FileWriteWord|FindClose|FindFirst|FindNext|FindWindow|FlushINI|GetCurInstType|GetCurrentAddress|GetDlgItem|GetDLLVersion|GetDLLVersionLocal|GetErrorLevel|GetFileTime|GetFileTimeLocal|GetFullPathName|GetFunctionAddress|GetInstDirError|GetKnownFolderPath|GetLabelAddress|GetTempFileName|Goto|HideWindow|Icon|IfAbort|IfErrors|IfFileExists|IfRebootFlag|IfRtlLanguage|IfShellVarContextAll|IfSilent|InitPluginsDir|InstallButtonText|InstallColors|InstallDir|InstallDirRegKey|InstProgressFlags|InstType|InstTypeGetText|InstTypeSetText|Int64Cmp|Int64CmpU|Int64Fmt|IntCmp|IntCmpU|IntFmt|IntOp|IntPtrCmp|IntPtrCmpU|IntPtrOp|IsWindow|LangString|LicenseBkColor|LicenseData|LicenseForceSelection|LicenseLangString|LicenseText|LoadAndSetImage|LoadLanguageFile|LockWindow|LogSet|LogText|ManifestDPIAware|ManifestLongPathAware|ManifestMaxVersionTested|ManifestSupportedOS|MessageBox|MiscButtonText|Name|Nop|OutFile|Page|PageCallbacks|PEAddResource|PEDllCharacteristics|PERemoveResource|PESubsysVer|Pop|Push|Quit|ReadEnvStr|ReadINIStr|ReadRegDWORD|ReadRegStr|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|SectionGetFlags|SectionGetInstTypes|SectionGetSize|SectionGetText|SectionIn|SectionSetFlags|SectionSetInstTypes|SectionSetSize|SectionSetText|SendMessage|SetAutoClose|SetBrandingImage|SetCompress|SetCompressor|SetCompressorDictSize|SetCtlColors|SetCurInstType|SetDatablockOptimize|SetDateSave|SetDetailsPrint|SetDetailsView|SetErrorLevel|SetErrors|SetFileAttributes|SetFont|SetOutPath|SetOverwrite|SetRebootFlag|SetRegView|SetShellVarContext|SetSilent|ShowInstDetails|ShowUninstDetails|ShowWindow|SilentInstall|SilentUnInstall|Sleep|SpaceTexts|StrCmp|StrCmpS|StrCpy|StrLen|SubCaption|Unicode|UninstallButtonText|UninstallCaption|UninstallIcon|UninstallSubCaption|UninstallText|UninstPage|UnRegDLL|Var|VIAddVersionKey|VIFileVersion|VIProductVersion|WindowIcon|WriteINIStr|WriteRegBin|WriteRegDWORD|WriteRegExpandStr|WriteRegMultiStr|WriteRegNone|WriteRegStr|WriteUninstaller|XPStyle)\b/, token: "keyword"},
{regex: /^\s*(?:Function|PageEx|Section(?:Group)?)\b/, token: "keyword", indent: true},
{regex: /^\s*(?:(Function|PageEx|Section(?:Group)?)End)\b/, token: "keyword", dedent: true},
From 55d04842e2abeeb305d722859cfb8ba18eadd47a Mon Sep 17 00:00:00 2001
From: tokafew420
Date: Tue, 18 Aug 2020 23:05:37 -0400
Subject: [PATCH 031/342] Annotate scrollbar when matches are folded
---
addon/scroll/annotatescrollbar.js | 12 ++++++-
test/annotatescrollbar.js | 55 +++++++++++++++++++++++++++++++
test/index.html | 2 ++
3 files changed, 68 insertions(+), 1 deletion(-)
create mode 100644 test/annotatescrollbar.js
diff --git a/addon/scroll/annotatescrollbar.js b/addon/scroll/annotatescrollbar.js
index 9fe61ec1ff..0eb9e84fa2 100644
--- a/addon/scroll/annotatescrollbar.js
+++ b/addon/scroll/annotatescrollbar.js
@@ -72,10 +72,20 @@
var wrapping = cm.getOption("lineWrapping");
var singleLineH = wrapping && cm.defaultTextHeight() * 1.5;
var curLine = null, curLineObj = null;
+
+ function getFoldLineHandle(pos) {
+ var marks = cm.findMarksAt(pos);
+ for (var i = 0; i < marks.length; ++i) {
+ if (marks[i].collapsed)
+ return marks[i].lines[0];
+ }
+ }
+
function getY(pos, top) {
if (curLine != pos.line) {
curLine = pos.line;
- curLineObj = cm.getLineHandle(curLine);
+ if(!(curLineObj = getFoldLineHandle(pos)))
+ curLineObj = cm.getLineHandle(curLine);
}
if ((curLineObj.widgets && curLineObj.widgets.length) ||
(wrapping && curLineObj.height > singleLineH))
diff --git a/test/annotatescrollbar.js b/test/annotatescrollbar.js
new file mode 100644
index 0000000000..4a4d05333c
--- /dev/null
+++ b/test/annotatescrollbar.js
@@ -0,0 +1,55 @@
+namespace = "annotatescrollbar_";
+
+(function () {
+ function test(name, run, content, query, expected) {
+ return testCM(name, function (cm) {
+ var annotation = cm.annotateScrollbar({
+ listenForChanges: false,
+ className: "CodeMirror-search-match"
+ });
+ var matches = [];
+ var cursor = cm.getSearchCursor(query, CodeMirror.Pos(0, 0));
+ while (cursor.findNext()) {
+ var match = {
+ from: cursor.from(),
+ to: cursor.to()
+ };
+ matches.push(match)
+ }
+
+ if (run) run(cm);
+
+ cm.display.barWidth = 5;
+ annotation.update(matches);
+
+ var annotations = cm.getWrapperElement().getElementsByClassName(annotation.options.className);
+ eq(annotations.length, expected, "Expected " + expected + " annotations on the scrollbar.")
+ }, {
+ value: content,
+ mode: "javascript",
+ foldOptions: {
+ rangeFinder: CodeMirror.fold.brace
+ }
+ });
+ }
+
+ function doFold(cm) {
+ cm.foldCode(cm.getCursor());
+ }
+ var simpleProg = "function foo() {\n\n return \"foo\";\n\n}\n\nfoo();\n";
+ var consecutiveLineMatches = "function foo() {\n return \"foo\";\n}\nfoo();\n";
+ var singleLineMatches = "function foo() { return \"foo\"; }foo();\n";
+
+ // Base case - expect 3 matches and 3 annotations
+ test("simple", null, simpleProg, "foo", 3);
+ // Consecutive line matches are combines into a single annotation - expect 3 matches and 2 annotations
+ test("combineConsecutiveLine", null, consecutiveLineMatches, "foo", 2);
+ // Matches on a single line get a single annotation - expect 3 matches and 1 annotation
+ test("combineSingleLine", null, singleLineMatches, "foo", 1);
+ // Matches within a fold are annotated on the folded line - expect 3 matches and 2 annotations
+ test("simpleFold", doFold, simpleProg, "foo", 2);
+ // Combination of combineConsecutiveLine and simpleFold cases - expect 3 matches and 1 annotation
+ test("foldedMatch", doFold, consecutiveLineMatches, "foo", 1);
+ // Hidden matches within a fold are annotated on the folded line - expect 1 match and 1 annotation
+ test("hiddenMatch", doFold, simpleProg, "return", 1);
+})();
\ No newline at end of file
diff --git a/test/index.html b/test/index.html
index 6566fc436e..3369beac1f 100644
--- a/test/index.html
+++ b/test/index.html
@@ -157,12 +157,14 @@ Test Suite
+
+
diff --git a/keymap/vim.js b/keymap/vim.js
index aca99cfbbe..789e1e55b3 100644
--- a/keymap/vim.js
+++ b/keymap/vim.js
@@ -141,6 +141,8 @@
{ keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, isEdit: true },
{ keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true }},
{ keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true }},
+ { keys: 'gn', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: true }},
+ { keys: 'gN', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: false }},
// Operator-Motion dual commands
{ keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false }},
{ keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true }},
@@ -1576,7 +1578,7 @@
motionArgs.repeat = repeat;
clearInputState(cm);
if (motion) {
- var motionResult = motions[motion](cm, origHead, motionArgs, vim);
+ var motionResult = motions[motion](cm, origHead, motionArgs, vim, inputState);
vim.lastMotion = motions[motion];
if (!motionResult) {
return;
@@ -1774,6 +1776,87 @@
highlightSearchMatches(cm, query);
return findNext(cm, prev/** prev */, query, motionArgs.repeat);
},
+ /**
+ * Find and select the next occurrence of the search query. If the cursor is currently
+ * within a match, then find and select the current match. Otherwise, find the next occurrence in the
+ * appropriate direction.
+ *
+ * This differs from `findNext` in the following ways:
+ *
+ * 1. Instead of only returning the "from", this returns a "from", "to" range.
+ * 2. If the cursor is currently inside a search match, this selects the current match
+ * instead of the next match.
+ * 3. If there is no associated operator, this will turn on visual mode.
+ */
+ findAndSelectNextInclusive: function(cm, _head, motionArgs, vim, prevInputState) {
+ var state = getSearchState(cm);
+ var query = state.getQuery();
+
+ if (!query) {
+ return;
+ }
+
+ var prev = !motionArgs.forward;
+ prev = (state.isReversed()) ? !prev : prev;
+
+ // next: [from, to] | null
+ var next = findNextFromAndToInclusive(cm, prev, query, motionArgs.repeat, vim);
+
+ // No matches.
+ if (!next) {
+ return;
+ }
+
+ // If there's an operator that will be executed, return the selection.
+ if (prevInputState.operator) {
+ return next;
+ }
+
+ // At this point, we know that there is no accompanying operator -- let's
+ // deal with visual mode in order to select an appropriate match.
+
+ var from = next[0];
+ // For whatever reason, when we use the "to" as returned by searchcursor.js directly,
+ // the resulting selection is extended by 1 char. Let's shrink it so that only the
+ // match is selected.
+ var to = Pos(next[1].line, next[1].ch - 1);
+
+ if (vim.visualMode) {
+ // If we were in visualLine or visualBlock mode, get out of it.
+ if (vim.visualLine || vim.visualBlock) {
+ vim.visualLine = false;
+ vim.visualBlock = false;
+ CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: ""});
+ }
+
+ // If we're currently in visual mode, we should extend the selection to include
+ // the search result.
+ var anchor = vim.sel.anchor;
+ if (anchor) {
+ if (state.isReversed()) {
+ if (motionArgs.forward) {
+ return [anchor, from];
+ }
+
+ return [anchor, to];
+ } else {
+ if (motionArgs.forward) {
+ return [anchor, to];
+ }
+
+ return [anchor, from];
+ }
+ }
+ } else {
+ // Let's turn visual mode on.
+ vim.visualMode = true;
+ vim.visualLine = false;
+ vim.visualBlock = false;
+ CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: ""});
+ }
+
+ return prev ? [to, from] : [from, to];
+ },
goToMark: function(cm, _head, motionArgs, vim) {
var pos = getMarkPos(cm, vim, motionArgs.selectedCharacter);
if (pos) {
@@ -1869,8 +1952,8 @@
// move to previous/next line is triggered.
if (line < first && cur.line == first){
return this.moveToStartOfLine(cm, head, motionArgs, vim);
- }else if (line > last && cur.line == last){
- return this.moveToEol(cm, head, motionArgs, vim, true);
+ } else if (line > last && cur.line == last){
+ return moveToEol(cm, head, motionArgs, vim, true);
}
if (motionArgs.toFirstChar){
endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line));
@@ -1972,16 +2055,8 @@
vim.lastHSPos = cm.charCoords(head,'div').left;
return moveToColumn(cm, repeat);
},
- moveToEol: function(cm, head, motionArgs, vim, keepHPos) {
- var cur = head;
- var retval= Pos(cur.line + motionArgs.repeat - 1, Infinity);
- var end=cm.clipPos(retval);
- end.ch--;
- if (!keepHPos) {
- vim.lastHPos = Infinity;
- vim.lastHSPos = cm.charCoords(end,'div').left;
- }
- return retval;
+ moveToEol: function(cm, head, motionArgs, vim) {
+ return moveToEol(cm, head, motionArgs, vim, false);
},
moveToFirstNonWhiteSpaceCharacter: function(cm, head) {
// Go to the start of the line where the text begins, or the end for
@@ -3609,6 +3684,18 @@
}
}
+ function moveToEol(cm, head, motionArgs, vim, keepHPos) {
+ var cur = head;
+ var retval= Pos(cur.line + motionArgs.repeat - 1, Infinity);
+ var end=cm.clipPos(retval);
+ end.ch--;
+ if (!keepHPos) {
+ vim.lastHPos = Infinity;
+ vim.lastHSPos = cm.charCoords(end,'div').left;
+ }
+ return retval;
+ }
+
function moveToCharacter(cm, repeat, forward, character) {
var cur = cm.getCursor();
var start = cur.ch;
@@ -4350,6 +4437,42 @@
return cursor.from();
});
}
+ /**
+ * Pretty much the same as `findNext`, except for the following differences:
+ *
+ * 1. Before starting the search, move to the previous search. This way if our cursor is
+ * already inside a match, we should return the current match.
+ * 2. Rather than only returning the cursor's from, we return the cursor's from and to as a tuple.
+ */
+ function findNextFromAndToInclusive(cm, prev, query, repeat, vim) {
+ if (repeat === undefined) { repeat = 1; }
+ return cm.operation(function() {
+ var pos = cm.getCursor();
+ var cursor = cm.getSearchCursor(query, pos);
+
+ // Go back one result to ensure that if the cursor is currently a match, we keep it.
+ var found = cursor.find(!prev);
+
+ // If we haven't moved, go back one more (similar to if i==0 logic in findNext).
+ if (!vim.visualMode && found && cursorEqual(cursor.from(), pos)) {
+ cursor.find(!prev);
+ }
+
+ for (var i = 0; i < repeat; i++) {
+ found = cursor.find(prev);
+ if (!found) {
+ // SearchCursor may have returned null because it hit EOF, wrap
+ // around and try again.
+ cursor = cm.getSearchCursor(query,
+ (prev) ? Pos(cm.lastLine()) : Pos(cm.firstLine(), 0) );
+ if (!cursor.find(prev)) {
+ return;
+ }
+ }
+ }
+ return [cursor.from(), cursor.to()];
+ });
+ }
function clearSearchHighlight(cm) {
var state = getSearchState(cm);
cm.removeOverlay(getSearchState(cm).getOverlay());
diff --git a/test/vim_test.js b/test/vim_test.js
index 9743041404..c75a1646cf 100644
--- a/test/vim_test.js
+++ b/test/vim_test.js
@@ -2579,6 +2579,91 @@ testVim('/ and n/N', function(cm, vim, helpers) {
helpers.doKeys('2', '/');
helpers.assertCursorAt(1, 6);
}, { value: 'match nope match \n nope Match' });
+testVim('/ and gn selects the appropriate word', function(cm, vim, helpers) {
+ cm.openDialog = helpers.fakeOpenDialog('match');
+ helpers.doKeys('/');
+ helpers.assertCursorAt(0, 11);
+
+ // gn should highlight the the current word while it is within a match.
+
+ // gn when cursor is in beginning of match
+ helpers.doKeys('gn', '');
+ helpers.assertCursorAt(0, 15);
+
+ // gn when cursor is at end of match
+ helpers.doKeys('gn', '');
+ helpers.doKeys('');
+ helpers.assertCursorAt(0, 15);
+
+ // consecutive gns should extend the selection
+ helpers.doKeys('gn');
+ helpers.assertCursorAt(0, 16);
+ helpers.doKeys('gn');
+ helpers.assertCursorAt(1, 11);
+
+ // we should have selected the second and third "match"
+ helpers.doKeys('d');
+ eq('match nope ', cm.getValue());
+}, { value: 'match nope match \n nope Match' });
+testVim('/ and gN selects the appropriate word', function(cm, vim, helpers) {
+ cm.openDialog = helpers.fakeOpenDialog('match');
+ helpers.doKeys('/');
+ helpers.assertCursorAt(0, 11);
+
+ // gN when cursor is at beginning of match
+ helpers.doKeys('gN', '');
+ helpers.assertCursorAt(0, 11);
+
+ // gN when cursor is at end of match
+ helpers.doKeys('e', 'gN', '');
+ helpers.assertCursorAt(0, 11);
+
+ // consecutive gNs should extend the selection
+ helpers.doKeys('gN');
+ helpers.assertCursorAt(0, 11);
+ helpers.doKeys('gN');
+ helpers.assertCursorAt(0, 0);
+
+ // we should have selected the first and second "match"
+ helpers.doKeys('d');
+ eq(' \n nope Match', cm.getValue());
+}, { value: 'match nope match \n nope Match' })
+testVim('/ and gn with an associated operator', function(cm, vim, helpers) {
+ cm.openDialog = helpers.fakeOpenDialog('match');
+ helpers.doKeys('/');
+ helpers.assertCursorAt(0, 11);
+
+ helpers.doKeys('c', 'gn', 'changed', '');
+
+ // change the current match.
+ eq('match nope changed \n nope Match', cm.getValue());
+
+ // change the next match.
+ helpers.doKeys('.');
+ eq('match nope changed \n nope changed', cm.getValue());
+
+ // change the final match.
+ helpers.doKeys('.');
+ eq('changed nope changed \n nope changed', cm.getValue());
+}, { value: 'match nope match \n nope Match' });
+testVim('/ and gN with an associated operator', function(cm, vim, helpers) {
+ cm.openDialog = helpers.fakeOpenDialog('match');
+ helpers.doKeys('/');
+ helpers.assertCursorAt(0, 11);
+
+ helpers.doKeys('c', 'gN', 'changed', '');
+
+ // change the current match.
+ eq('match nope changed \n nope Match', cm.getValue());
+
+ // change the next match.
+ helpers.doKeys('.');
+ eq('changed nope changed \n nope Match', cm.getValue());
+
+ // change the final match.
+ helpers.doKeys('.');
+ eq('changed nope changed \n nope changed', cm.getValue());
+}, { value: 'match nope match \n nope Match' });
testVim('/_case', function(cm, vim, helpers) {
cm.openDialog = helpers.fakeOpenDialog('Match');
helpers.doKeys('/');
@@ -2679,6 +2764,90 @@ testVim('? and n/N', function(cm, vim, helpers) {
helpers.doKeys('2', '?');
helpers.assertCursorAt(0, 11);
}, { value: 'match nope match \n nope Match' });
+testVim('? and gn selects the appropriate word', function(cm, vim, helpers) {
+ cm.openDialog = helpers.fakeOpenDialog('match');
+ helpers.doKeys('?', 'n');
+ helpers.assertCursorAt(0, 11);
+
+ // gn should highlight the the current word while it is within a match.
+
+ // gn when cursor is in beginning of match
+ helpers.doKeys('gn', '');
+ helpers.assertCursorAt(0, 11);
+
+ // gn when cursor is at end of match
+ helpers.doKeys('e', 'gn', '');
+ helpers.assertCursorAt(0, 11);
+
+ // consecutive gns should extend the selection
+ helpers.doKeys('gn');
+ helpers.assertCursorAt(0, 11);
+ helpers.doKeys('gn');
+ helpers.assertCursorAt(0, 0);
+
+ // we should have selected the first and second "match"
+ helpers.doKeys('d');
+ eq(' \n nope Match', cm.getValue());
+}, { value: 'match nope match \n nope Match' });
+testVim('? and gN selects the appropriate word', function(cm, vim, helpers) {
+ cm.openDialog = helpers.fakeOpenDialog('match');
+ helpers.doKeys('?', 'n');
+ helpers.assertCursorAt(0, 11);
+
+ // gN when cursor is at beginning of match
+ helpers.doKeys('gN', '');
+ helpers.assertCursorAt(0, 15);
+
+ // gN when cursor is at end of match
+ helpers.doKeys('gN', '');
+ helpers.assertCursorAt(0, 15);
+
+ // consecutive gNs should extend the selection
+ helpers.doKeys('gN');
+ helpers.assertCursorAt(0, 16);
+ helpers.doKeys('gN');
+ helpers.assertCursorAt(1, 11);
+
+ // we should have selected the second and third "match"
+ helpers.doKeys('d');
+ eq('match nope ', cm.getValue());
+}, { value: 'match nope match \n nope Match' })
+testVim('? and gn with an associated operator', function(cm, vim, helpers) {
+ cm.openDialog = helpers.fakeOpenDialog('match');
+ helpers.doKeys('?', 'n');
+ helpers.assertCursorAt(0, 11);
+
+ helpers.doKeys('c', 'gn', 'changed', '');
+
+ // change the current match.
+ eq('match nope changed \n nope Match', cm.getValue());
+
+ // change the next match.
+ helpers.doKeys('.');
+ eq('changed nope changed \n nope Match', cm.getValue());
+
+ // change the final match.
+ helpers.doKeys('.');
+ eq('changed nope changed \n nope changed', cm.getValue());
+}, { value: 'match nope match \n nope Match' });
+testVim('? and gN with an associated operator', function(cm, vim, helpers) {
+ cm.openDialog = helpers.fakeOpenDialog('match');
+ helpers.doKeys('?', 'n');
+ helpers.assertCursorAt(0, 11);
+
+ helpers.doKeys('c', 'gN', 'changed', '');
+
+ // change the current match.
+ eq('match nope changed \n nope Match', cm.getValue());
+
+ // change the next match.
+ helpers.doKeys('.');
+ eq('match nope changed \n nope changed', cm.getValue());
+
+ // change the final match.
+ helpers.doKeys('.');
+ eq('changed nope changed \n nope changed', cm.getValue());
+}, { value: 'match nope match \n nope Match' });
testVim('*', function(cm, vim, helpers) {
cm.setCursor(0, 9);
helpers.doKeys('*');
From db719a2e37f802e79d5e0abeed58721ed95fbaa9 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Tue, 15 Sep 2020 09:09:24 +0200
Subject: [PATCH 047/342] Fix drawing of marked text with only attributes
Closes #6414
---
src/line/line_data.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/line/line_data.js b/src/line/line_data.js
index 20dd432831..e650b3e306 100644
--- a/src/line/line_data.js
+++ b/src/line/line_data.js
@@ -178,7 +178,7 @@ function buildToken(builder, text, style, startStyle, endStyle, css, attributes)
}
}
builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32
- if (style || startStyle || endStyle || mustWrap || css) {
+ if (style || startStyle || endStyle || mustWrap || css || attributes) {
let fullStyle = style || ""
if (startStyle) fullStyle += startStyle
if (endStyle) fullStyle += endStyle
From 18aa69e17cc7703f106fbe03992456b8e59e8cdc Mon Sep 17 00:00:00 2001
From: Adrian Kunz
Date: Thu, 17 Sep 2020 11:32:20 +0200
Subject: [PATCH 048/342] [lint addon] Use separate CSS classes for common lint
styles
This changes lint.css to be less reliant on the predefined severities
(error and warning), in turn making it easier to define custom ones.
Now all that needs to be done in order to define a new severity, e.g.
`note`, is to add the following CSS:
```css
/* underline */
.CodeMirror-lint-mark-note {
background-image: ...;
}
/* icon */
.CodeMirror-lint-marker-note, .CodeMirror-lint-message-note {
background-image: ...;
}
```
Previously, it was necessary to copy many styles that were only
available under the `CodeMirror-lint-*-error` and
`CodeMirror-lint-*-warning` classes.
---
addon/lint/lint.css | 6 +++---
addon/lint/lint.js | 8 ++++----
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/addon/lint/lint.css b/addon/lint/lint.css
index f097cfe345..fef620a492 100644
--- a/addon/lint/lint.css
+++ b/addon/lint/lint.css
@@ -25,7 +25,7 @@
-ms-transition: opacity .4s;
}
-.CodeMirror-lint-mark-error, .CodeMirror-lint-mark-warning {
+.CodeMirror-lint-mark {
background-position: left bottom;
background-repeat: repeat-x;
}
@@ -40,7 +40,7 @@
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=");
}
-.CodeMirror-lint-marker-error, .CodeMirror-lint-marker-warning {
+.CodeMirror-lint-marker {
background-position: center center;
background-repeat: no-repeat;
cursor: pointer;
@@ -51,7 +51,7 @@
position: relative;
}
-.CodeMirror-lint-message-error, .CodeMirror-lint-message-warning {
+.CodeMirror-lint-message {
padding-left: 18px;
background-position: top left;
background-repeat: no-repeat;
diff --git a/addon/lint/lint.js b/addon/lint/lint.js
index 5bc1af18ae..963f2cf227 100644
--- a/addon/lint/lint.js
+++ b/addon/lint/lint.js
@@ -83,10 +83,10 @@
function makeMarker(cm, labels, severity, multiple, tooltips) {
var marker = document.createElement("div"), inner = marker;
- marker.className = "CodeMirror-lint-marker-" + severity;
+ marker.className = "CodeMirror-lint-marker CodeMirror-lint-marker-" + severity;
if (multiple) {
inner = marker.appendChild(document.createElement("div"));
- inner.className = "CodeMirror-lint-marker-multiple";
+ inner.className = "CodeMirror-lint-marker CodeMirror-lint-marker-multiple";
}
if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) {
@@ -114,7 +114,7 @@
var severity = ann.severity;
if (!severity) severity = "error";
var tip = document.createElement("div");
- tip.className = "CodeMirror-lint-message-" + severity;
+ tip.className = "CodeMirror-lint-message CodeMirror-lint-message-" + severity;
if (typeof ann.messageHTML != 'undefined') {
tip.innerHTML = ann.messageHTML;
} else {
@@ -183,7 +183,7 @@
if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));
if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {
- className: "CodeMirror-lint-mark-" + severity,
+ className: "CodeMirror-lint-mark CodeMirror-lint-mark-" + severity,
__annotation: ann
}));
}
From 376c0d9a9e67f42fa2c77e3529b1740097ea68b3 Mon Sep 17 00:00:00 2001
From: Adrian Kunz
Date: Sun, 20 Sep 2020 14:36:24 +0200
Subject: [PATCH 049/342] [lint addon] Put error CSS after warning
By swapping the CSS rules, the error rules take priority in case there
are markers with both severities on the same token. That token is now
underlined red instead of yellow, making it consistent with how errors
take priority in the gutter.
---
addon/lint/lint.css | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/addon/lint/lint.css b/addon/lint/lint.css
index fef620a492..0871865959 100644
--- a/addon/lint/lint.css
+++ b/addon/lint/lint.css
@@ -30,16 +30,14 @@
background-repeat: repeat-x;
}
-.CodeMirror-lint-mark-error {
- background-image:
- url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==")
- ;
-}
-
.CodeMirror-lint-mark-warning {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=");
}
+.CodeMirror-lint-mark-error {
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==");
+}
+
.CodeMirror-lint-marker {
background-position: center center;
background-repeat: no-repeat;
@@ -57,14 +55,14 @@
background-repeat: no-repeat;
}
-.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {
- background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=");
-}
-
.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=");
}
+.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=");
+}
+
.CodeMirror-lint-marker-multiple {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC");
background-repeat: no-repeat;
From 66a96a567b7b1e3da6319bd933c94b284811f161 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Sun, 20 Sep 2020 19:37:00 +0200
Subject: [PATCH 050/342] Set the readonly attribute on the hidden textarea
when the editor is read-only
This prevents cut/paste from showing up in the context menu on Chrome
(but doesn't help on Firefox).
Closes #6418
---
src/input/TextareaInput.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/input/TextareaInput.js b/src/input/TextareaInput.js
index 8fe14bb413..977eb22723 100644
--- a/src/input/TextareaInput.js
+++ b/src/input/TextareaInput.js
@@ -366,6 +366,7 @@ export default class TextareaInput {
readOnlyChanged(val) {
if (!val) this.reset()
this.textarea.disabled = val == "nocursor"
+ this.textarea.readOnly = !!val
}
setUneditable() {}
From 7b63084691b9c56baf02e5f2c2a9d5aebd435dc1 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Mon, 21 Sep 2020 09:46:57 +0200
Subject: [PATCH 051/342] Update placeholder visibility during composition
Closes #6420:
---
addon/display/placeholder.js | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/addon/display/placeholder.js b/addon/display/placeholder.js
index 4eabe3d901..19e9a3418c 100644
--- a/addon/display/placeholder.js
+++ b/addon/display/placeholder.js
@@ -15,11 +15,13 @@
cm.on("blur", onBlur);
cm.on("change", onChange);
cm.on("swapDoc", onChange);
+ CodeMirror.on(cm.getInputField(), "compositionupdate", cm.state.placeholderCompose = () => onComposition(cm))
onChange(cm);
} else if (!val && prev) {
cm.off("blur", onBlur);
cm.off("change", onChange);
cm.off("swapDoc", onChange);
+ CodeMirror.off(cm.getInputField(), "compositionupdate", cm.state.placeholderCompose)
clearPlaceholder(cm);
var wrapper = cm.getWrapperElement();
wrapper.className = wrapper.className.replace(" CodeMirror-empty", "");
@@ -46,6 +48,16 @@
cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild);
}
+ function onComposition(cm) {
+ var empty = true, input = cm.getInputField()
+ if (input.nodeName == "TEXTAREA")
+ empty = !input.value
+ else if (cm.lineCount() == 1)
+ empty = !/[^\u200b]/.test(input.querySelector(".CodeMirror-line").textContent)
+ if (empty) clearPlaceholder(cm)
+ else setPlaceholder(cm)
+ }
+
function onBlur(cm) {
if (isEmpty(cm)) setPlaceholder(cm);
}
From 76590dcb0683c0ef94c19133d64afe8bb43373ba Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Mon, 21 Sep 2020 09:52:29 +0200
Subject: [PATCH 052/342] Mark version 5.58.0
---
AUTHORS | 3 +++
CHANGELOG.md | 20 ++++++++++++++++++++
doc/manual.html | 2 +-
doc/releases.html | 12 ++++++++++++
index.html | 2 +-
package.json | 2 +-
src/edit/main.js | 2 +-
7 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/AUTHORS b/AUTHORS
index 3fa6199e41..bb017e9574 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -15,6 +15,7 @@ Adán Lobato
Aditya Toshniwal
Adrian Aichner
Adrian Heine
+Adrian Kunz
Adrien Bertrand
aeroson
Ahmad Amireh
@@ -332,6 +333,7 @@ Hiroyuki Makino
hitsthings
Hocdoc
Howard
+Howard Jing
Hugues Malphettes
Ian Beck
Ian Davies
@@ -348,6 +350,7 @@ ilvalle
Ilya Kharlamov
Ilya Zverev
Ingo Richter
+Intervue
Irakli Gozalishvili
Ivan Kurnosov
Ivoah
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8e651ec7ec..782f493af6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,23 @@
+## 5.58.0 (2020-09-21)
+
+### Bug fixes
+
+Make backspace delete by code point, not glyph.
+
+Suppress flickering focus outline when clicking on scrollbars in Chrome.
+
+Fix a bug that prevented attributes added via `markText` from showing up unless the span also had some other styling.
+
+Suppress cut and paste context menu entries in readonly editors in Chrome.
+
+[placeholder addon](https://codemirror.net/doc/manual.html#addon_placeholder): Update placeholder visibility during composition.
+
+### New features
+
+Make it less cumbersome to style new lint message types.
+
+[vim bindings](https://codemirror.net/demo/vim.html): Support black hole register, `gn` and `gN`
+
## 5.57.0 (2020-08-20)
### Bug fixes
diff --git a/doc/manual.html b/doc/manual.html
index 8635a1e060..e193f9929b 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -70,7 +70,7 @@
User manual and reference guide
- version 5.57.0
+ version 5.58.0
CodeMirror is a code-editor component that can be embedded in
diff --git a/doc/releases.html b/doc/releases.html
index 334a0184c6..3e0adcda6e 100644
--- a/doc/releases.html
+++ b/doc/releases.html
@@ -30,6 +30,18 @@
Release notes and version history
Version 5.x
+ 21-09-2020: Version 5.58.0:
+
+
+ - Make backspace delete by code point, not glyph.
+ - Suppress flickering focus outline when clicking on scrollbars in Chrome.
+ - Fix a bug that prevented attributes added via
markText
from showing up unless the span also had some other styling.
+ - Suppress cut and paste context menu entries in readonly editors in Chrome.
+ - placeholder addon: Update placeholder visibility during composition.
+ - Make it less cumbersome to style new lint message types.
+ - vim bindings: Support black hole register,
gn
and gN
+
+
20-08-2020: Version 5.57.0:
diff --git a/index.html b/index.html
index 21fe3ef0eb..b6b595b9c4 100644
--- a/index.html
+++ b/index.html
@@ -99,7 +99,7 @@ This is CodeMirror
- Get the current version:
5.57.0.
+ Get the current version:
5.58.0.
You can see the
code,
read the
release notes,
or study the
user manual.
diff --git a/package.json b/package.json
index faf0ca08b6..4472c6be3d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "codemirror",
- "version": "5.57.0",
+ "version": "5.58.0",
"main": "lib/codemirror.js",
"style": "lib/codemirror.css",
"author": {
diff --git a/src/edit/main.js b/src/edit/main.js
index 64e94929dd..00990e1601 100644
--- a/src/edit/main.js
+++ b/src/edit/main.js
@@ -66,4 +66,4 @@ import { addLegacyProps } from "./legacy.js"
addLegacyProps(CodeMirror)
-CodeMirror.version = "5.57.0"
+CodeMirror.version = "5.58.0"
From c74a1cafc01a7e34af1b19dd4c82ff821c2e1442 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Mon, 21 Sep 2020 09:55:45 +0200
Subject: [PATCH 053/342] Fix use of ES6 in addon
---
addon/display/placeholder.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addon/display/placeholder.js b/addon/display/placeholder.js
index 19e9a3418c..eb8332ac4b 100644
--- a/addon/display/placeholder.js
+++ b/addon/display/placeholder.js
@@ -15,7 +15,7 @@
cm.on("blur", onBlur);
cm.on("change", onChange);
cm.on("swapDoc", onChange);
- CodeMirror.on(cm.getInputField(), "compositionupdate", cm.state.placeholderCompose = () => onComposition(cm))
+ CodeMirror.on(cm.getInputField(), "compositionupdate", cm.state.placeholderCompose = function() { onComposition(cm) })
onChange(cm);
} else if (!val && prev) {
cm.off("blur", onBlur);
From ca046d7d2fe737a0f09b90e2ae455093ca60faa5 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Tue, 22 Sep 2020 21:19:03 +0200
Subject: [PATCH 054/342] [placeholder addon] Fix composition handling
Issue #6422
---
addon/display/placeholder.js | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/addon/display/placeholder.js b/addon/display/placeholder.js
index eb8332ac4b..89bb93f378 100644
--- a/addon/display/placeholder.js
+++ b/addon/display/placeholder.js
@@ -49,13 +49,15 @@
}
function onComposition(cm) {
- var empty = true, input = cm.getInputField()
- if (input.nodeName == "TEXTAREA")
- empty = !input.value
- else if (cm.lineCount() == 1)
- empty = !/[^\u200b]/.test(input.querySelector(".CodeMirror-line").textContent)
- if (empty) clearPlaceholder(cm)
- else setPlaceholder(cm)
+ setTimeout(function() {
+ var empty = false, input = cm.getInputField()
+ if (input.nodeName == "TEXTAREA")
+ empty = !input.value
+ else if (cm.lineCount() == 1)
+ empty = !/[^\u200b]/.test(input.querySelector(".CodeMirror-line").textContent)
+ if (empty) setPlaceholder(cm)
+ else clearPlaceholder(cm)
+ }, 20)
}
function onBlur(cm) {
From 1c60749b6882bd67b2a11a3f2e21cffa5eb4c5d3 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Wed, 23 Sep 2020 10:11:42 +0200
Subject: [PATCH 055/342] Mark version 5.58.1
---
CHANGELOG.md | 6 ++++++
doc/manual.html | 2 +-
doc/releases.html | 8 ++++++++
index.html | 2 +-
package.json | 2 +-
src/edit/main.js | 2 +-
6 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 782f493af6..d3e3fe4223 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 5.58.1 (2020-09-23)
+
+### Bug fixes
+
+[placeholder addon](https://codemirror.net/doc/manual.html#addon_placeholder): Remove arrow function that ended up in the code.
+
## 5.58.0 (2020-09-21)
### Bug fixes
diff --git a/doc/manual.html b/doc/manual.html
index e193f9929b..42ab5491ed 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -70,7 +70,7 @@
User manual and reference guide
- version 5.58.0
+ version 5.58.1
CodeMirror is a code-editor component that can be embedded in
diff --git a/doc/releases.html b/doc/releases.html
index 3e0adcda6e..3b4378f3f1 100644
--- a/doc/releases.html
+++ b/doc/releases.html
@@ -32,6 +32,14 @@
Version 5.x
21-09-2020: Version 5.58.0:
+
+
+ Version 5.x
+
+ 21-09-2020: Version 5.58.0:
+
- Make backspace delete by code point, not glyph.
- Suppress flickering focus outline when clicking on scrollbars in Chrome.
diff --git a/index.html b/index.html
index b6b595b9c4..ff27b925b7 100644
--- a/index.html
+++ b/index.html
@@ -99,7 +99,7 @@ This is CodeMirror
- Get the current version:
5.58.0.
+ Get the current version:
5.58.1.
You can see the
code,
read the
release notes,
or study the
user manual.
diff --git a/package.json b/package.json
index 4472c6be3d..ba8e7fc79d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "codemirror",
- "version": "5.58.0",
+ "version": "5.58.1",
"main": "lib/codemirror.js",
"style": "lib/codemirror.css",
"author": {
diff --git a/src/edit/main.js b/src/edit/main.js
index 00990e1601..4f9152d892 100644
--- a/src/edit/main.js
+++ b/src/edit/main.js
@@ -66,4 +66,4 @@ import { addLegacyProps } from "./legacy.js"
addLegacyProps(CodeMirror)
-CodeMirror.version = "5.58.0"
+CodeMirror.version = "5.58.1"
From f3dde7c60552daea3de7d4141ba9553197f20543 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Sat, 26 Sep 2020 21:56:10 +0200
Subject: [PATCH 056/342] [julia mode] Fix infinite recursion
I couldn't figure out what the original code was intended to do, but
I've tried to fix the problem without changing it more than necessary.
Closes #6428
---
mode/julia/julia.js | 63 +++++++++++++++++++++++----------------------
1 file changed, 32 insertions(+), 31 deletions(-)
diff --git a/mode/julia/julia.js b/mode/julia/julia.js
index f1d2cd5c4b..3942492042 100644
--- a/mode/julia/julia.js
+++ b/mode/julia/julia.js
@@ -255,41 +255,43 @@ CodeMirror.defineMode("julia", function(config, parserConf) {
}
function tokenCallOrDef(stream, state) {
- var match = stream.match(/^(\(\s*)/);
- if (match) {
- if (state.firstParenPos < 0)
- state.firstParenPos = state.scopes.length;
- state.scopes.push('(');
- state.charsAdvanced += match[1].length;
- }
- if (currentScope(state) == '(' && stream.match(/^\)/)) {
- state.scopes.pop();
- state.charsAdvanced += 1;
- if (state.scopes.length <= state.firstParenPos) {
- var isDefinition = stream.match(/^(\s*where\s+[^\s=]+)*\s*?=(?!=)/, false);
- stream.backUp(state.charsAdvanced);
+ for (;;) {
+ var match = stream.match(/^(\(\s*)/), charsAdvanced = 0;
+ if (match) {
+ if (state.firstParenPos < 0)
+ state.firstParenPos = state.scopes.length;
+ state.scopes.push('(');
+ charsAdvanced += match[1].length;
+ }
+ if (currentScope(state) == '(' && stream.match(/^\)/)) {
+ state.scopes.pop();
+ charsAdvanced += 1;
+ if (state.scopes.length <= state.firstParenPos) {
+ var isDefinition = stream.match(/^(\s*where\s+[^\s=]+)*\s*?=(?!=)/, false);
+ stream.backUp(charsAdvanced);
+ state.firstParenPos = -1;
+ state.tokenize = tokenBase;
+ if (isDefinition)
+ return "def";
+ return "builtin";
+ }
+ }
+ // Unfortunately javascript does not support multiline strings, so we have
+ // to undo anything done upto here if a function call or definition splits
+ // over two or more lines.
+ if (stream.match(/^$/g, false)) {
+ stream.backUp(charsAdvanced);
+ while (state.scopes.length > state.firstParenPos)
+ state.scopes.pop();
state.firstParenPos = -1;
- state.charsAdvanced = 0;
state.tokenize = tokenBase;
- if (isDefinition)
- return "def";
return "builtin";
}
+ if (!stream.match(/^[^()]+/)) {
+ stream.next()
+ return null
+ }
}
- // Unfortunately javascript does not support multiline strings, so we have
- // to undo anything done upto here if a function call or definition splits
- // over two or more lines.
- if (stream.match(/^$/g, false)) {
- stream.backUp(state.charsAdvanced);
- while (state.scopes.length > state.firstParenPos)
- state.scopes.pop();
- state.firstParenPos = -1;
- state.charsAdvanced = 0;
- state.tokenize = tokenBase;
- return "builtin";
- }
- state.charsAdvanced += stream.match(/^([^()]*)/)[1].length;
- return state.tokenize(stream, state);
}
function tokenAnnotation(stream, state) {
@@ -383,7 +385,6 @@ CodeMirror.defineMode("julia", function(config, parserConf) {
nestedComments: 0,
nestedGenerators: 0,
nestedParameters: 0,
- charsAdvanced: 0,
firstParenPos: -1
};
},
From 58c553470fe6d65d494d4dbaf471f6ec97f9ab9d Mon Sep 17 00:00:00 2001
From: Nina Pypchenko <22447785+nina-py@users.noreply.github.com>
Date: Mon, 28 Sep 2020 12:11:52 +1000
Subject: [PATCH 057/342] Fixes #6331. Backticks are stripped from SQL query
words before comparison
---
addon/hint/sql-hint.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addon/hint/sql-hint.js b/addon/hint/sql-hint.js
index de84707db3..5b65e29105 100644
--- a/addon/hint/sql-hint.js
+++ b/addon/hint/sql-hint.js
@@ -187,7 +187,7 @@
function eachWord(lineText, f) {
var words = lineText.split(/\s+/)
for (var i = 0; i < words.length; i++)
- if (words[i]) f(words[i].replace(/[,;]/g, ''))
+ if (words[i]) f(words[i].replace(/[`,;]/g, ''))
}
function findTableByAlias(alias, editor) {
From fdc2de3856f928d04fdac222294870edb9ce639b Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Mon, 28 Sep 2020 14:45:21 +0200
Subject: [PATCH 058/342] [tern demo] Use unpkg, now that the URL structure of
ternjs.net changed
---
demo/tern.html | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/demo/tern.html b/demo/tern.html
index c6834e8899..e331fd5cf8 100644
--- a/demo/tern.html
+++ b/demo/tern.html
@@ -13,16 +13,16 @@
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
@@ -109,7 +109,7 @@ Tern Demo
}
var server;
- getURL("//ternjs.net/defs/ecmascript.json", function(err, code) {
+ getURL("https://unpkg.com/tern/defs/ecmascript.json", function(err, code) {
if (err) throw new Error("Request for ecmascript.json: " + err);
server = new CodeMirror.TernServer({defs: [JSON.parse(code)]});
editor.setOption("extraKeys", {
From 8bc57f76383e62e1a03c7d97c9eac74493fdbedc Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Fri, 2 Oct 2020 23:40:06 +0200
Subject: [PATCH 059/342] Remove link to gitter room
It never took off, and I very much prefer communicating through the forum
and bug tracker.
---
README.md | 1 -
1 file changed, 1 deletion(-)
diff --git a/README.md b/README.md
index 2a7b1f5eba..92debf4488 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,6 @@
[![Build Status](https://travis-ci.org/codemirror/CodeMirror.svg)](https://travis-ci.org/codemirror/CodeMirror)
[![NPM version](https://img.shields.io/npm/v/codemirror.svg)](https://www.npmjs.org/package/codemirror)
-[![Join the chat at https://gitter.im/codemirror/CodeMirror](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/codemirror/CodeMirror)
CodeMirror is a versatile text editor implemented in JavaScript for
the browser. It is specialized for editing code, and comes with over
From 719a91275352a5b551b7b450726b056f11d22685 Mon Sep 17 00:00:00 2001
From: Nina Pypchenko <22447785+nina-py@users.noreply.github.com>
Date: Mon, 5 Oct 2020 19:15:49 +1100
Subject: [PATCH 060/342] Fixes #6402. Adds option to turn off highlighting of
non-standard CSS properties
---
mode/css/css.js | 7 ++++---
mode/css/index.html | 6 ++++++
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/mode/css/css.js b/mode/css/css.js
index 77ca0c10e2..240c270a90 100644
--- a/mode/css/css.js
+++ b/mode/css/css.js
@@ -29,7 +29,8 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
valueKeywords = parserConfig.valueKeywords || {},
allowNested = parserConfig.allowNested,
lineComment = parserConfig.lineComment,
- supportsAtComponent = parserConfig.supportsAtComponent === true;
+ supportsAtComponent = parserConfig.supportsAtComponent === true,
+ highlightNonStandardPropertyKeywords = config.highlightNonStandardPropertyKeywords !== false;
var type, override;
function ret(style, tp) { type = tp; return style; }
@@ -197,7 +198,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
override = "property";
return "maybeprop";
} else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {
- override = "string-2";
+ override = highlightNonStandardPropertyKeywords ? "string-2" : "property";
return "maybeprop";
} else if (allowNested) {
override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag";
@@ -291,7 +292,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
else if (propertyKeywords.hasOwnProperty(word))
override = "property";
else if (nonStandardPropertyKeywords.hasOwnProperty(word))
- override = "string-2";
+ override = highlightNonStandardPropertyKeywords ? "string-2" : "property";
else if (valueKeywords.hasOwnProperty(word))
override = "atom";
else if (colorKeywords.hasOwnProperty(word))
diff --git a/mode/css/index.html b/mode/css/index.html
index 6588c408ac..42b327ca66 100644
--- a/mode/css/index.html
+++ b/mode/css/index.html
@@ -68,6 +68,12 @@ CSS mode
});
+ CSS mode supports this option:
+
+ highlightNonStandardPropertyKeywords: boolean
+ - Whether to highlight non-standard CSS property keywords such as
margin-inline
or zoom
(default: true
).
+
+
MIME types defined: text/css
, text/x-scss
(demo), text/x-less
(demo).
Parsing/Highlighting Tests: normal, verbose.
From 1cb6de23c7e2b965201972ac5c6dcd2317e9eacf Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Mon, 5 Oct 2020 14:05:36 +0200
Subject: [PATCH 061/342] Fix doc/releases.html copy-paste mistake
---
doc/releases.html | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/doc/releases.html b/doc/releases.html
index 3b4378f3f1..0b466970fc 100644
--- a/doc/releases.html
+++ b/doc/releases.html
@@ -30,14 +30,12 @@ Release notes and version history
Version 5.x
- 21-09-2020: Version 5.58.0:
+ 21-09-2020: Version 5.58.1:
- Version 5.x
-
21-09-2020: Version 5.58.0:
From cdb228ac736369c685865b122b736cd0d397836c Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Fri, 9 Oct 2020 10:00:16 +0200
Subject: [PATCH 062/342] Fix horizontal scrolling-into-view with non-fixed
gutters
Closes #6436
---
src/display/scrolling.js | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/display/scrolling.js b/src/display/scrolling.js
index 6d97247d92..75d6fc7ee4 100644
--- a/src/display/scrolling.js
+++ b/src/display/scrolling.js
@@ -91,14 +91,15 @@ function calculateScrollPos(cm, rect) {
if (newTop != screentop) result.scrollTop = newTop
}
- let screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft
- let screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0)
+ let gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth
+ let screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace
+ let screenw = displayWidth(cm) - display.gutters.offsetWidth
let tooWide = rect.right - rect.left > screenw
if (tooWide) rect.right = rect.left + screenw
if (rect.left < 10)
result.scrollLeft = 0
else if (rect.left < screenleft)
- result.scrollLeft = Math.max(0, rect.left - (tooWide ? 0 : 10))
+ result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10))
else if (rect.right > screenw + screenleft - 3)
result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw
return result
From 55d0333907117c9231ffdf555ae8824705993bbb Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Fri, 9 Oct 2020 15:38:39 +0200
Subject: [PATCH 063/342] [javascript mode] Fix potentially-exponential regexp
---
mode/javascript/javascript.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mode/javascript/javascript.js b/mode/javascript/javascript.js
index 66e5a308d4..3139fd00d2 100644
--- a/mode/javascript/javascript.js
+++ b/mode/javascript/javascript.js
@@ -126,7 +126,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
var kw = keywords[word]
return ret(kw.type, kw.style, word)
}
- if (word == "async" && stream.match(/^(\s|\/\*.*?\*\/)*[\[\(\w]/, false))
+ if (word == "async" && stream.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/, false))
return ret("async", "keyword", word)
}
return ret("variable", "variable", word)
From 9caacec1900d71a971561147ba1e8acb2f08609c Mon Sep 17 00:00:00 2001
From: Mark Boyes
Date: Thu, 15 Oct 2020 21:06:38 +0100
Subject: [PATCH 064/342] [sparql mode] Improve parsing of IRI atoms
* Do not treat the opening '<' of an expanded IRI atom as an operator
The existing code would not highlight the IRI atom "" in the following line as an atom.
FILTER( ?x = "42"^^ )
for example everything after the # would be highlighted as a comment. This is because the sequence "^^<" while all "operator characters", are not all SPARQL operators in this case: the "<" introduces the IRI atom. I special-case the "^^".
* Improve PN_LOCAL parsing to SPARQL 1.1
The following legal sequences of characters from SPARQL 1.1 are additionally parsed as being the right-hand-side of a prefixed IRI.
1) Colons
2) PERCENT escaping
3) PN_LOCAL_ESCAPE escaping
---
mode/sparql/sparql.js | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/mode/sparql/sparql.js b/mode/sparql/sparql.js
index bb79abff7f..73997c667f 100644
--- a/mode/sparql/sparql.js
+++ b/mode/sparql/sparql.js
@@ -60,12 +60,18 @@ CodeMirror.defineMode("sparql", function(config) {
stream.skipToEnd();
return "comment";
}
+ else if (ch === "^") {
+ ch = stream.peek();
+ if (ch === "^") stream.eat("^");
+ else stream.eatWhile(operatorChars);
+ return "operator";
+ }
else if (operatorChars.test(ch)) {
stream.eatWhile(operatorChars);
return "operator";
}
else if (ch == ":") {
- stream.eatWhile(/[\w\d\._\-]/);
+ eatPnLocal(stream);
return "atom";
}
else if (ch == "@") {
@@ -75,7 +81,7 @@ CodeMirror.defineMode("sparql", function(config) {
else {
stream.eatWhile(/[_\w\d]/);
if (stream.eat(":")) {
- stream.eatWhile(/[\w\d_\-]/);
+ eatPnLocal(stream);
return "atom";
}
var word = stream.current();
@@ -88,6 +94,10 @@ CodeMirror.defineMode("sparql", function(config) {
}
}
+ function eatPnLocal(stream) {
+ while (stream.match(/([:\w\d._-]|\\[-\\_~.!$&'()*+,;=/?#@%]|%[a-fA-F0-9][a-fA-F0-9])/));
+ }
+
function tokenLiteral(quote) {
return function(stream, state) {
var escaped = false, ch;
From 9885241fe9dee2415f988d3a3619421f45ce8c6b Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Fri, 16 Oct 2020 09:53:55 +0200
Subject: [PATCH 065/342] [javascript mode] Don't indent in template strings
Closes #6442
---
mode/javascript/javascript.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mode/javascript/javascript.js b/mode/javascript/javascript.js
index 3139fd00d2..63eaa241b7 100644
--- a/mode/javascript/javascript.js
+++ b/mode/javascript/javascript.js
@@ -868,7 +868,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
},
indent: function(state, textAfter) {
- if (state.tokenize == tokenComment) return CodeMirror.Pass;
+ if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass;
if (state.tokenize != tokenBase) return 0;
var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top
// Kludge to prevent 'maybelse' from blocking lexical scope pops
From 212bafa8ab7837abebc1d326ed943540a9a47200 Mon Sep 17 00:00:00 2001
From: tophf
Date: Thu, 22 Oct 2020 14:42:10 +0300
Subject: [PATCH 066/342] [stylus mode] Recognize "url-prefix" token properly
---
mode/stylus/stylus.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/mode/stylus/stylus.js b/mode/stylus/stylus.js
index 653958e83b..281118efee 100644
--- a/mode/stylus/stylus.js
+++ b/mode/stylus/stylus.js
@@ -731,7 +731,8 @@
var tagKeywords_ = ["a","abbr","address","area","article","aside","audio", "b", "base","bdi", "bdo","bgsound","blockquote","body","br","button","canvas","caption","cite", "code","col","colgroup","data","datalist","dd","del","details","dfn","div", "dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1", "h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe", "img","input","ins","kbd","keygen","label","legend","li","link","main","map", "mark","marquee","menu","menuitem","meta","meter","nav","nobr","noframes", "noscript","object","ol","optgroup","option","output","p","param","pre", "progress","q","rp","rt","ruby","s","samp","script","section","select", "small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track", "u","ul","var","video"];
// github.com/codemirror/CodeMirror/blob/master/mode/css/css.js
- var documentTypes_ = ["domain", "regexp", "url", "url-prefix"];
+ // Note, "url-prefix" should precede "url" in order to match correctly in documentTypesRegexp
+ var documentTypes_ = ["domain", "regexp", "url-prefix", "url"];
var mediaTypes_ = ["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"];
var mediaFeatures_ = ["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid"];
var propertyKeywords_ = ["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode","font-smoothing","osx-font-smoothing"];
From 23b7a9924b5f9460a091e97392dd00d3834e8cc6 Mon Sep 17 00:00:00 2001
From: "David R. Myers"
Date: Fri, 23 Oct 2020 15:12:03 -0400
Subject: [PATCH 067/342] Add WebAssembly to meta
---
mode/meta.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/mode/meta.js b/mode/meta.js
index d3efdc172f..c7738a514c 100644
--- a/mode/meta.js
+++ b/mode/meta.js
@@ -169,7 +169,8 @@
{name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]},
{name: "mscgen", mime: "text/x-mscgen", mode: "mscgen", ext: ["mscgen", "mscin", "msc"]},
{name: "xu", mime: "text/x-xu", mode: "mscgen", ext: ["xu"]},
- {name: "msgenny", mime: "text/x-msgenny", mode: "mscgen", ext: ["msgenny"]}
+ {name: "msgenny", mime: "text/x-msgenny", mode: "mscgen", ext: ["msgenny"]},
+ {name: "WebAssembly", mime: "text/webassembly", mode: "wast", ext: ["wat", "wast"]},
];
// Ensure all modes have a mime property for backwards compatibility
for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
From 264022ee4af4abca1c158944dc299a8faf8696d6 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Mon, 26 Oct 2020 09:08:51 +0100
Subject: [PATCH 068/342] Mark version 5.58.2
---
AUTHORS | 3 +++
CHANGELOG.md | 8 ++++++++
doc/manual.html | 2 +-
doc/releases.html | 7 +++++++
index.html | 2 +-
package.json | 2 +-
src/edit/main.js | 2 +-
7 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/AUTHORS b/AUTHORS
index bb017e9574..b8087133a8 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -208,6 +208,7 @@ David Barnett
David H. Bronke
David Mignot
David Pathakjee
+David R. Myers
David Rodrigues
David Santana
David Vázquez
@@ -524,6 +525,7 @@ Marijn Haverbeke
Mário Gonçalves
Mario Pietsch
Mark Anderson
+Mark Boyes
Mark Dalgleish
Mark Hamstra
Mark Lentczner
@@ -634,6 +636,7 @@ Nikolaj Kappler
Nikolay Kostov
nilp0inter
Nils Knappmeier
+Nina Pypchenko
Nisarg Jhaveri
nlwillia
noragrossman
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d3e3fe4223..80200fc784 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 5.58.2 (2020-10-23)
+
+### Bug fixes
+
+Fix a bug where horizontally scrolling the cursor into view sometimes failed with a non-fixed gutter.
+
+[julia mode](https://codemirror.net/mode/julia/): Fix an infinite recursion bug.
+
## 5.58.1 (2020-09-23)
### Bug fixes
diff --git a/doc/manual.html b/doc/manual.html
index 42ab5491ed..1da41d3ccb 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -70,7 +70,7 @@
User manual and reference guide
- version 5.58.1
+ version 5.58.2
CodeMirror is a code-editor component that can be embedded in
diff --git a/doc/releases.html b/doc/releases.html
index 0b466970fc..bdf24ed2f7 100644
--- a/doc/releases.html
+++ b/doc/releases.html
@@ -30,6 +30,13 @@
Release notes and version history
Version 5.x
+ 23-10-2020: Version 5.58.2:
+
+
+ - Fix a bug where horizontally scrolling the cursor into view sometimes failed with a non-fixed gutter.
+ - julia mode: Fix an infinite recursion bug.
+
+
21-09-2020: Version 5.58.1:
diff --git a/index.html b/index.html
index ff27b925b7..6d41dcc79e 100644
--- a/index.html
+++ b/index.html
@@ -99,7 +99,7 @@ This is CodeMirror
- Get the current version:
5.58.1.
+ Get the current version:
5.58.2.
You can see the
code,
read the
release notes,
or study the
user manual.
diff --git a/package.json b/package.json
index ba8e7fc79d..2103e1c325 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "codemirror",
- "version": "5.58.1",
+ "version": "5.58.2",
"main": "lib/codemirror.js",
"style": "lib/codemirror.css",
"author": {
diff --git a/src/edit/main.js b/src/edit/main.js
index 4f9152d892..800ee766f2 100644
--- a/src/edit/main.js
+++ b/src/edit/main.js
@@ -66,4 +66,4 @@ import { addLegacyProps } from "./legacy.js"
addLegacyProps(CodeMirror)
-CodeMirror.version = "5.58.1"
+CodeMirror.version = "5.58.2"
From 138d1b75791f8bb0b9a07fd19cbc2bb81e13dd8f Mon Sep 17 00:00:00 2001
From: tophf
Date: Wed, 28 Oct 2020 21:30:38 +0300
Subject: [PATCH 069/342] [stylus mode] allow block comments
---
mode/stylus/stylus.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/mode/stylus/stylus.js b/mode/stylus/stylus.js
index 281118efee..eecc554bc0 100644
--- a/mode/stylus/stylus.js
+++ b/mode/stylus/stylus.js
@@ -722,6 +722,9 @@
return indent;
},
electricChars: "}",
+ blockCommentStart: "/*",
+ blockCommentEnd: "*/",
+ blockCommentContinue: " * ",
lineComment: "//",
fold: "indent"
};
From 4fddb355dead97ca7fc3e096ea5eb0ade62b306d Mon Sep 17 00:00:00 2001
From: Phil DeJarnett
Date: Thu, 29 Oct 2020 15:27:22 -0400
Subject: [PATCH 070/342] [xml-hint addon] Replace nested function with
function expression
---
addon/hint/xml-hint.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/addon/hint/xml-hint.js b/addon/hint/xml-hint.js
index 543d19b61c..2b3153124e 100644
--- a/addon/hint/xml-hint.js
+++ b/addon/hint/xml-hint.js
@@ -101,12 +101,12 @@
}
replaceToken = true;
}
- function returnHintsFromAtValues(atValues) {
+ var returnHintsFromAtValues = function(atValues) {
if (atValues)
for (var i = 0; i < atValues.length; ++i) if (!prefix || matches(atValues[i], prefix, matchInMiddle))
result.push(quote + atValues[i] + quote);
return returnHints();
- }
+ };
if (atValues && atValues.then) return atValues.then(returnHintsFromAtValues);
return returnHintsFromAtValues(atValues);
} else { // An attribute name
From 230cc2e3f70d3e4fc55617437fd4f4995e6817a5 Mon Sep 17 00:00:00 2001
From: iteriani
Date: Fri, 30 Oct 2020 00:39:51 -0700
Subject: [PATCH 071/342] [soy mode] Add support for Element Composition
Add support for Soy Element Composition. It has the syntax in the form of
<{foo()}>>
This adds support to pass through allowEmptyTag and to support this mode in closetag.
---
mode/htmlmixed/htmlmixed.js | 3 ++-
mode/soy/soy.js | 4 +++-
mode/soy/test.js | 16 ++++++++++++++++
mode/xml/xml.js | 4 ++--
4 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/mode/htmlmixed/htmlmixed.js b/mode/htmlmixed/htmlmixed.js
index 8341ac8261..66a158274c 100644
--- a/mode/htmlmixed/htmlmixed.js
+++ b/mode/htmlmixed/htmlmixed.js
@@ -74,7 +74,8 @@
name: "xml",
htmlMode: true,
multilineTagIndentFactor: parserConfig.multilineTagIndentFactor,
- multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag
+ multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag,
+ allowMissingTagName: parserConfig.allowMissingTagName,
});
var tags = {};
diff --git a/mode/soy/soy.js b/mode/soy/soy.js
index d31c947eed..bd3d947145 100644
--- a/mode/soy/soy.js
+++ b/mode/soy/soy.js
@@ -16,6 +16,8 @@
"alias": { noEndTag: true },
"delpackage": { noEndTag: true },
"namespace": { noEndTag: true, soyState: "namespace-def" },
+ "@attribute": paramData,
+ "@attribute?": paramData,
"@param": paramData,
"@param?": paramData,
"@inject": paramData,
@@ -53,7 +55,7 @@
CodeMirror.defineMode("soy", function(config) {
var textMode = CodeMirror.getMode(config, "text/plain");
var modes = {
- html: CodeMirror.getMode(config, {name: "text/html", multilineTagIndentFactor: 2, multilineTagIndentPastTag: false}),
+ html: CodeMirror.getMode(config, {name: "text/html", multilineTagIndentFactor: 2, multilineTagIndentPastTag: false, allowMissingTagName: true}),
attributes: textMode,
text: textMode,
uri: textMode,
diff --git a/mode/soy/test.js b/mode/soy/test.js
index 57cd4be477..78faddb9aa 100644
--- a/mode/soy/test.js
+++ b/mode/soy/test.js
@@ -26,6 +26,10 @@
'[keyword {] [callee&variable index]([variable-2&error $list])[keyword }]' +
'[string "][tag&bracket />]');
+ MT('soy-element-composition-test',
+ '[tag&bracket <][keyword {][callee&variable foo]()[keyword }]',
+ '[tag&bracket >>]');
+
MT('namespace-test',
'[keyword {namespace] [variable namespace][keyword }]')
@@ -176,6 +180,18 @@
'[keyword {/template}]',
'');
+ MT('attribute-type',
+ '[keyword {template] [def .foo][keyword }]',
+ ' [keyword {@attribute] [def bar]: [type string][keyword }]',
+ '[keyword {/template}]',
+ '');
+
+ MT('attribute-type-optional',
+ '[keyword {template] [def .foo][keyword }]',
+ ' [keyword {@attribute] [def bar]: [type string][keyword }]',
+ '[keyword {/template}]',
+ '');
+
MT('state-variable-reference',
'[keyword {template] [def .foo][keyword }]',
' [keyword {@param] [def bar]:= [atom true][keyword }]',
diff --git a/mode/xml/xml.js b/mode/xml/xml.js
index 73c6e0e0dd..46806ac425 100644
--- a/mode/xml/xml.js
+++ b/mode/xml/xml.js
@@ -189,7 +189,7 @@ CodeMirror.defineMode("xml", function(editorConf, config_) {
function Context(state, tagName, startOfLine) {
this.prev = state.context;
- this.tagName = tagName;
+ this.tagName = tagName || "";
this.indent = state.indented;
this.startOfLine = startOfLine;
if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))
@@ -399,7 +399,7 @@ CodeMirror.defineMode("xml", function(editorConf, config_) {
xmlCurrentContext: function(state) {
var context = []
for (var cx = state.context; cx; cx = cx.prev)
- if (cx.tagName) context.push(cx.tagName)
+ context.push(cx.tagName)
return context.reverse()
}
};
From 8e7f6728bf1d36963fafdf997b12858f25d7711a Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Mon, 26 Oct 2020 09:08:36 +0100
Subject: [PATCH 072/342] Delay blur events during dragging and clicking
Issue #6427
---
src/display/focus.js | 9 ++++++---
src/edit/mouse_events.js | 10 ++++++----
2 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/src/display/focus.js b/src/display/focus.js
index aa731b4353..0337327e12 100644
--- a/src/display/focus.js
+++ b/src/display/focus.js
@@ -4,19 +4,22 @@ import { addClass, rmClass } from "../util/dom.js"
import { signal } from "../util/event.js"
export function ensureFocus(cm) {
- if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm) }
+ if (!cm.hasFocus()) {
+ cm.display.input.focus()
+ if (!cm.state.focused) onFocus(cm)
+ }
}
export function delayBlurEvent(cm) {
cm.state.delayingBlurEvent = true
setTimeout(() => { if (cm.state.delayingBlurEvent) {
cm.state.delayingBlurEvent = false
- onBlur(cm)
+ if (cm.state.focused) onBlur(cm)
} }, 100)
}
export function onFocus(cm, e) {
- if (cm.state.delayingBlurEvent) cm.state.delayingBlurEvent = false
+ if (cm.state.delayingBlurEvent && !cm.state.draggingText) cm.state.delayingBlurEvent = false
if (cm.options.readOnly == "nocursor") return
if (!cm.state.focused) {
diff --git a/src/edit/mouse_events.js b/src/edit/mouse_events.js
index 5fcc437021..1c820fdb6e 100644
--- a/src/edit/mouse_events.js
+++ b/src/edit/mouse_events.js
@@ -1,4 +1,4 @@
-import { delayBlurEvent, ensureFocus } from "../display/focus.js"
+import { delayBlurEvent, ensureFocus, onBlur } from "../display/focus.js"
import { operation } from "../display/operations.js"
import { visibleLines } from "../display/update_lines.js"
import { clipPos, cmp, maxPos, minPos, Pos } from "../line/pos.js"
@@ -149,6 +149,7 @@ function leftButtonStartDrag(cm, event, pos, behavior) {
let dragEnd = operation(cm, e => {
if (webkit) display.scroller.draggable = false
cm.state.draggingText = false
+ if (cm.state.delayingBlurEvent) delayBlurEvent(cm)
off(display.wrapper.ownerDocument, "mouseup", dragEnd)
off(display.wrapper.ownerDocument, "mousemove", mouseMove)
off(display.scroller, "dragstart", dragStart)
@@ -172,15 +173,15 @@ function leftButtonStartDrag(cm, event, pos, behavior) {
if (webkit) display.scroller.draggable = true
cm.state.draggingText = dragEnd
dragEnd.copy = !behavior.moveOnDrag
- // IE's approach to draggable
- if (display.scroller.dragDrop) display.scroller.dragDrop()
on(display.wrapper.ownerDocument, "mouseup", dragEnd)
on(display.wrapper.ownerDocument, "mousemove", mouseMove)
on(display.scroller, "dragstart", dragStart)
on(display.scroller, "drop", dragEnd)
- delayBlurEvent(cm)
+ cm.state.delayingBlurEvent = true
setTimeout(() => display.input.focus(), 20)
+ // IE's approach to draggable
+ if (display.scroller.dragDrop) display.scroller.dragDrop()
}
function rangeForUnit(cm, pos, unit) {
@@ -193,6 +194,7 @@ function rangeForUnit(cm, pos, unit) {
// Normal selection, as opposed to text dragging.
function leftButtonSelect(cm, event, start, behavior) {
+ if (ie) delayBlurEvent(cm)
let display = cm.display, doc = cm.doc
e_preventDefault(event)
From f006f3d867c62813309a6f16f5fc242092a73b7b Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Wed, 4 Nov 2020 16:30:32 +0100
Subject: [PATCH 073/342] Remove unused import
---
src/edit/mouse_events.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/edit/mouse_events.js b/src/edit/mouse_events.js
index 1c820fdb6e..401eadf431 100644
--- a/src/edit/mouse_events.js
+++ b/src/edit/mouse_events.js
@@ -1,4 +1,4 @@
-import { delayBlurEvent, ensureFocus, onBlur } from "../display/focus.js"
+import { delayBlurEvent, ensureFocus } from "../display/focus.js"
import { operation } from "../display/operations.js"
import { visibleLines } from "../display/update_lines.js"
import { clipPos, cmp, maxPos, minPos, Pos } from "../line/pos.js"
From 57ba96eb392401d209b63dd187f2f2c087f1885b Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Thu, 5 Nov 2020 09:03:33 +0100
Subject: [PATCH 074/342] Fix handling of insertAt option to addLineWidget
Issue #6460
---
src/model/line_widget.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/model/line_widget.js b/src/model/line_widget.js
index 5444d89df0..f94727e5f8 100644
--- a/src/model/line_widget.js
+++ b/src/model/line_widget.js
@@ -63,7 +63,7 @@ export function addLineWidget(doc, handle, node, options) {
changeLine(doc, handle, "widget", line => {
let widgets = line.widgets || (line.widgets = [])
if (widget.insertAt == null) widgets.push(widget)
- else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget)
+ else widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget)
widget.line = line
if (cm && !lineIsHidden(doc, line)) {
let aboveVisible = heightAtLine(line) < doc.scrollTop
From 6ba05b288eb2fb948653b597f6f7f11770bb9aef Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Thu, 12 Nov 2020 09:28:39 +0100
Subject: [PATCH 075/342] [shell mode] Add support for Bash-style heredoc
quoting
Closes #6468
---
mode/shell/shell.js | 15 +++++++++++++++
mode/shell/test.js | 15 +++++++++++----
2 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/mode/shell/shell.js b/mode/shell/shell.js
index 5af12413b0..2bc1eaf948 100644
--- a/mode/shell/shell.js
+++ b/mode/shell/shell.js
@@ -70,6 +70,13 @@ CodeMirror.defineMode('shell', function() {
stream.eatWhile(/\w/);
return 'attribute';
}
+ if (ch == "<") {
+ let heredoc = stream.match(/^<-?\s+(.*)/)
+ if (heredoc) {
+ state.tokens.unshift(tokenHeredoc(heredoc[1]))
+ return 'string-2'
+ }
+ }
if (/\d/.test(ch)) {
stream.eatWhile(/\d/);
if(stream.eol() || !/\w/.test(stream.peek())) {
@@ -129,6 +136,14 @@ CodeMirror.defineMode('shell', function() {
return 'def';
};
+ function tokenHeredoc(delim) {
+ return function(stream, state) {
+ if (stream.sol() && stream.string == delim) state.tokens.shift()
+ stream.skipToEnd()
+ return "string-2"
+ }
+ }
+
function tokenize(stream, state) {
return (state.tokens[0] || tokenBase) (stream, state);
};
diff --git a/mode/shell/test.js b/mode/shell/test.js
index 7571d907de..237375d451 100644
--- a/mode/shell/test.js
+++ b/mode/shell/test.js
@@ -65,9 +65,16 @@
MT("strings in parens",
"[def FOO][operator =]([quote $(<][string \"][def $MYDIR][string \"][quote /myfile grep ][string 'hello$'][quote )])")
- MT ("string ending in dollar",
- '[def a][operator =][string "xyz$"]; [def b][operator =][string "y"]')
+ MT("string ending in dollar",
+ '[def a][operator =][string "xyz$"]; [def b][operator =][string "y"]')
- MT ("quote ending in dollar",
- "[quote $(echo a$)]")
+ MT("quote ending in dollar",
+ "[quote $(echo a$)]")
+
+ MT("heredoc",
+ "[builtin cat] [string-2 <<- end]",
+ "[string-2 content one]",
+ "[string-2 content two end]",
+ "[string-2 end]",
+ "[builtin echo]")
})();
From ffc17920ed39779f3a18b3f6333bbf6a2bc3a537 Mon Sep 17 00:00:00 2001
From: Christopher Wallis
Date: Thu, 12 Nov 2020 01:43:36 -0700
Subject: [PATCH 076/342] [soy mode] Add support for {@attribute *}
- forks the state at param-def to detect * as a type
---
mode/soy/soy.js | 5 +++++
mode/soy/test.js | 6 ++++++
2 files changed, 11 insertions(+)
diff --git a/mode/soy/soy.js b/mode/soy/soy.js
index bd3d947145..cac59bb3df 100644
--- a/mode/soy/soy.js
+++ b/mode/soy/soy.js
@@ -276,6 +276,11 @@
return null;
case "param-def":
+ if (match = stream.match(/^\*/)) {
+ state.soyState.pop();
+ state.soyState.push("param-type");
+ return "type";
+ }
if (match = stream.match(/^\w+/)) {
state.variables = prepend(state.variables, match[0]);
state.soyState.pop();
diff --git a/mode/soy/test.js b/mode/soy/test.js
index 78faddb9aa..8c764c7a2b 100644
--- a/mode/soy/test.js
+++ b/mode/soy/test.js
@@ -192,6 +192,12 @@
'[keyword {/template}]',
'');
+ MT('attribute-type-all',
+ '[keyword {template] [def .foo][keyword }]',
+ ' [keyword {@attribute] [type *][keyword }]',
+ '[keyword {/template}]',
+ '');
+
MT('state-variable-reference',
'[keyword {template] [def .foo][keyword }]',
' [keyword {@param] [def bar]:= [atom true][keyword }]',
From eb345ef70e75805bf7d7d02b9d87c30ec1db2937 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Fri, 13 Nov 2020 10:06:33 +0100
Subject: [PATCH 077/342] Fix lint error
---
mode/shell/shell.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mode/shell/shell.js b/mode/shell/shell.js
index 2bc1eaf948..2b0d8a91bc 100644
--- a/mode/shell/shell.js
+++ b/mode/shell/shell.js
@@ -71,7 +71,7 @@ CodeMirror.defineMode('shell', function() {
return 'attribute';
}
if (ch == "<") {
- let heredoc = stream.match(/^<-?\s+(.*)/)
+ var heredoc = stream.match(/^<-?\s+(.*)/)
if (heredoc) {
state.tokens.unshift(tokenHeredoc(heredoc[1]))
return 'string-2'
From dda3f9d6b8d2450b87b619ed5db761cb20b892b8 Mon Sep 17 00:00:00 2001
From: iteriani
Date: Fri, 13 Nov 2020 01:08:19 -0800
Subject: [PATCH 078/342] [soy mode] Natively support Soy Element Composition
* Add support for Soy Element Composition.
Add support for Soy Element Composition. It has the syntax in the form of
<{foo()}>>
This adds support to pass through allowEmptyTag and to support this mode in closetag.
* Disable allowMissingTagName and handle Soy Element Composition directly.
Disable allowMissingTagName and handle Soy Element Composition directly. This also adds a case in closetag.js to handle autocompletes for soy element composition.
Right now, if you were to do something like
<{foo()}>
it would autocomplet with . This change makes it autocomplete with >
---
addon/edit/closetag.js | 5 +++--
mode/soy/soy.js | 20 ++++++++++++++++++++
mode/soy/test.js | 9 +++++++--
3 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/addon/edit/closetag.js b/addon/edit/closetag.js
index 8689765eec..7c22a50ecf 100644
--- a/addon/edit/closetag.js
+++ b/addon/edit/closetag.js
@@ -128,9 +128,10 @@
replacement = head + "style";
} else {
var context = inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state)
- if (!context || (context.length && closingTagExists(cm, context, context[context.length - 1], pos)))
+ var top = context.length ? context[context.length - 1] : ""
+ if (!context || (context.length && closingTagExists(cm, context, top, pos)))
return CodeMirror.Pass;
- replacement = head + context[context.length - 1]
+ replacement = head + top
}
if (cm.getLine(pos.line).charAt(tok.end) != ">") replacement += ">";
replacements[i] = replacement;
diff --git a/mode/soy/soy.js b/mode/soy/soy.js
index cac59bb3df..17bafcd932 100644
--- a/mode/soy/soy.js
+++ b/mode/soy/soy.js
@@ -498,6 +498,17 @@
}
return expression(stream, state);
+ case "template-call-expression":
+ if (stream.match(/^([\w-?]+)(?==)/)) {
+ return "attribute";
+ } else if (stream.eat('>')) {
+ state.soyState.pop();
+ return "keyword";
+ } else if (stream.eat('/>')) {
+ state.soyState.pop();
+ return "keyword";
+ }
+ return expression(stream, state);
case "literal":
if (stream.match(/^(?=\{\/literal})/)) {
state.soyState.pop();
@@ -563,6 +574,15 @@
state.soyState.push("import");
state.indent += 2 * config.indentUnit;
return "keyword";
+ } else if (match = stream.match(/^<\{/)) {
+ state.soyState.push("template-call-expression");
+ state.tag = "print";
+ state.indent += 2 * config.indentUnit;
+ state.soyState.push("tag");
+ return "keyword";
+ } else if (match = stream.match(/^<\/>/)) {
+ state.indent -= 2 * config.indentUnit;
+ return "keyword";
}
return tokenUntil(stream, state, /\{|\s+\/\/|\/\*/);
diff --git a/mode/soy/test.js b/mode/soy/test.js
index 8c764c7a2b..ae13158720 100644
--- a/mode/soy/test.js
+++ b/mode/soy/test.js
@@ -27,8 +27,13 @@
'[string "][tag&bracket />]');
MT('soy-element-composition-test',
- '[tag&bracket <][keyword {][callee&variable foo]()[keyword }]',
- '[tag&bracket >>]');
+ '[keyword <{][callee&variable foo]()[keyword }]',
+ '[keyword >>]');
+
+ MT('soy-element-composition-attribute-test',
+ '[keyword <{][callee&variable foo]()[keyword }]',
+ '[attribute class]=[string "Foo"]',
+ '[keyword >>]');
MT('namespace-test',
'[keyword {namespace] [variable namespace][keyword }]')
From 37f7d7b00b674c4ebf380855d77f822829a8b76b Mon Sep 17 00:00:00 2001
From: Hendrik Erz
Date: Sat, 14 Nov 2020 20:23:25 +0100
Subject: [PATCH 079/342] [show-hint addon] Document all options
---
doc/manual.html | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/doc/manual.html b/doc/manual.html
index 1da41d3ccb..2ba7c732f2 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -2700,8 +2700,8 @@ Addons
Defines editor.showHint
, which takes an optional
options object, and pops up a widget that allows the user to
select a completion. Finding hints is done with a hinting
- functions (the hint
option), which is a function
- that take an editor instance and options object, and return
+ function (the hint
option). This function
+ takes an editor instance and an options object, and returns
a {list, from, to}
object, where list
is an array of strings or objects (the completions),
and from
and to
give the start and end
@@ -2771,9 +2771,22 @@ Addons
alignWithWord: boolean
- Whether the pop-up should be horizontally aligned with the
start of the word (true, default), or with the cursor (false).
+ closeCharacters: RegExp
+ - A regular expression object used to match characters which
+ cause the pop up to be closed (default:
/[\s()\[\]{};:>,]/
).
+ If the user types one of these characters, the pop up will close, and
+ the endCompletion
event is fired on the editor instance.
closeOnUnfocus: boolean
- When enabled (which is the default), the pop-up will close
when the editor is unfocused.
+ completeOnSingleClick: boolean
+ - Whether a single click on a list item suffices to trigger the
+ completion (which is the default), or if the user has to use a
+ doubleclick.
+ container: Element|null
+ - Can be used to define a custom container for the widget. The default
+ is
null
, in which case the body
-element will
+ be used.
customKeys: keymap
- Allows you to provide a custom key map of keys to be active
when the pop-up is active. The handlers will be called with an
@@ -2809,6 +2822,14 @@
Addons
"close" ()
- Fired when the completion is finished.
+ The following events will be fired on the editor instance during
+ completion:
+
+ "endCompletion" ()
+ - Fired when the pop-up is being closed programmatically, e.g., when
+ the user types a character which matches the
+
closeCharacters
option.
+
This addon depends on styles
from addon/hint/show-hint.css
. Check
out the demo for an
From 097d7c957c7d4988a942d11c0ac681f004ba0e8a Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Mon, 16 Nov 2020 21:58:04 +0100
Subject: [PATCH 080/342] [html-hint addon] Add dialog tag
Closes #6474
---
addon/hint/html-hint.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/addon/hint/html-hint.js b/addon/hint/html-hint.js
index d0cca4f6a2..9878eca6ef 100644
--- a/addon/hint/html-hint.js
+++ b/addon/hint/html-hint.js
@@ -98,6 +98,7 @@
dfn: s,
dir: s,
div: s,
+ dialog: { attrs: { open: null } },
dl: s,
dt: s,
em: s,
From 12512d3ed0014696a64fe5d6bee2e0e5259a4861 Mon Sep 17 00:00:00 2001
From: erosman
Date: Tue, 17 Nov 2020 14:23:54 +0330
Subject: [PATCH 081/342] [javascript-lint addon] Add comment noting dependency
Added note on dependency on jshint.js
---
addon/lint/javascript-lint.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/addon/lint/javascript-lint.js b/addon/lint/javascript-lint.js
index cc132d7f82..e5bc752308 100644
--- a/addon/lint/javascript-lint.js
+++ b/addon/lint/javascript-lint.js
@@ -1,6 +1,8 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
+// Depends on jshint.js from https://github.com/jshint/jshint
+
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
From 0e6548686356d58504638c2bea95d403a9e53cde Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Wed, 18 Nov 2020 07:55:38 +0100
Subject: [PATCH 082/342] Fix focus state confusion in drag handler
Issue #6480
---
mode/clike/clike.js | 8 ++++----
src/edit/mouse_events.js | 5 ++++-
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/mode/clike/clike.js b/mode/clike/clike.js
index 37da2ec964..2154f1d2df 100644
--- a/mode/clike/clike.js
+++ b/mode/clike/clike.js
@@ -82,15 +82,15 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
state.tokenize = tokenString(ch);
return state.tokenize(stream, state);
}
- if (isPunctuationChar.test(ch)) {
- curPunc = ch;
- return null;
- }
if (numberStart.test(ch)) {
stream.backUp(1)
if (stream.match(number)) return "number"
stream.next()
}
+ if (isPunctuationChar.test(ch)) {
+ curPunc = ch;
+ return null;
+ }
if (ch == "/") {
if (stream.eat("*")) {
state.tokenize = tokenComment;
diff --git a/src/edit/mouse_events.js b/src/edit/mouse_events.js
index 401eadf431..b5d0b5a64e 100644
--- a/src/edit/mouse_events.js
+++ b/src/edit/mouse_events.js
@@ -149,7 +149,10 @@ function leftButtonStartDrag(cm, event, pos, behavior) {
let dragEnd = operation(cm, e => {
if (webkit) display.scroller.draggable = false
cm.state.draggingText = false
- if (cm.state.delayingBlurEvent) delayBlurEvent(cm)
+ if (cm.state.delayingBlurEvent) {
+ if (cm.hasFocus()) cm.state.delayingBlurEvent = false
+ else delayBlurEvent(cm)
+ }
off(display.wrapper.ownerDocument, "mouseup", dragEnd)
off(display.wrapper.ownerDocument, "mousemove", mouseMove)
off(display.scroller, "dragstart", dragStart)
From 5d2feacfc89aab7e9b973ec59627b9def1f63d77 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marc=20Esp=C3=ADn?=
Date: Wed, 18 Nov 2020 13:27:20 +0100
Subject: [PATCH 083/342] [real-world uses] Add Graviton Editor
---
doc/realworld.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/doc/realworld.html b/doc/realworld.html
index da6182515e..5da12e2c48 100644
--- a/doc/realworld.html
+++ b/doc/realworld.html
@@ -96,6 +96,7 @@ CodeMirror real-world uses
- Go language tour
- Google Apps Script
- Graphit (function graphing)
+ - Graviton Editor (Cross-platform and modern-looking code editor)
- HackMD (Realtime collaborative markdown notes on all platforms)
- Handcraft (HTML prototyping)
- Hawkee
From 0630b63d94ba1b1f79ae89577ec1985f5e277025 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Thu, 19 Nov 2020 09:29:46 +0100
Subject: [PATCH 084/342] [placeholder addon] Further fix composition handling
Closes #6479
---
addon/display/placeholder.js | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/addon/display/placeholder.js b/addon/display/placeholder.js
index 89bb93f378..cfb8341db2 100644
--- a/addon/display/placeholder.js
+++ b/addon/display/placeholder.js
@@ -50,11 +50,12 @@
function onComposition(cm) {
setTimeout(function() {
- var empty = false, input = cm.getInputField()
- if (input.nodeName == "TEXTAREA")
- empty = !input.value
- else if (cm.lineCount() == 1)
- empty = !/[^\u200b]/.test(input.querySelector(".CodeMirror-line").textContent)
+ var empty = false
+ if (cm.lineCount() == 1) {
+ var input = cm.getInputField()
+ empty = input.nodeName == "TEXTAREA" ? !cm.getLine(0).length
+ : !/[^\u200b]/.test(input.querySelector(".CodeMirror-line").textContent)
+ }
if (empty) setPlaceholder(cm)
else clearPlaceholder(cm)
}, 20)
From a53e86069bc06410ff477a8a5849a5abd26f983a Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Thu, 19 Nov 2020 09:38:15 +0100
Subject: [PATCH 085/342] Mark version 5.58.3
---
AUTHORS | 5 +++++
CHANGELOG.md | 12 ++++++++++++
doc/manual.html | 2 +-
doc/releases.html | 9 +++++++++
index.html | 2 +-
package.json | 2 +-
src/edit/main.js | 2 +-
7 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/AUTHORS b/AUTHORS
index b8087133a8..33d819ed24 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -251,6 +251,7 @@ Eric Allam
Eric Bogard
Erik Demaine
Erik Welander
+erosman
eustas
Evan Minsk
Fabien Dubosson
@@ -326,6 +327,7 @@ Heanes
Hector Oswaldo Caballero
Hein Htat
Hélio
+Hendrik Erz
Hendrik Wallbaum
Henrik Haugbølle
Herculano Campos
@@ -353,6 +355,7 @@ Ilya Zverev
Ingo Richter
Intervue
Irakli Gozalishvili
+iteriani
Ivan Kurnosov
Ivoah
Jack Douglas
@@ -517,6 +520,7 @@ Manuel Rego Casasnovas
Marat Dreizin
Marcel Gerber
Marcelo Camargo
+Marc Espín
Marco Aurélio
Marco Munizaga
Marcus Bointon
@@ -681,6 +685,7 @@ Peter Flynn
peterkroon
Peter Kroon
Peter László
+Phil DeJarnett
Philipp A
Philipp Markovics
Philip Stadermann
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 80200fc784..2b00dbd80e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,15 @@
+## 5.58.3 (2020-11-19)
+
+### Bug fixes
+
+Suppress quick-firing of blur-focus events when dragging and clicking on Internet Explorer.
+
+Fix the `insertAt` option to `addLineWidget` to actually allow the widget to be placed after all widgets for the line.
+
+[soy mode](https://codemirror.net/mode/soy/): Support `@Attribute` and element composition.
+
+[shell mode](https://codemirror.net/mode/shell/): Support heredoc quoting.
+
## 5.58.2 (2020-10-23)
### Bug fixes
diff --git a/doc/manual.html b/doc/manual.html
index 2ba7c732f2..89a6328e6d 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -70,7 +70,7 @@
User manual and reference guide
- version 5.58.2
+ version 5.58.3
CodeMirror is a code-editor component that can be embedded in
diff --git a/doc/releases.html b/doc/releases.html
index bdf24ed2f7..1b4f9a7976 100644
--- a/doc/releases.html
+++ b/doc/releases.html
@@ -30,6 +30,15 @@
Release notes and version history
Version 5.x
+ 19-11-2020: Version 5.58.3:
+
+
+ - Suppress quick-firing of blur-focus events when dragging and clicking on Internet Explorer.
+ - Fix the
insertAt
option to addLineWidget
to actually allow the widget to be placed after all widgets for the line.
+ - soy mode: Support
@Attribute
and element composition.
+ - shell mode: Support heredoc quoting.
+
+
23-10-2020: Version 5.58.2:
diff --git a/index.html b/index.html
index 6d41dcc79e..7ea8c48961 100644
--- a/index.html
+++ b/index.html
@@ -99,7 +99,7 @@ This is CodeMirror
- Get the current version:
5.58.2.
+ Get the current version:
5.58.3.
You can see the
code,
read the
release notes,
or study the
user manual.
diff --git a/package.json b/package.json
index 2103e1c325..a768858ec8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "codemirror",
- "version": "5.58.2",
+ "version": "5.58.3",
"main": "lib/codemirror.js",
"style": "lib/codemirror.css",
"author": {
diff --git a/src/edit/main.js b/src/edit/main.js
index 800ee766f2..d51192c6e5 100644
--- a/src/edit/main.js
+++ b/src/edit/main.js
@@ -66,4 +66,4 @@ import { addLegacyProps } from "./legacy.js"
addLegacyProps(CodeMirror)
-CodeMirror.version = "5.58.2"
+CodeMirror.version = "5.58.3"
From 5bef47a743e8569af3f11fac628501bb3bc10108 Mon Sep 17 00:00:00 2001
From: erosman
Date: Thu, 19 Nov 2020 16:19:58 +0330
Subject: [PATCH 086/342] Fix white CodeMirror-scrollbar-filler on dark themes
background-color: white; remains white on dark themes which doesn't suit dark background pages. Changing it to transparent to match the theme.
---
lib/codemirror.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/codemirror.css b/lib/codemirror.css
index a64f97c777..5ea2d2be2a 100644
--- a/lib/codemirror.css
+++ b/lib/codemirror.css
@@ -19,7 +19,7 @@
}
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
- background-color: white; /* The little square between H and V scrollbars */
+ background-color: transparent; /* The little square between H and V scrollbars */
}
/* GUTTER */
From a82516d0fab6ce877f2aa699fd0a435e2274c7fd Mon Sep 17 00:00:00 2001
From: Lonnie Abelbeck
Date: Fri, 20 Nov 2020 02:23:52 -0600
Subject: [PATCH 087/342] [shell mode] Fix Heredoc to allow quotes and not
require a space
(a space is not required and the DELIMITER may be quoted for special meaning)
cat <
Date: Sat, 21 Nov 2020 01:34:52 +0330
Subject: [PATCH 088/342] [lint addon] Filter out duplicate messages on a
single line
---
addon/lint/lint.js | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/addon/lint/lint.js b/addon/lint/lint.js
index 963f2cf227..e970a25ade 100644
--- a/addon/lint/lint.js
+++ b/addon/lint/lint.js
@@ -170,6 +170,10 @@
var anns = annotations[line];
if (!anns) continue;
+ // filter out duplicate messages
+ var message = [];
+ anns = anns.filter(item => message.indexOf(item.message) > -1 ? false : message.push(item.message));
+
var maxSeverity = null;
var tipLabel = state.hasGutter && document.createDocumentFragment();
@@ -187,9 +191,9 @@
__annotation: ann
}));
}
-
+ // use original annotations[line] to show multiple messages
if (state.hasGutter)
- cm.setGutterMarker(line, GUTTER_ID, makeMarker(cm, tipLabel, maxSeverity, anns.length > 1,
+ cm.setGutterMarker(line, GUTTER_ID, makeMarker(cm, tipLabel, maxSeverity, annotations[line].length > 1,
state.options.tooltips));
}
if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm);
From 4f37b1e9ca592461473a64bf3ba43543eecdf550 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Sat, 21 Nov 2020 11:34:06 +0100
Subject: [PATCH 089/342] [lint addon] Remove arrow function
Issue #6492
---
addon/lint/lint.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addon/lint/lint.js b/addon/lint/lint.js
index e970a25ade..395f0d9314 100644
--- a/addon/lint/lint.js
+++ b/addon/lint/lint.js
@@ -172,7 +172,7 @@
// filter out duplicate messages
var message = [];
- anns = anns.filter(item => message.indexOf(item.message) > -1 ? false : message.push(item.message));
+ anns = anns.filter(function(item) { return message.indexOf(item.message) > -1 ? false : message.push(item.message) });
var maxSeverity = null;
var tipLabel = state.hasGutter && document.createDocumentFragment();
From f65b46d154af2ba7e83fb78b449bea41e1c23c43 Mon Sep 17 00:00:00 2001
From: erosman
Date: Sun, 22 Nov 2020 19:42:08 +0330
Subject: [PATCH 090/342] [seach addon] Add option to configure search, bottom
option to put dialog at bottom
Closes #6489
---
addon/search/jump-to-line.js | 5 ++++-
addon/search/search.js | 8 ++++++--
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/addon/search/jump-to-line.js b/addon/search/jump-to-line.js
index 1f3526d247..990c235ef1 100644
--- a/addon/search/jump-to-line.js
+++ b/addon/search/jump-to-line.js
@@ -13,8 +13,11 @@
})(function(CodeMirror) {
"use strict";
+ // default search panel location
+ CodeMirror.defineOption("search", {bottom: false});
+
function dialog(cm, text, shortText, deflt, f) {
- if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true});
+ if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true, bottom: cm.options.search.bottom});
else f(prompt(shortText, deflt));
}
diff --git a/addon/search/search.js b/addon/search/search.js
index cecdd52ea1..118f1112f1 100644
--- a/addon/search/search.js
+++ b/addon/search/search.js
@@ -19,6 +19,9 @@
})(function(CodeMirror) {
"use strict";
+ // default search panel location
+ CodeMirror.defineOption("search", {bottom: false});
+
function searchOverlay(query, caseInsensitive) {
if (typeof query == "string")
query = new RegExp(query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), caseInsensitive ? "gi" : "g");
@@ -63,12 +66,13 @@
selectValueOnOpen: true,
closeOnEnter: false,
onClose: function() { clearSearch(cm); },
- onKeyDown: onKeyDown
+ onKeyDown: onKeyDown,
+ bottom: cm.options.search.bottom
});
}
function dialog(cm, text, shortText, deflt, f) {
- if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true});
+ if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true, bottom: cm.options.search.bottom});
else f(prompt(shortText, deflt));
}
From 464a66067b8d984c81b8e61ce048b34d7a1054bb Mon Sep 17 00:00:00 2001
From: quiddity-wp
Date: Sun, 22 Nov 2020 13:02:36 -0800
Subject: [PATCH 091/342] [real-world uses] Add MediaWiki
---
doc/realworld.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/doc/realworld.html b/doc/realworld.html
index 5da12e2c48..c6e6c80323 100644
--- a/doc/realworld.html
+++ b/doc/realworld.html
@@ -129,6 +129,7 @@ CodeMirror real-world uses
- LiveUML (PlantUML online editor)
- Markdown Delight Editor (extensible markdown editor polymer component)
- Marklight editor (lightweight markup editor)
+ - MediaWiki extension (wiki engine)
- Mergely (interactive diffing)
- MIHTool (iOS web-app debugging tool)
- mscgen_js (online sequence chart editor)
From f4b04da36d5c88762382db44651b0b5389077bac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20=C5=9Alepowro=C5=84ski?=
<45392875+slepowronski@users.noreply.github.com>
Date: Wed, 25 Nov 2020 09:23:24 +0100
Subject: [PATCH 092/342] [show-hint addon] Add additional customizing options
Introduces four new options for the show-hint addon:
- closeOnCursorActivity
- closeOnPick
- paddingForScrollbar
- moveOnOverlap
---
addon/hint/show-hint.js | 50 ++++++++++++++++++++++++++++++++---------
1 file changed, 39 insertions(+), 11 deletions(-)
diff --git a/addon/hint/show-hint.js b/addon/hint/show-hint.js
index cd0d6a7bd5..5ef1bba645 100644
--- a/addon/hint/show-hint.js
+++ b/addon/hint/show-hint.js
@@ -1,6 +1,8 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
+// declare global: DOMRect
+
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
@@ -94,8 +96,10 @@
completion.to || data.to, "complete");
CodeMirror.signal(data, "pick", completion);
self.cm.scrollIntoView();
- })
- this.close();
+ });
+ if (this.options.closeOnPick) {
+ this.close();
+ }
},
cursorActivity: function() {
@@ -113,7 +117,9 @@
if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch ||
pos.ch < identStart.ch || this.cm.somethingSelected() ||
(!pos.ch || this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) {
- this.close();
+ if (this.options.closeOnCursorActivity) {
+ this.close();
+ }
} else {
var self = this;
this.debounce = requestAnimationFrame(function() {self.update();});
@@ -259,10 +265,15 @@
var winW = parentWindow.innerWidth || Math.max(ownerDocument.body.offsetWidth, ownerDocument.documentElement.offsetWidth);
var winH = parentWindow.innerHeight || Math.max(ownerDocument.body.offsetHeight, ownerDocument.documentElement.offsetHeight);
container.appendChild(hints);
- var box = hints.getBoundingClientRect(), overlapY = box.bottom - winH;
- var scrolls = hints.scrollHeight > hints.clientHeight + 1
- var startScroll = cm.getScrollInfo();
+ var box = completion.options.moveOnOverlap ? hints.getBoundingClientRect() : new DOMRect();
+ var scrolls = completion.options.paddingForScrollbar ? hints.scrollHeight > hints.clientHeight + 1 : false;
+
+ // Compute in the timeout to avoid reflow on init
+ var startScroll;
+ setTimeout(function() { startScroll = cm.getScrollInfo(); });
+
+ var overlapY = box.bottom - winH;
if (overlapY > 0) {
var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top);
if (curTop - height > 0) { // Fits above cursor
@@ -332,7 +343,12 @@
CodeMirror.on(hints, "mousedown", function() {
setTimeout(function(){cm.focus();}, 20);
});
- this.scrollToActive()
+
+ // The first hint doesn't need to be scrolled to on init
+ var selectedHintRange = this.getSelectedHintRange();
+ if (selectedHintRange.from !== 0 || selectedHintRange.to !== 0) {
+ this.scrollToActive();
+ }
CodeMirror.signal(data, "select", completions[this.selectedHint], hints.childNodes[this.selectedHint]);
return true;
@@ -379,9 +395,9 @@
},
scrollToActive: function() {
- var margin = this.completion.options.scrollMargin || 0;
- var node1 = this.hints.childNodes[Math.max(0, this.selectedHint - margin)];
- var node2 = this.hints.childNodes[Math.min(this.data.list.length - 1, this.selectedHint + margin)];
+ var selectedHintRange = this.getSelectedHintRange();
+ var node1 = this.hints.childNodes[selectedHintRange.from];
+ var node2 = this.hints.childNodes[selectedHintRange.to];
var firstNode = this.hints.firstChild;
if (node1.offsetTop < this.hints.scrollTop)
this.hints.scrollTop = node1.offsetTop - firstNode.offsetTop;
@@ -391,6 +407,14 @@
screenAmount: function() {
return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1;
+ },
+
+ getSelectedHintRange: function() {
+ var margin = this.completion.options.scrollMargin || 0;
+ return {
+ from: Math.max(0, this.selectedHint - margin),
+ to: Math.min(this.data.list.length - 1, this.selectedHint + margin),
+ };
}
};
@@ -468,11 +492,15 @@
completeSingle: true,
alignWithWord: true,
closeCharacters: /[\s()\[\]{};:>,]/,
+ closeOnCursorActivity: true,
+ closeOnPick: true,
closeOnUnfocus: true,
completeOnSingleClick: true,
container: null,
customKeys: null,
- extraKeys: null
+ extraKeys: null,
+ paddingForScrollbar: true,
+ moveOnOverlap: true,
};
CodeMirror.defineOption("hintOptions", null);
From 5e11705588c69925dcd8531bc605854bb379150b Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Tue, 1 Dec 2020 08:48:39 +0100
Subject: [PATCH 093/342] [clojure mode] Fix exponential-complexity regexp
---
mode/clojure/clojure.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mode/clojure/clojure.js b/mode/clojure/clojure.js
index 25d308ab4c..0b9d6acc3e 100644
--- a/mode/clojure/clojure.js
+++ b/mode/clojure/clojure.js
@@ -160,10 +160,10 @@ CodeMirror.defineMode("clojure", function (options) {
var numberLiteral = /^(?:[+\-]?\d+(?:(?:N|(?:[eE][+\-]?\d+))|(?:\.?\d*(?:M|(?:[eE][+\-]?\d+))?)|\/\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?(?=[\\\[\]\s"#'(),;@^`{}~]|$))/;
var characterLiteral = /^(?:\\(?:backspace|formfeed|newline|return|space|tab|o[0-7]{3}|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{4}|.)?(?=[\\\[\]\s"(),;@^`{}~]|$))/;
- // simple-namespace := /^[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*/
+ // simple-namespace := /^[^\\\/\[\]\d\s"#'(),;@^`{}~.][^\\\[\]\s"(),;@^`{}~.\/]*/
// simple-symbol := /^(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)/
// qualified-symbol := ((<.>)*>)?
- var qualifiedSymbol = /^(?:(?:[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*(?:\.[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*\/)?(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*(?=[\\\[\]\s"(),;@^`{}~]|$))/;
+ var qualifiedSymbol = /^(?:(?:[^\\\/\[\]\d\s"#'(),;@^`{}~.][^\\\[\]\s"(),;@^`{}~.\/]*(?:\.[^\\\/\[\]\d\s"#'(),;@^`{}~.][^\\\[\]\s"(),;@^`{}~.\/]*)*\/)?(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*(?=[\\\[\]\s"(),;@^`{}~]|$))/;
function base(stream, state) {
if (stream.eatSpace() || stream.eat(",")) return ["space", null];
From 1cec2af7be8a2158ff5bf71ab76c8c62fe669791 Mon Sep 17 00:00:00 2001
From: Ben Hormann
Date: Wed, 2 Dec 2020 10:14:35 +0000
Subject: [PATCH 094/342] [wast mode] Add link
---
mode/index.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/mode/index.html b/mode/index.html
index 858ba127f2..51205ddce9 100644
--- a/mode/index.html
+++ b/mode/index.html
@@ -153,6 +153,7 @@ Language modes
- VHDL
- Vue.js app
- Web IDL
+ - WebAssembly Text Format
- XML/HTML
- XQuery
- Yacas
From f4fd159353930680dbe617d440e5a4867d8b13a9 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Wed, 2 Dec 2020 17:20:39 +0100
Subject: [PATCH 095/342] [hardwrap addon] Improve start-of-line condition for
overlong words
Issue #6494
---
addon/wrap/hardwrap.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addon/wrap/hardwrap.js b/addon/wrap/hardwrap.js
index f194946c5d..bccdc8d14c 100644
--- a/addon/wrap/hardwrap.js
+++ b/addon/wrap/hardwrap.js
@@ -35,7 +35,7 @@
for (; at > 0; --at)
if (wrapOn.test(text.slice(at - 1, at + 1))) break;
- if (at == 0 && !forceBreak) {
+ if (!forceBreak && at <= text.match(/^[ \t]*/)[0].length) {
// didn't find a break point before column, in non-forceBreak mode try to
// find one after 'column'.
for (at = column + 1; at < text.length - 1; ++at) {
From c04867c786c5625f5f221c4162cb54d798dc9a8e Mon Sep 17 00:00:00 2001
From: "Jakub T. Jankiewicz"
Date: Thu, 3 Dec 2020 19:15:50 +0100
Subject: [PATCH 096/342] [scheme mode] Add more special indentation words and
keywords
---
mode/scheme/scheme.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mode/scheme/scheme.js b/mode/scheme/scheme.js
index 56e4e332e9..0bbb8c8a41 100644
--- a/mode/scheme/scheme.js
+++ b/mode/scheme/scheme.js
@@ -26,8 +26,8 @@ CodeMirror.defineMode("scheme", function () {
return obj;
}
- var keywords = makeKeywords("λ case-lambda call/cc class define-class exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci char-ci=? char-ci>=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char char=? char>=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci string-ci=? string-ci>=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string string=? string>=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?");
- var indentKeys = makeKeywords("define let letrec let* lambda");
+ var keywords = makeKeywords("λ case-lambda call/cc class define-class exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax define-macro defmacro delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci char-ci=? char-ci>=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char char=? char>=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci string-ci=? string-ci>=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string string=? string>=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?");
+ var indentKeys = makeKeywords("define let letrec let* lambda define-macro defmacro let-syntax letrec-syntax define-syntax syntax-rules");
function stateStack(indent, type, prev) { // represents a state stack object
this.indent = indent;
From e410e5c17866308e1aba41f56383a6a2d31f02a9 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Thu, 3 Dec 2020 19:30:28 +0100
Subject: [PATCH 097/342] Add a funding.yml file
---
.github/FUNDING.yml | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 .github/FUNDING.yml
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000000..d87b38eee6
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,2 @@
+patreon: marijn
+custom: ['https://www.paypal.com/paypalme/marijnhaverbeke', 'https://marijnhaverbeke.nl/fund/']
From a966b5d115af09983d37f7c9aa034b78ac954ca4 Mon Sep 17 00:00:00 2001
From: Piyush
Date: Fri, 4 Dec 2020 09:50:24 +0530
Subject: [PATCH 098/342] fix memory leak with matchbrackets
---
addon/edit/matchbrackets.js | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/addon/edit/matchbrackets.js b/addon/edit/matchbrackets.js
index 2c47e07033..0377408802 100644
--- a/addon/edit/matchbrackets.js
+++ b/addon/edit/matchbrackets.js
@@ -117,25 +117,25 @@
});
}
- CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) {
- function clear(cm) {
- if (cm.state.matchBrackets && cm.state.matchBrackets.currentlyHighlighted) {
- cm.state.matchBrackets.currentlyHighlighted();
- cm.state.matchBrackets.currentlyHighlighted = null;
- }
+ function clearHighlighted(cm) {
+ if (cm.state.matchBrackets && cm.state.matchBrackets.currentlyHighlighted) {
+ cm.state.matchBrackets.currentlyHighlighted();
+ cm.state.matchBrackets.currentlyHighlighted = null;
}
+ }
+ CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) {
if (old && old != CodeMirror.Init) {
cm.off("cursorActivity", doMatchBrackets);
cm.off("focus", doMatchBrackets)
- cm.off("blur", clear)
- clear(cm);
+ cm.off("blur", clearHighlighted)
+ clearHighlighted(cm);
}
if (val) {
cm.state.matchBrackets = typeof val == "object" ? val : {};
cm.on("cursorActivity", doMatchBrackets);
cm.on("focus", doMatchBrackets)
- cm.on("blur", clear)
+ cm.on("blur", clearHighlighted)
}
});
From e3fc417882517edaffda6f445c62f8697a0cd495 Mon Sep 17 00:00:00 2001
From: Simon Huber
Date: Mon, 7 Dec 2020 10:16:23 +0100
Subject: [PATCH 099/342] [solaized theme] Fix typos
---
theme/solarized.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/theme/solarized.css b/theme/solarized.css
index fcd1d70de6..9c6b1265c1 100644
--- a/theme/solarized.css
+++ b/theme/solarized.css
@@ -99,7 +99,7 @@ http://ethanschoonover.com/solarized/img/solarized-palette.png
.cm-s-solarized.cm-s-light div.CodeMirror-selected { background: #eee8d5; }
.cm-s-solarized.cm-s-light .CodeMirror-line::selection, .cm-s-light .CodeMirror-line > span::selection, .cm-s-light .CodeMirror-line > span > span::selection { background: #eee8d5; }
-.cm-s-solarized.cm-s-light .CodeMirror-line::-moz-selection, .cm-s-ligh .CodeMirror-line > span::-moz-selection, .cm-s-ligh .CodeMirror-line > span > span::-moz-selection { background: #eee8d5; }
+.cm-s-solarized.cm-s-light .CodeMirror-line::-moz-selection, .cm-s-light .CodeMirror-line > span::-moz-selection, .cm-s-light .CodeMirror-line > span > span::-moz-selection { background: #eee8d5; }
/* Editor styling */
From 622fcb9b8740ceade71c1f579eaa76c8b82a0c0b Mon Sep 17 00:00:00 2001
From: "Jakub T. Jankiewicz"
Date: Mon, 7 Dec 2020 10:19:14 +0100
Subject: [PATCH 100/342] [scheme mode] More indent fixes
---
mode/scheme/scheme.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mode/scheme/scheme.js b/mode/scheme/scheme.js
index 0bbb8c8a41..efac89078b 100644
--- a/mode/scheme/scheme.js
+++ b/mode/scheme/scheme.js
@@ -26,8 +26,8 @@ CodeMirror.defineMode("scheme", function () {
return obj;
}
- var keywords = makeKeywords("λ case-lambda call/cc class define-class exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax define-macro defmacro delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci char-ci=? char-ci>=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char char=? char>=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci string-ci=? string-ci>=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string string=? string>=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?");
- var indentKeys = makeKeywords("define let letrec let* lambda define-macro defmacro let-syntax letrec-syntax define-syntax syntax-rules");
+ var keywords = makeKeywords("λ case-lambda call/cc class cond-expand define-class define-values exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax define-macro defmacro delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci char-ci=? char-ci>=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char char=? char>=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci string-ci=? string-ci>=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string string=? string>=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?");
+ var indentKeys = makeKeywords("define let letrec let* lambda define-macro defmacro let-syntax letrec-syntax let-values let*-values define-syntax syntax-rules define-values when unless");
function stateStack(indent, type, prev) { // represents a state stack object
this.indent = indent;
From ae4e671eb2d931ce88cf91d6d1f39cdaf7f0654e Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Mon, 7 Dec 2020 21:45:51 +0100
Subject: [PATCH 101/342] [shell mode] Treat <<< as here string operator
Issue #6512
---
mode/shell/shell.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/mode/shell/shell.js b/mode/shell/shell.js
index 2219e62e19..8271485f5f 100644
--- a/mode/shell/shell.js
+++ b/mode/shell/shell.js
@@ -71,6 +71,7 @@ CodeMirror.defineMode('shell', function() {
return 'attribute';
}
if (ch == "<") {
+ if (stream.match("<<")) return "operator"
var heredoc = stream.match(/^<-?\s*['"]?([^'"]*)['"]?/)
if (heredoc) {
state.tokens.unshift(tokenHeredoc(heredoc[1]))
From fb4ec129858dc916de86e8dd802e9668ae0049a0 Mon Sep 17 00:00:00 2001
From: mlsad3
Date: Tue, 8 Dec 2020 01:35:04 -0700
Subject: [PATCH 102/342] [verilog mode] Improve
* Handle `uvm_*_begin/end macros as well as macros in case/switch.
* Prevent extern functions and typedef classes from indenting.
* Indent lines after assignments, handle corner-case inside parenthesis.
* Handle 'disable fork' and 'wait fork'.
* Add '<' and '>' to operators.
* Add tests for mode/verilog changes.
* Verilog mode handles compiler directives and differentiates assignment vs comparison.
* Cleanup lint errors.
* Add verilog mode support for '@'.
Co-authored-by: Matt Diehl
---
mode/verilog/test.js | 170 ++++++++++++++++++++++++++++++++++++++++
mode/verilog/verilog.js | 138 ++++++++++++++++++++++++++++----
2 files changed, 292 insertions(+), 16 deletions(-)
diff --git a/mode/verilog/test.js b/mode/verilog/test.js
index bafe726db3..38c1cbe457 100644
--- a/mode/verilog/test.js
+++ b/mode/verilog/test.js
@@ -139,6 +139,32 @@
""
);
+ MT("align_assignments",
+ /**
+ * always @(posedge clk) begin
+ * if (rst)
+ * data_out <= 8'b0 +
+ * 8'b1;
+ * else
+ * data_out = 8'b0 +
+ * 8'b1;
+ * data_out =
+ * 8'b0 + 8'b1;
+ * end
+ */
+ "[keyword always] [def @][bracket (][keyword posedge] [variable clk][bracket )] [keyword begin]",
+ " [keyword if] [bracket (][variable rst][bracket )]",
+ " [variable data_out] [meta <=] [number 8'b0] [meta +]",
+ " [number 8'b1];",
+ " [keyword else]",
+ " [variable data_out] [meta =] [number 8'b0] [meta +]",
+ " [number 8'b1];",
+ " [variable data_out] [meta =] [number 8'b0] [meta +]",
+ " [number 8'b1];",
+ "[keyword end]",
+ ""
+ );
+
// Indentation tests
MT("indent_single_statement_if",
"[keyword if] [bracket (][variable foo][bracket )]",
@@ -270,4 +296,148 @@
""
);
+ MT("indent_uvm_macros",
+ /**
+ * `uvm_object_utils_begin(foo)
+ * `uvm_field_event(foo, UVM_ALL_ON)
+ * `uvm_object_utils_end
+ */
+ "[def `uvm_object_utils_begin][bracket (][variable foo][bracket )]",
+ " [def `uvm_field_event][bracket (][variable foo], [variable UVM_ALL_ON][bracket )]",
+ "[def `uvm_object_utils_end]",
+ ""
+ );
+
+ MT("indent_uvm_macros2",
+ /**
+ * `uvm_do_with(mem_read,{
+ * bar_nb == 0;
+ * })
+ */
+ "[def `uvm_do_with][bracket (][variable mem_read],[bracket {]",
+ " [variable bar_nb] [meta ==] [number 0];",
+ "[bracket })]",
+ ""
+ );
+
+ MT("indent_wait_disable_fork",
+ /**
+ * virtual task body();
+ * repeat (20) begin
+ * fork
+ * `uvm_create_on(t,p_seq)
+ * join_none
+ * end
+ * wait fork;
+ * disable fork;
+ * endtask : body
+ */
+ "[keyword virtual] [keyword task] [variable body][bracket ()];",
+ " [keyword repeat] [bracket (][number 20][bracket )] [keyword begin]",
+ " [keyword fork]",
+ " [def `uvm_create_on][bracket (][variable t],[variable p_seq][bracket )]",
+ " [keyword join_none]",
+ " [keyword end]",
+ " [keyword wait] [keyword fork];",
+ " [keyword disable] [keyword fork];",
+ "[keyword endtask] : [variable body]",
+ ""
+ );
+
+ MT("indent_typedef_class",
+ /**
+ * typedef class asdf;
+ * typedef p p_t[];
+ * typedef enum {
+ * ASDF
+ * } t;
+ */
+ "[keyword typedef] [keyword class] [variable asdf];",
+ "[keyword typedef] [variable p] [variable p_t][bracket [[]]];",
+ "[keyword typedef] [keyword enum] [bracket {]",
+ " [variable ASDF]",
+ "[bracket }] [variable t];",
+ ""
+ );
+
+ MT("indent_case_with_macro",
+ /**
+ * // It should be assumed that Macros can have ';' inside, or 'begin'/'end' blocks.
+ * // As such, 'case' statement should indent correctly with macros inside.
+ * case(foo)
+ * ASDF : this.foo = seqNum;
+ * ABCD : `update(f)
+ * EFGH : `update(g)
+ * endcase
+ */
+ "[keyword case][bracket (][variable foo][bracket )]",
+ " [variable ASDF] : [keyword this].[variable foo] [meta =] [variable seqNum];",
+ " [variable ABCD] : [def `update][bracket (][variable f][bracket )]",
+ " [variable EFGH] : [def `update][bracket (][variable g][bracket )]",
+ "[keyword endcase]",
+ ""
+ );
+
+ MT("indent_extern_function",
+ /**
+ * extern virtual function void do(ref packet trans);
+ * extern virtual function void do2(ref packet trans);
+ */
+ "[keyword extern] [keyword virtual] [keyword function] [keyword void] [variable do1][bracket (][keyword ref] [variable packet] [variable trans][bracket )];",
+ "[keyword extern] [keyword virtual] [keyword function] [keyword void] [variable do2][bracket (][keyword ref] [variable packet] [variable trans][bracket )];",
+ ""
+ );
+
+ MT("indent_assignment",
+ /**
+ * for (int i=1;i < fun;i++) begin
+ * foo = 2 << asdf || 11'h35 >> abcd
+ * && 8'h6 | 1'b1;
+ * end
+ */
+ "[keyword for] [bracket (][keyword int] [variable i][meta =][number 1];[variable i] [meta <] [variable fun];[variable i][meta ++][bracket )] [keyword begin]",
+ " [variable foo] [meta =] [number 2] [meta <<] [variable asdf] [meta ||] [number 11'h35] [meta >>] [variable abcd]",
+ " [meta &&] [number 8'h6] [meta |] [number 1'b1];",
+ "[keyword end]",
+ ""
+ );
+
+ MT("indent_foreach_constraint",
+ /**
+ * `uvm_rand_send_with(wrTlp, {
+ * length ==1;
+ * foreach (Data[i]) {
+ * payload[i] == Data[i];
+ * }
+ * })
+ */
+ "[def `uvm_rand_send_with][bracket (][variable wrTlp], [bracket {]",
+ " [variable length] [meta ==][number 1];",
+ " [keyword foreach] [bracket (][variable Data][bracket [[][variable i][bracket ]])] [bracket {]",
+ " [variable payload][bracket [[][variable i][bracket ]]] [meta ==] [variable Data][bracket [[][variable i][bracket ]]];",
+ " [bracket }]",
+ "[bracket })]",
+ ""
+ );
+
+ MT("indent_compiler_directives",
+ /**
+ * `ifdef DUT
+ * `else
+ * `ifndef FOO
+ * `define FOO
+ * `endif
+ * `endif
+ * `timescale 1ns/1ns
+ */
+ "[def `ifdef] [variable DUT]",
+ "[def `else]",
+ " [def `ifndef] [variable FOO]",
+ " [def `define] [variable FOO]",
+ " [def `endif]",
+ "[def `endif]",
+ "[def `timescale] [number 1][variable ns][meta /][number 1][variable ns]",
+ ""
+ );
+
})();
diff --git a/mode/verilog/verilog.js b/mode/verilog/verilog.js
index 43990452d3..544045b867 100644
--- a/mode/verilog/verilog.js
+++ b/mode/verilog/verilog.js
@@ -16,6 +16,12 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
var indentUnit = config.indentUnit,
statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,
dontAlignCalls = parserConfig.dontAlignCalls,
+ // compilerDirectivesUseRegularIndentation - If set, Compiler directive
+ // indentation follows the same rules as everything else. Otherwise if
+ // false, compiler directives will track their own indentation.
+ // For example, `ifdef nested inside another `ifndef will be indented,
+ // but a `ifdef inside a function block may not be indented.
+ compilerDirectivesUseRegularIndentation = parserConfig.compilerDirectivesUseRegularIndentation,
noIndentKeywords = parserConfig.noIndentKeywords || [],
multiLineStrings = parserConfig.multiLineStrings,
hooks = parserConfig.hooks || {};
@@ -62,7 +68,7 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
binary_module_path_operator ::=
== | != | && | || | & | | | ^ | ^~ | ~^
*/
- var isOperatorChar = /[\+\-\*\/!~&|^%=?:]/;
+ var isOperatorChar = /[\+\-\*\/!~&|^%=?:<>]/;
var isBracketChar = /[\[\]{}()]/;
var unsignedNumber = /\d[0-9_]*/;
@@ -72,8 +78,13 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
var hexLiteral = /\d*\s*'s?h\s*[0-9a-fxz?][0-9a-fxz?_]*/i;
var realLiteral = /(\d[\d_]*(\.\d[\d_]*)?E-?[\d_]+)|(\d[\d_]*\.\d[\d_]*)/i;
- var closingBracketOrWord = /^((\w+)|[)}\]])/;
+ var closingBracketOrWord = /^((`?\w+)|[)}\]])/;
var closingBracket = /[)}\]]/;
+ var compilerDirectiveRegex = new RegExp(
+ "^(`(?:ifdef|ifndef|elsif|else|endif|undef|undefineall|define|include|begin_keywords|celldefine|default|" +
+ "nettype|end_keywords|endcelldefine|line|nounconnected_drive|pragma|resetall|timescale|unconnected_drive))\\b");
+ var compilerDirectiveBeginRegex = /^(`(?:ifdef|ifndef|elsif|else))\b/;
+ var compilerDirectiveEndRegex = /^(`(?:elsif|else|endif))\b/;
var curPunc;
var curKeyword;
@@ -96,6 +107,7 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
openClose["do" ] = "while";
openClose["fork" ] = "join;join_any;join_none";
openClose["covergroup"] = "endgroup";
+ openClose["macro_begin"] = "macro_end";
for (var i in noIndentKeywords) {
var keyword = noIndentKeywords[i];
@@ -105,7 +117,7 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
}
// Keywords which open statements that are ended with a semi-colon
- var statementKeywords = words("always always_comb always_ff always_latch assert assign assume else export for foreach forever if import initial repeat while");
+ var statementKeywords = words("always always_comb always_ff always_latch assert assign assume else export for foreach forever if import initial repeat while extern typedef");
function tokenBase(stream, state) {
var ch = stream.peek(), style;
@@ -125,6 +137,24 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
if (ch == '`') {
stream.next();
if (stream.eatWhile(/[\w\$_]/)) {
+ var cur = stream.current();
+ curKeyword = cur;
+ // Macros that end in _begin, are start of block and end with _end
+ if (cur.startsWith("`uvm_") && cur.endsWith("_begin")) {
+ var keywordClose = curKeyword.substr(0,curKeyword.length - 5) + "end";
+ openClose[cur] = keywordClose;
+ curPunc = "newblock";
+ } else if (cur.startsWith("`uvm_") && cur.endsWith("_end")) {
+ } else {
+ stream.eatSpace();
+ if (stream.peek() == '(') {
+ // Check if this is a block
+ curPunc = "newmacro";
+ }
+ var withSpace = stream.current();
+ // Move the stream back before the spaces
+ stream.backUp(withSpace.length - cur.length);
+ }
return "def";
} else {
return null;
@@ -145,6 +175,12 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
stream.eatWhile(/[\d_.]/);
return "def";
}
+ // Event
+ if (ch == '@') {
+ stream.next();
+ stream.eatWhile(/[@]/);
+ return "def";
+ }
// Strings
if (ch == '"') {
stream.next();
@@ -178,6 +214,7 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
// Operators
if (stream.eatWhile(isOperatorChar)) {
+ curPunc = stream.current();
return "meta";
}
@@ -187,6 +224,15 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
if (keywords[cur]) {
if (openClose[cur]) {
curPunc = "newblock";
+ if (cur === "fork") {
+ // Fork can be a statement instead of block in cases of:
+ // "disable fork;" and "wait fork;" (trailing semicolon)
+ stream.eatSpace()
+ if (stream.peek() == ';') {
+ curPunc = "newstatement";
+ }
+ stream.backUp(stream.current().length - cur.length);
+ }
}
if (statementKeywords[cur]) {
curPunc = "newstatement";
@@ -226,16 +272,17 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
return "comment";
}
- function Context(indented, column, type, align, prev) {
+ function Context(indented, column, type, scopekind, align, prev) {
this.indented = indented;
this.column = column;
this.type = type;
+ this.scopekind = scopekind;
this.align = align;
this.prev = prev;
}
- function pushContext(state, col, type) {
+ function pushContext(state, col, type, scopekind) {
var indent = state.indented;
- var c = new Context(indent, col, type, null, state.context);
+ var c = new Context(indent, col, type, scopekind ? scopekind : "", null, state.context);
return state.context = c;
}
function popContext(state) {
@@ -261,6 +308,16 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
}
}
+ function isInsideScopeKind(ctx, scopekind) {
+ if (ctx == null) {
+ return false;
+ }
+ if (ctx.scopekind === scopekind) {
+ return true;
+ }
+ return isInsideScopeKind(ctx.prev, scopekind);
+ }
+
function buildElectricInputRegEx() {
// Reindentation should occur on any bracket char: {}()[]
// or on a match of any of the block closing keywords, at
@@ -287,8 +344,9 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
startState: function(basecolumn) {
var state = {
tokenize: null,
- context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
+ context: new Context((basecolumn || 0) - indentUnit, 0, "top", "top", false),
indented: 0,
+ compilerDirectiveIndented: 0,
startOfLine: true
};
if (hooks.startState) hooks.startState(state);
@@ -313,15 +371,42 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
curPunc = null;
curKeyword = null;
var style = (state.tokenize || tokenBase)(stream, state);
- if (style == "comment" || style == "meta" || style == "variable") return style;
+ if (style == "comment" || style == "meta" || style == "variable") {
+ if (((curPunc === "=") || (curPunc === "<=")) && !isInsideScopeKind(ctx, "assignment")) {
+ // '<=' could be nonblocking assignment or lessthan-equals (which shouldn't cause indent)
+ // Search through the context to see if we are already in an assignment.
+ // '=' could be inside port declaration with comma or ')' afterward, or inside for(;;) block.
+ pushContext(state, stream.column() + curPunc.length, "assignment", "assignment");
+ if (ctx.align == null) ctx.align = true;
+ }
+ return style;
+ }
if (ctx.align == null) ctx.align = true;
- if (curPunc == ctx.type) {
- popContext(state);
- } else if ((curPunc == ";" && ctx.type == "statement") ||
+ var isClosingAssignment = ctx.type == "assignment" &&
+ closingBracket.test(curPunc) && ctx.prev && ctx.prev.type === curPunc;
+ if (curPunc == ctx.type || isClosingAssignment) {
+ if (isClosingAssignment) {
+ ctx = popContext(state);
+ }
+ ctx = popContext(state);
+ if (curPunc == ")") {
+ // Handle closing macros, assuming they could have a semicolon or begin/end block inside.
+ if (ctx && (ctx.type === "macro")) {
+ ctx = popContext(state);
+ while (ctx && (ctx.type == "statement" || ctx.type == "assignment")) ctx = popContext(state);
+ }
+ } else if (curPunc == "}") {
+ // Handle closing statements like constraint block: "foreach () {}" which
+ // do not have semicolon at end.
+ if (ctx && (ctx.type === "statement")) {
+ while (ctx && (ctx.type == "statement")) ctx = popContext(state);
+ }
+ }
+ } else if (((curPunc == ";" || curPunc == ",") && (ctx.type == "statement" || ctx.type == "assignment")) ||
(ctx.type && isClosing(curKeyword, ctx.type))) {
ctx = popContext(state);
- while (ctx && ctx.type == "statement") ctx = popContext(state);
+ while (ctx && (ctx.type == "statement" || ctx.type == "assignment")) ctx = popContext(state);
} else if (curPunc == "{") {
pushContext(state, stream.column(), "}");
} else if (curPunc == "[") {
@@ -329,9 +414,9 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
} else if (curPunc == "(") {
pushContext(state, stream.column(), ")");
} else if (ctx && ctx.type == "endcase" && curPunc == ":") {
- pushContext(state, stream.column(), "statement");
+ pushContext(state, stream.column(), "statement", "case");
} else if (curPunc == "newstatement") {
- pushContext(state, stream.column(), "statement");
+ pushContext(state, stream.column(), "statement", curKeyword);
} else if (curPunc == "newblock") {
if (curKeyword == "function" && ctx && (ctx.type == "statement" || ctx.type == "endgroup")) {
// The 'function' keyword can appear in some other contexts where it actually does not
@@ -339,9 +424,23 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
// Do nothing in this case
} else if (curKeyword == "task" && ctx && ctx.type == "statement") {
// Same thing for task
+ } else if (curKeyword == "class" && ctx && ctx.type == "statement") {
+ // Same thing for class (e.g. typedef)
} else {
var close = openClose[curKeyword];
- pushContext(state, stream.column(), close);
+ pushContext(state, stream.column(), close, curKeyword);
+ }
+ } else if (curPunc == "newmacro" || (curKeyword && curKeyword.match(compilerDirectiveRegex))) {
+ if (curPunc == "newmacro") {
+ // Macros (especially if they have parenthesis) potentially have a semicolon
+ // or complete statement/block inside, and should be treated as such.
+ pushContext(state, stream.column(), "macro", "macro");
+ }
+ if (curKeyword.match(compilerDirectiveEndRegex)) {
+ state.compilerDirectiveIndented -= statementIndentUnit;
+ }
+ if (curKeyword.match(compilerDirectiveBeginRegex)) {
+ state.compilerDirectiveIndented += statementIndentUnit;
}
}
@@ -361,8 +460,15 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
var possibleClosing = textAfter.match(closingBracketOrWord);
if (possibleClosing)
closing = isClosing(possibleClosing[0], ctx.type);
+ if (!compilerDirectivesUseRegularIndentation && textAfter.match(compilerDirectiveRegex)) {
+ if (textAfter.match(compilerDirectiveEndRegex)) {
+ return state.compilerDirectiveIndented - statementIndentUnit;
+ }
+ return state.compilerDirectiveIndented;
+ }
if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit);
- else if (closingBracket.test(ctx.type) && ctx.align && !dontAlignCalls) return ctx.column + (closing ? 0 : 1);
+ else if ((closingBracket.test(ctx.type) || ctx.type == "assignment")
+ && ctx.align && !dontAlignCalls) return ctx.column + (closing ? 0 : 1);
else if (ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit;
else return ctx.indented + (closing ? 0 : indentUnit);
},
From 348ab5603405d1e396f32a9acfdf81055c91a16f Mon Sep 17 00:00:00 2001
From: iteriani
Date: Tue, 8 Dec 2020 00:41:03 -0800
Subject: [PATCH 103/342] [soy mode] Update indentation rules for Element
Composition
* Add support for Soy Element Composition.
Add support for Soy Element Composition. It has the syntax in the form of
<{foo()}>>
This adds support to pass through allowEmptyTag and to support this mode in closetag.
* Disable allowMissingTagName and handle Soy Element Composition directly.
Disable allowMissingTagName and handle Soy Element Composition directly. This also adds a case in closetag.js to handle autocompletes for soy element composition.
Right now, if you were to do something like
<{foo()}>
it would autocomplet with . This change makes it autocomplete with >
* Update indentation rules for Soy Element Composition
Update indentation rules for Soy Element Composition
* Update soy.js
* Update soy.js
---
mode/soy/soy.js | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/mode/soy/soy.js b/mode/soy/soy.js
index 17bafcd932..e3427ebe3c 100644
--- a/mode/soy/soy.js
+++ b/mode/soy/soy.js
@@ -463,8 +463,15 @@
return null;
case "tag":
- var endTag = state.tag[0] == "/";
- var tagName = endTag ? state.tag.substring(1) : state.tag;
+ var endTag;
+ var tagName;
+ if (state.tag === undefined) {
+ endTag = true;
+ tagName = '';
+ } else {
+ endTag = state.tag[0] == "/";
+ tagName = endTag ? state.tag.substring(1) : state.tag;
+ }
var tag = tags[tagName];
if (stream.match(/^\/?}/)) {
var selfClosed = stream.current() == "/}";
@@ -576,12 +583,11 @@
return "keyword";
} else if (match = stream.match(/^<\{/)) {
state.soyState.push("template-call-expression");
- state.tag = "print";
state.indent += 2 * config.indentUnit;
state.soyState.push("tag");
return "keyword";
} else if (match = stream.match(/^<\/>/)) {
- state.indent -= 2 * config.indentUnit;
+ state.indent -= 1 * config.indentUnit;
return "keyword";
}
From e20f9118534ebbb1249a2316639de5ce675523a8 Mon Sep 17 00:00:00 2001
From: Matt Diehl
Date: Tue, 8 Dec 2020 09:50:20 -0700
Subject: [PATCH 104/342] Remove unnecessary line.
---
mode/verilog/verilog.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/mode/verilog/verilog.js b/mode/verilog/verilog.js
index 544045b867..89fe9c1ac8 100644
--- a/mode/verilog/verilog.js
+++ b/mode/verilog/verilog.js
@@ -144,7 +144,6 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
var keywordClose = curKeyword.substr(0,curKeyword.length - 5) + "end";
openClose[cur] = keywordClose;
curPunc = "newblock";
- } else if (cur.startsWith("`uvm_") && cur.endsWith("_end")) {
} else {
stream.eatSpace();
if (stream.peek() == '(') {
From d096a604db350e678c53bce0b2081e0817b84056 Mon Sep 17 00:00:00 2001
From: Elmar Peise
Date: Thu, 10 Dec 2020 13:44:26 +0100
Subject: [PATCH 105/342] [hardwrap addon] Break an inifite loop
This breaks an infinite loop triggered by wrapping a text containing a word longer than the targed width (e.g., a long URL).
---
addon/wrap/hardwrap.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/addon/wrap/hardwrap.js b/addon/wrap/hardwrap.js
index bccdc8d14c..516368c80d 100644
--- a/addon/wrap/hardwrap.js
+++ b/addon/wrap/hardwrap.js
@@ -91,7 +91,8 @@
}
while (curLine.length > column) {
var bp = findBreakPoint(curLine, column, wrapOn, killTrailing, forceBreak);
- if (bp.from != bp.to || forceBreak) {
+ if (bp.from != bp.to ||
+ forceBreak && leadingSpace !== curLine.slice(0, bp.to)) {
changes.push({text: ["", leadingSpace],
from: Pos(curNo, bp.from),
to: Pos(curNo, bp.to)});
From 7f3c36619f964d20e20c0ff5bec9cee99dae1549 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Fri, 11 Dec 2020 07:48:40 +0100
Subject: [PATCH 106/342] Fix platform detection for iPadOS Safari
See https://github.com/ProseMirror/prosemirror/issues/1111
---
src/util/browser.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/util/browser.js b/src/util/browser.js
index 9fc4602c68..6e3022e765 100644
--- a/src/util/browser.js
+++ b/src/util/browser.js
@@ -17,7 +17,7 @@ export let safari = /Apple Computer/.test(navigator.vendor)
export let mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent)
export let phantom = /PhantomJS/.test(userAgent)
-export let ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent)
+export let ios = !edge && /AppleWebKit/.test(userAgent) && (/Mobile\/\w+/.test(userAgent) || navigator.maxTouchPoints > 2)
export let android = /Android/.test(userAgent)
// This is woefully incomplete. Suggestions for alternative methods welcome.
export let mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent)
From e4784f6e9c34f4642791ecf622640c81b91f37fa Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Tue, 15 Dec 2020 08:28:52 +0100
Subject: [PATCH 107/342] [javascript mode] Allow separator-less object types
Issue #6520
---
mode/javascript/javascript.js | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/mode/javascript/javascript.js b/mode/javascript/javascript.js
index 63eaa241b7..188dbf217c 100644
--- a/mode/javascript/javascript.js
+++ b/mode/javascript/javascript.js
@@ -616,13 +616,18 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
if (value == "|" || value == "&") return cont(typeexpr)
if (type == "string" || type == "number" || type == "atom") return cont(afterType);
if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType)
- if (type == "{") return cont(pushlex("}"), commasep(typeprop, "}", ",;"), poplex, afterType)
+ if (type == "{") return cont(pushlex("}"), typeprops, poplex, afterType)
if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType, afterType)
if (type == "<") return cont(commasep(typeexpr, ">"), typeexpr)
}
function maybeReturnType(type) {
if (type == "=>") return cont(typeexpr)
}
+ function typeprops(type) {
+ if (type == "}") return cont()
+ if (type == "," || type == ";") return cont(typeprops)
+ return pass(typeprop, typeprops)
+ }
function typeprop(type, value) {
if (type == "variable" || cx.style == "keyword") {
cx.marked = "property"
From 7faab336a4b644eb4d8ff34d2eb1d96d912f7fa7 Mon Sep 17 00:00:00 2001
From: Kim-Anh Tran
Date: Fri, 18 Dec 2020 05:27:35 +0100
Subject: [PATCH 108/342] [wast mode] Update to reflect latest reference-types
spec
---
mode/wast/test.js | 25 ++++++++++++++++++++++---
mode/wast/wast.js | 4 ++--
2 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/mode/wast/test.js b/mode/wast/test.js
index 9998cfd965..3e5137c072 100644
--- a/mode/wast/test.js
+++ b/mode/wast/test.js
@@ -21,7 +21,8 @@
'[string "foo #\\"# bar"]');
MT('atom-test',
- '[atom anyfunc]',
+ '[atom funcref]',
+ '[atom externref]',
'[atom i32]',
'[atom i64]',
'[atom f32]',
@@ -42,9 +43,11 @@
'[keyword br_table] [variable-2 $label0] [variable-2 $label1] [variable-2 $label3]',
'[keyword return]',
'[keyword call] [variable-2 $func0]',
- '[keyword call_indirect] ([keyword param] [atom f32] [atom f64]) ([keyword result] [atom i32] [atom i64])',
+ '[keyword call_indirect] [variable-2 $table] ([keyword param] [atom f32] [atom f64]) ([keyword result] [atom i32] [atom i64])',
'[keyword return_call] [variable-2 $func0]',
- '[keyword return_call_indirect] ([keyword param] [atom f32] [atom f64]) ([keyword result] [atom i32] [atom i64])');
+ '[keyword return_call_indirect] ([keyword param] [atom f32] [atom f64]) ([keyword result] [atom i32] [atom i64])',
+ '[keyword select] ([keyword local.get] [number 1]) ([keyword local.get] [number 2]) ([keyword local.get] [number 3])');
+
MT('memory-instructions',
'[keyword i32.load] [keyword offset]=[number 4] [keyword align]=[number 4]',
@@ -318,4 +321,20 @@
'[keyword i32x4.trunc_sat_f32x4_u]',
'[keyword f32x4.convert_i32x4_s]',
'[keyword f32x4.convert_i32x4_u]');
+
+ MT('reference-type-instructions',
+ '[keyword ref.null] [keyword extern]',
+ '[keyword ref.null] [keyword func]',
+ '[keyword ref.is_null] ([keyword ref.func] [variable-2 $f])',
+ '[keyword ref.func] [variable-2 $f]');
+
+ MT('table-instructions',
+ '[keyword table.get] [variable-2 $t] ([keyword i32.const] [number 5])',
+ '[keyword table.set] [variable-2 $t] ([keyword i32.const] [number 5]) ([keyword ref.func] [variable-2 $f])',
+ '[keyword table.size] [variable-2 $t]',
+ '[keyword table.grow] [variable-2 $t] ([keyword ref.null] [keyword extern]) ([keyword i32.const] [number 5])',
+ '[keyword table.fill] [variable-2 $t] ([keyword i32.const] [number 5]) ([keyword param] [variable-2 $r] [atom externref]) ([keyword i32.const] [number 5])',
+ '[keyword table.init] [variable-2 $t] [number 1] ([keyword i32.const] [number 5]) ([keyword i32.const] [number 10]) ([keyword i32.const] [number 15])',
+ '[keyword table.copy] [variable-2 $t] [variable-2 $t2] ([keyword i32.const] [number 5]) ([keyword i32.const] [number 10]) ([keyword i32.const] [number 15])'
+ );
})();
diff --git a/mode/wast/wast.js b/mode/wast/wast.js
index 9348ad3e0a..a730d39efc 100644
--- a/mode/wast/wast.js
+++ b/mode/wast/wast.js
@@ -14,8 +14,8 @@
CodeMirror.defineSimpleMode('wast', {
start: [
{regex: /[+\-]?(?:nan(?::0x[0-9a-fA-F]+)?|infinity|inf|0x[0-9a-fA-F]+\.?[0-9a-fA-F]*p[+\/-]?\d+|\d+(?:\.\d*)?[eE][+\-]?\d*|\d+\.\d*|0x[0-9a-fA-F]+|\d+)/, token: "number"},
- {regex: /mut|nop|block|if|then|else|loop|br_if|br_table|br|call(_indirect)?|drop|end|return(_call(_indirect)?)?|local\.(get|set|tee)|global\.(get|set)|i(32|64)\.(store(8|16)|(load(8|16)_[su]))|i64\.(load32_[su]|store32)|[fi](32|64)\.(const|load|store)|f(32|64)\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)|i(32|64)\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)|i64\.extend_[su]_i32|i32\.wrap_i64|i(32|64)\.trunc_f(32|64)_[su]|f(32|64)\.convert_i(32|64)_[su]|f64\.promote_f32|f32\.demote_f64|f32\.reinterpret_i32|i32\.reinterpret_f32|f64\.reinterpret_i64|i64\.reinterpret_f64|select|unreachable|current_memory|memory(\.((atomic\.(notify|wait(32|64)))|grow|size))?|type|func|param|result|local|global|module|table|start|elem|data|align|offset|import|export|i64\.atomic\.(load32_u|store32|rmw32\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)|i(32|64)\.atomic\.(load((8|16)_u)?|store(8|16)?|rmw(\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))|v128\.(load|store|const|not|andnot|and|or|xor|bitselect)|i(8x16|16x8|32x4|64x2)\.(shl|shr_[su])|i(8x16|16x8)\.(extract_lane_[su]|((add|sub)_saturate_[su])|avgr_u)|(i(8x16|16x8|32x4|64x2)|f(32x4|64x2))\.(splat|replace_lane|neg|add|sub)|i(8x16|16x8|32x4)\.(eq|ne|([lg][te]_[su])|abs|any_true|all_true|bitmask|((min|max)_[su]))|f(32x4|64x2)\.(eq|ne|[lg][te]|abs|sqrt|mul|div|min|max)|[fi](32x4|64x2)\.extract_lane|v8x16\.(shuffle|swizzle)|i16x8\.(load8x8_[su]|narrow_i32x4_[su]|widen_(low|high)_i8x16_[su]|mul)|i32x4\.(load16x4_[su]|widen_(low|high)_i16x8_[su]|mul|trunc_sat_f32x4_[su])|i64x2\.(load32x2_[su]|mul)|(v(8x16|16x8|32x4|64x2)\.load_splat)|i8x16\.narrow_i16x8_[su]|f32x4\.convert_i32x4_[su]/, token: "keyword"},
- {regex: /\b(anyfunc|[fi](32|64))\b/, token: "atom"},
+ {regex: /mut|nop|block|if|then|else|loop|br_if|br_table|br|call(_indirect)?|drop|end|return(_call(_indirect)?)?|local\.(get|set|tee)|global\.(get|set)|i(32|64)\.(store(8|16)|(load(8|16)_[su]))|i64\.(load32_[su]|store32)|[fi](32|64)\.(const|load|store)|f(32|64)\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)|i(32|64)\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)|i64\.extend_[su]_i32|i32\.wrap_i64|i(32|64)\.trunc_f(32|64)_[su]|f(32|64)\.convert_i(32|64)_[su]|f64\.promote_f32|f32\.demote_f64|f32\.reinterpret_i32|i32\.reinterpret_f32|f64\.reinterpret_i64|i64\.reinterpret_f64|select|unreachable|current_memory|memory(\.((atomic\.(notify|wait(32|64)))|grow|size))?|type|\bfunc\b|param|result|local|global|module|start|elem|data|align|offset|import|export|i64\.atomic\.(load32_u|store32|rmw32\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)|i(32|64)\.atomic\.(load((8|16)_u)?|store(8|16)?|rmw(\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))|v128\.(load|store|const|not|andnot|and|or|xor|bitselect)|i(8x16|16x8|32x4|64x2)\.(shl|shr_[su])|i(8x16|16x8)\.(extract_lane_[su]|((add|sub)_saturate_[su])|avgr_u)|(i(8x16|16x8|32x4|64x2)|f(32x4|64x2))\.(splat|replace_lane|neg|add|sub)|i(8x16|16x8|32x4)\.(eq|ne|([lg][te]_[su])|abs|any_true|all_true|bitmask|((min|max)_[su]))|f(32x4|64x2)\.(eq|ne|[lg][te]|abs|sqrt|mul|div|min|max)|[fi](32x4|64x2)\.extract_lane|v8x16\.(shuffle|swizzle)|i16x8\.(load8x8_[su]|narrow_i32x4_[su]|widen_(low|high)_i8x16_[su]|mul)|i32x4\.(load16x4_[su]|widen_(low|high)_i16x8_[su]|mul|trunc_sat_f32x4_[su])|i64x2\.(load32x2_[su]|mul)|(v(8x16|16x8|32x4|64x2)\.load_splat)|i8x16\.narrow_i16x8_[su]|f32x4\.convert_i32x4_[su]|ref\.(func|(is_)?null)|\bextern\b|table(\.(size|get|set|size|grow|fill|init|copy))?/, token: "keyword"},
+ {regex: /\b(funcref|externref|[fi](32|64))\b/, token: "atom"},
{regex: /\$([a-zA-Z0-9_`\+\-\*\/\\\^~=<>!\?@#$%&|:\.]+)/, token: "variable-2"},
{regex: /"(?:[^"\\\x00-\x1f\x7f]|\\[nt\\'"]|\\[0-9a-fA-F][0-9a-fA-F])*"/, token: "string"},
{regex: /\(;.*?/, token: "comment", next: "comment"},
From abc65fe746384652c36c027ff73b95f17d262378 Mon Sep 17 00:00:00 2001
From: nathanlesage
Date: Thu, 17 Dec 2020 09:15:10 +0100
Subject: [PATCH 109/342] Document singleCursorHeightPerLine option
---
doc/manual.html | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/doc/manual.html b/doc/manual.html
index 89a6328e6d..ad5c275d50 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -512,6 +512,15 @@ Configuration
which causes the cursor to not reach all the way to the bottom
of the line, looks better
+ singleCursorHeightPerLine: boolean
+ - Determines if CodeMirror can expect all lines to be of the
+ same height (
true
, the default) and the cursor-size
+ can therefore be lazily evaluated. In case your editor contains
+ multiple line-sizes, for instance, if addLineClass
+ sets classes which contain line-height
-rules, you
+ should consider setting this to false
to prevent
+ visual artefacts.
+
- Controls whether, when the context menu is opened with a
click outside of the current selection, the cursor is moved to
From ee414661b9099e9c122f40b8408b841801f37ed9 Mon Sep 17 00:00:00 2001
From: Hendrik Erz
Date: Sat, 19 Dec 2020 21:05:56 +0100
Subject: [PATCH 110/342] Update description of singleCursorHeightPerLine
---
doc/manual.html | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/doc/manual.html b/doc/manual.html
index ad5c275d50..06ee3dbf18 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -513,13 +513,13 @@
Configuration
of the line, looks better
singleCursorHeightPerLine: boolean
- - Determines if CodeMirror can expect all lines to be of the
- same height (
true
, the default) and the cursor-size
- can therefore be lazily evaluated. In case your editor contains
- multiple line-sizes, for instance, if addLineClass
- sets classes which contain line-height
-rules, you
- should consider setting this to false
to prevent
- visual artefacts.
+ - If set to
true
(the default), CodeMirror will
+ calculate the cursor height from the adjacent characters or
+ text markers. If set to false
, the cursor height
+ will be calculated based off the height of all bounding boxes
+ on the current (wrapped) line, keeping the height consistent.
+ This is visible especially if you use text markers that are
+ bigger than the font-size of the characters on the line.
- Controls whether, when the context menu is opened with a
From a90d0f8e992b6fa9232c8982a970305096a28164 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Sun, 20 Dec 2020 11:17:22 +0100
Subject: [PATCH 111/342] [manual] Correct documentation for
singleCursorHeightPerLine
Issue #6524
---
doc/manual.html | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/doc/manual.html b/doc/manual.html
index 06ee3dbf18..1086507a91 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -513,13 +513,10 @@
Configuration
of the line, looks better
singleCursorHeightPerLine: boolean
- - If set to
true
(the default), CodeMirror will
- calculate the cursor height from the adjacent characters or
- text markers. If set to false
, the cursor height
- will be calculated based off the height of all bounding boxes
- on the current (wrapped) line, keeping the height consistent.
- This is visible especially if you use text markers that are
- bigger than the font-size of the characters on the line.
+ - If set to
true
(the default), will keep the
+ cursor height constant for an entire line (or wrapped part of a
+ line). When false
, the cursor's height is based on
+ the height of the adjacent reference character.
- Controls whether, when the context menu is opened with a
From e49f2950e9ca59f437db26a2b43e3cc478fc4761 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Sun, 20 Dec 2020 11:48:25 +0100
Subject: [PATCH 112/342] Mark release 5.59.0
---
AUTHORS | 10 ++++++++++
CHANGELOG.md | 18 ++++++++++++++++++
doc/manual.html | 2 +-
doc/releases.html | 11 +++++++++++
index.html | 2 +-
package.json | 2 +-
src/edit/main.js | 2 +-
7 files changed, 43 insertions(+), 4 deletions(-)
diff --git a/AUTHORS b/AUTHORS
index 33d819ed24..95134fa2d5 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -244,6 +244,7 @@ edoroshenko
edsharp
ekhaled
Elisée
+Elmar Peise
elpnt
Emmanuel Schanzer
Enam Mijbah Noor
@@ -363,6 +364,7 @@ Jacob Lee
Jaimin
Jake Peyser
Jakob Miland
+Jakub T. Jankiewicz
Jakub Vrana
Jakub Vrána
James Campos
@@ -466,6 +468,7 @@ Kevin Muret
Kevin Sawicki
Kevin Ushey
Kier Darby
+Kim-Anh Tran
Klaus Silveira
Koh Zi Han, Cliff
komakino
@@ -547,6 +550,7 @@ Mason Malone
Mateusz Paprocki
Mathias Bynens
mats cronqvist
+Matt Diehl
Matt Gaide
Matthew Bauer
Matthew Beale
@@ -604,6 +608,7 @@ Miraculix87
misfo
mkaminsky11
mloginov
+mlsad3
Moritz Schubotz (physikerwelt)
Moritz Schwörer
Moshe Wajnberg
@@ -614,6 +619,7 @@ Mu-An ✌️ Chiou
Mu-An Chiou
mzabuawala
Narciso Jaramillo
+nathanlesage
Nathan Williams
ndr
Neil Anderson
@@ -692,6 +698,7 @@ Philip Stadermann
Pi Delport
Pierre Gerold
Pieter Ouwerkerk
+Piyush
Pontus Melke
prasanthj
Prasanth J
@@ -699,6 +706,7 @@ Prayag Verma
prendota
Prendota
Qiang Li
+quiddity-wp
Radek Piórkowski
Rahul
Rahul Anand
@@ -759,6 +767,7 @@ Scott Aikin
Scott Feeney
Scott Goodhew
Seb35
+Sebastian Ślepowroński
Sebastian Wilzbach
Sebastian Zaha
Seren D
@@ -779,6 +788,7 @@ Siamak Mokhtari
Siddhartha Gunti
silverwind
Simon Edwards
+Simon Huber
sinkuu
snasa
soliton4
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2b00dbd80e..9276146f78 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,21 @@
+## 5.59.0 (2020-12-20)
+
+### Bug fixes
+
+Fix platform detection on recent iPadOS.
+
+[lint addon](https://codemirror.net/doc/manual.html#addon_lint): Don't show duplicate messages for a given line.
+
+[clojure mode](https://codemirror.net/mode/clojure/index.html): Fix regexp that matched in exponential time for some inputs.
+
+[hardwrap addon](https://codemirror.net/doc/manual.html#addon_hardwrap): Improve handling of words that are longer than the line length.
+
+[matchbrackets addon](https://codemirror.net/doc/manual.html#addon_matchbrackets): Fix leaked event handler on disabling the addon.
+
+### New features
+
+[search addon](https://codemirror.net/demo/search/): Make it possible to configure the search addon to show the dialog at the bottom of the editor.
+
## 5.58.3 (2020-11-19)
### Bug fixes
diff --git a/doc/manual.html b/doc/manual.html
index 1086507a91..b7ca9a6972 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -70,7 +70,7 @@
User manual and reference guide
- version 5.58.3
+ version 5.59.0
CodeMirror is a code-editor component that can be embedded in
diff --git a/doc/releases.html b/doc/releases.html
index 1b4f9a7976..18987f5ea2 100644
--- a/doc/releases.html
+++ b/doc/releases.html
@@ -30,6 +30,17 @@
Release notes and version history
Version 5.x
+ 20-12-2020: Version 5.59.0:
+
+
+ - Fix platform detection on recent iPadOS.
+ - lint addon: Don't show duplicate messages for a given line.
+ - clojure mode: Fix regexp that matched in exponential time for some inputs.
+ - hardwrap addon: Improve handling of words that are longer than the line length.
+ - matchbrackets addon: Fix leaked event handler on disabling the addon.
+ - search addon: Make it possible to configure the search addon to show the dialog at the bottom of the editor.
+
+
19-11-2020: Version 5.58.3:
diff --git a/index.html b/index.html
index 7ea8c48961..849447a578 100644
--- a/index.html
+++ b/index.html
@@ -99,7 +99,7 @@ This is CodeMirror
- Get the current version:
5.58.3.
+ Get the current version:
5.59.0.
You can see the
code,
read the
release notes,
or study the
user manual.
diff --git a/package.json b/package.json
index a768858ec8..321a46c1d6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "codemirror",
- "version": "5.58.3",
+ "version": "5.59.0",
"main": "lib/codemirror.js",
"style": "lib/codemirror.css",
"author": {
diff --git a/src/edit/main.js b/src/edit/main.js
index d51192c6e5..6550214906 100644
--- a/src/edit/main.js
+++ b/src/edit/main.js
@@ -66,4 +66,4 @@ import { addLegacyProps } from "./legacy.js"
addLegacyProps(CodeMirror)
-CodeMirror.version = "5.58.3"
+CodeMirror.version = "5.59.0"
From ffa872e4d5a7b01cc148099322ef376bd6ada5a3 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Mon, 21 Dec 2020 08:57:43 +0100
Subject: [PATCH 113/342] [closebrackets addon] Fix left-to-right assumption
Closes #6527
---
addon/edit/closebrackets.js | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/addon/edit/closebrackets.js b/addon/edit/closebrackets.js
index 4415c39381..f2239fdd12 100644
--- a/addon/edit/closebrackets.js
+++ b/addon/edit/closebrackets.js
@@ -87,7 +87,7 @@
cm.operation(function() {
var linesep = cm.lineSeparator() || "\n";
cm.replaceSelection(linesep + linesep, null);
- cm.execCommand("goCharLeft");
+ moveSel(cm, -1)
ranges = cm.listSelections();
for (var i = 0; i < ranges.length; i++) {
var line = ranges[i].head.line;
@@ -97,6 +97,17 @@
});
}
+ function moveSel(cm, dir) {
+ let newRanges = [], ranges = cm.listSelections(), primary = 0
+ for (let i = 0; i < ranges.length; i++) {
+ let range = ranges[i]
+ if (range.head == cm.getCursor()) primary = i
+ let pos = {line: range.head.line, ch: range.head.ch + dir}
+ newRanges.push({anchor: pos, head: pos})
+ }
+ cm.setSelections(newRanges, primary)
+ }
+
function contractSelection(sel) {
var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0;
return {anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)),
@@ -153,10 +164,9 @@
var right = pos % 2 ? ch : pairs.charAt(pos + 1);
cm.operation(function() {
if (type == "skip") {
- cm.execCommand("goCharRight");
+ moveSel(cm, 1)
} else if (type == "skipThree") {
- for (var i = 0; i < 3; i++)
- cm.execCommand("goCharRight");
+ moveSel(cm, 3)
} else if (type == "surround") {
var sels = cm.getSelections();
for (var i = 0; i < sels.length; i++)
@@ -169,10 +179,10 @@
} else if (type == "both") {
cm.replaceSelection(left + right, null);
cm.triggerElectric(left + right);
- cm.execCommand("goCharLeft");
+ moveSel(cm, -1)
} else if (type == "addFour") {
cm.replaceSelection(left + left + left + left, "before");
- cm.execCommand("goCharRight");
+ moveSel(cm, 1)
}
});
}
From ff70b4e2d1139b052064ec73e4d1ad86cf56d36c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20dBruxelles?=
<18559798+jdbruxelles@users.noreply.github.com>
Date: Mon, 21 Dec 2020 08:58:32 +0100
Subject: [PATCH 114/342] [release notes] Fix the search addon page link
Simply add the .html extension to the link.
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9276146f78..c1ffa87816 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,7 +14,7 @@ Fix platform detection on recent iPadOS.
### New features
-[search addon](https://codemirror.net/demo/search/): Make it possible to configure the search addon to show the dialog at the bottom of the editor.
+[search addon](https://codemirror.net/demo/search.html): Make it possible to configure the search addon to show the dialog at the bottom of the editor.
## 5.58.3 (2020-11-19)
From 885daa14aad5dd35a537cdadea7e01300374aeea Mon Sep 17 00:00:00 2001
From: Yash Singh
Date: Mon, 21 Dec 2020 00:04:40 -0800
Subject: [PATCH 115/342] Defined the webmanifest MIME (#6529)
---
mode/javascript/javascript.js | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/mode/javascript/javascript.js b/mode/javascript/javascript.js
index 188dbf217c..cfcd6cb6ed 100644
--- a/mode/javascript/javascript.js
+++ b/mode/javascript/javascript.js
@@ -930,9 +930,10 @@ CodeMirror.defineMIME("text/ecmascript", "javascript");
CodeMirror.defineMIME("application/javascript", "javascript");
CodeMirror.defineMIME("application/x-javascript", "javascript");
CodeMirror.defineMIME("application/ecmascript", "javascript");
-CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
-CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true});
-CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true});
+CodeMirror.defineMIME("application/json", { name: "javascript", json: true });
+CodeMirror.defineMIME("application/x-json", { name: "javascript", json: true });
+CodeMirror.defineMIME("application/manifest+json", { name: "javascript", json: true })
+CodeMirror.defineMIME("application/ld+json", { name: "javascript", jsonld: true });
CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });
From c58ccada2ddfb064149237cb7f59ce73176b376a Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Mon, 21 Dec 2020 09:07:47 +0100
Subject: [PATCH 116/342] Fix ES6 use in addon
---
addon/edit/closebrackets.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/addon/edit/closebrackets.js b/addon/edit/closebrackets.js
index f2239fdd12..19a3c53c1f 100644
--- a/addon/edit/closebrackets.js
+++ b/addon/edit/closebrackets.js
@@ -98,11 +98,11 @@
}
function moveSel(cm, dir) {
- let newRanges = [], ranges = cm.listSelections(), primary = 0
+ var newRanges = [], ranges = cm.listSelections(), primary = 0
for (let i = 0; i < ranges.length; i++) {
- let range = ranges[i]
+ var range = ranges[i]
if (range.head == cm.getCursor()) primary = i
- let pos = {line: range.head.line, ch: range.head.ch + dir}
+ var pos = {line: range.head.line, ch: range.head.ch + dir}
newRanges.push({anchor: pos, head: pos})
}
cm.setSelections(newRanges, primary)
From f18854ef817b831419b5b3353197b403b7a9b8b8 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Mon, 21 Dec 2020 12:44:06 +0100
Subject: [PATCH 117/342] Remove another let in an addon
---
addon/edit/closebrackets.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addon/edit/closebrackets.js b/addon/edit/closebrackets.js
index 19a3c53c1f..5c1aeab3c5 100644
--- a/addon/edit/closebrackets.js
+++ b/addon/edit/closebrackets.js
@@ -99,7 +99,7 @@
function moveSel(cm, dir) {
var newRanges = [], ranges = cm.listSelections(), primary = 0
- for (let i = 0; i < ranges.length; i++) {
+ for (var i = 0; i < ranges.length; i++) {
var range = ranges[i]
if (range.head == cm.getCursor()) primary = i
var pos = {line: range.head.line, ch: range.head.ch + dir}
From c88d09d0ca8b6c2f88b4432094d72e4be757b4a3 Mon Sep 17 00:00:00 2001
From: Masahiro MATAYOSHI
Date: Tue, 22 Dec 2020 16:52:16 +0900
Subject: [PATCH 118/342] [perl mode] Don't treat <<1 as here document start
---
mode/perl/perl.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mode/perl/perl.js b/mode/perl/perl.js
index a3101a7c5b..f620b41e27 100644
--- a/mode/perl/perl.js
+++ b/mode/perl/perl.js
@@ -516,7 +516,7 @@ CodeMirror.defineMode("perl",function(){
if(stream.match(/^\-?[\d\.]/,false))
if(stream.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/))
return 'number';
- if(stream.match(/^<<(?=\w)/)){ // NOTE: <
Date: Wed, 23 Dec 2020 08:22:14 +0100
Subject: [PATCH 119/342] Try to refine iPadOS/iOS detection
Issue #6532
---
src/util/browser.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/util/browser.js b/src/util/browser.js
index 6e3022e765..ae9d6af706 100644
--- a/src/util/browser.js
+++ b/src/util/browser.js
@@ -17,7 +17,7 @@ export let safari = /Apple Computer/.test(navigator.vendor)
export let mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent)
export let phantom = /PhantomJS/.test(userAgent)
-export let ios = !edge && /AppleWebKit/.test(userAgent) && (/Mobile\/\w+/.test(userAgent) || navigator.maxTouchPoints > 2)
+export let ios = safari && (/Mobile\/\w+/.test(userAgent) || navigator.maxTouchPoints > 2)
export let android = /Android/.test(userAgent)
// This is woefully incomplete. Suggestions for alternative methods welcome.
export let mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent)
From d8d78f5e7aa07e682bf51ad94a75ba6bb2484794 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Wed, 23 Dec 2020 08:29:43 +0100
Subject: [PATCH 120/342] [panel addon] Preserve scroll post when
initializing/removing panel wrapper
Closes #6533
---
addon/display/panel.js | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/addon/display/panel.js b/addon/display/panel.js
index 4c9f2c0fca..29f7e0bebb 100644
--- a/addon/display/panel.js
+++ b/addon/display/panel.js
@@ -76,7 +76,7 @@
};
function initPanels(cm) {
- var wrap = cm.getWrapperElement();
+ var wrap = cm.getWrapperElement()
var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle;
var height = parseInt(style.height);
var info = cm.state.panels = {
@@ -84,9 +84,10 @@
panels: [],
wrapper: document.createElement("div")
};
+ var hasFocus = cm.hasFocus(), scrollPos = cm.getScrollInfo()
wrap.parentNode.insertBefore(info.wrapper, wrap);
- var hasFocus = cm.hasFocus();
info.wrapper.appendChild(wrap);
+ cm.scrollTo(scrollPos.left, scrollPos.top)
if (hasFocus) cm.focus();
cm._setSize = cm.setSize;
@@ -114,8 +115,11 @@
var info = cm.state.panels;
cm.state.panels = null;
- var wrap = cm.getWrapperElement();
+ var wrap = cm.getWrapperElement()
+ var hasFocus = cm.hasFocus(), scrollPos = cm.getScrollInfo()
info.wrapper.parentNode.replaceChild(wrap, info.wrapper);
+ cm.scrollTo(scrollPos.left, scrollPos.top)
+ if (hasFocus) cm.focus();
wrap.style.height = info.setHeight;
cm.setSize = cm._setSize;
cm.setSize();
From 3ce2ef56989085002e6ac4078b0f580ab5fcc4ad Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Wed, 23 Dec 2020 16:46:53 +0100
Subject: [PATCH 121/342] [perl mode] Don't include brackets in variable names
Closes #6534
---
mode/perl/perl.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mode/perl/perl.js b/mode/perl/perl.js
index f620b41e27..220b0a6994 100644
--- a/mode/perl/perl.js
+++ b/mode/perl/perl.js
@@ -697,7 +697,7 @@ CodeMirror.defineMode("perl",function(){
return "variable-2";}
stream.pos=p;}
if(/[$@%&]/.test(ch)){
- if(stream.eatWhile(/[\w$\[\]]/)||stream.eat("{")&&stream.eatWhile(/[\w$\[\]]/)&&stream.eat("}")){
+ if(stream.eatWhile(/[\w$]/)||stream.eat("{")&&stream.eatWhile(/[\w$]/)&&stream.eat("}")){
var c=stream.current();
if(PERL[c])
return "variable-2";
From d4a1a1a5d8648508c314ffb20fc700333f9ab5de Mon Sep 17 00:00:00 2001
From: "Dinindu D. Wanniarachchi"
Date: Sat, 26 Dec 2020 19:15:17 +0530
Subject: [PATCH 122/342] [real-world uses] Changed SASS2CSS url
---
doc/realworld.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/realworld.html b/doc/realworld.html
index c6e6c80323..487208b286 100644
--- a/doc/realworld.html
+++ b/doc/realworld.html
@@ -157,7 +157,7 @@ CodeMirror real-world uses
- RealTime.io (Internet-of-Things infrastructure)
- Refork (animation demo gallery and sharing)
- SageMathCell (interactive mathematical software)
- - SASS2CSS (SASS, SCSS or LESS to CSS converter and CSS beautifier)
+ - SASS2CSS (SASS, SCSS or LESS to CSS converter and CSS beautifier)
- SageMathCloud (interactive mathematical software environment)
- salvare (real-time collaborative code editor)
- ServePHP (PHP code testing in Chrome dev tools)
From 90e1c26104b2b98aa803b2b98d917b19a32c8720 Mon Sep 17 00:00:00 2001
From: Yash Singh
Date: Tue, 29 Dec 2020 00:05:24 -0800
Subject: [PATCH 123/342] [javascript mode] Mention more MIME types in demo
page
---
mode/javascript/index.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mode/javascript/index.html b/mode/javascript/index.html
index d1f7f68e8a..3023835727 100644
--- a/mode/javascript/index.html
+++ b/mode/javascript/index.html
@@ -110,5 +110,5 @@ JavaScript mode
- MIME types defined: text/javascript
, application/json
, application/ld+json
, text/typescript
, application/typescript
.
+ MIME types defined: text/javascript
, application/javascript
, application/x-javascript
, text/ecmascript
, application/ecmascript
, application/json
, application/x-json
, application/manifest+json
, application/ld+json
, text/typescript
, application/typescript
.
From d2728850abe64849ddd2730dc22536ef1361a90a Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Tue, 29 Dec 2020 09:04:32 +0100
Subject: [PATCH 124/342] [javascript mode] Fix infinite loop on some invalid
syntax
Closes #6542
---
mode/javascript/javascript.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/mode/javascript/javascript.js b/mode/javascript/javascript.js
index cfcd6cb6ed..8191c4d925 100644
--- a/mode/javascript/javascript.js
+++ b/mode/javascript/javascript.js
@@ -640,6 +640,8 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
return cont(expect("variable"), maybetypeOrIn, expect("]"), typeprop)
} else if (type == "(") {
return pass(functiondecl, typeprop)
+ } else {
+ return cont()
}
}
function typearg(type, value) {
From 4d5da83c1493cf5dec219ecb637adc69e468ea5d Mon Sep 17 00:00:00 2001
From: Yash-Singh1
Date: Mon, 28 Dec 2020 11:28:36 -0800
Subject: [PATCH 125/342] Prefer dot syntax in test
---
test/test.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/test/test.js b/test/test.js
index 2a5101f4e1..07fa67858f 100644
--- a/test/test.js
+++ b/test/test.js
@@ -1807,8 +1807,8 @@ testCM("atomicMarker", function(cm) {
inclusiveRight: ri
};
- if (ls === true || ls === false) options["selectLeft"] = ls;
- if (rs === true || rs === false) options["selectRight"] = rs;
+ if (ls === true || ls === false) options.selectLeft = ls;
+ if (rs === true || rs === false) options.selectRight = rs;
return cm.markText(Pos(ll, cl), Pos(lr, cr), options);
}
From 863c18904febf364876494ee650ced49c3b08bd9 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Tue, 29 Dec 2020 09:27:13 +0100
Subject: [PATCH 126/342] [javascript mode] Make sure type props don't consume
closing braces
---
mode/javascript/javascript.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mode/javascript/javascript.js b/mode/javascript/javascript.js
index 8191c4d925..966ffef063 100644
--- a/mode/javascript/javascript.js
+++ b/mode/javascript/javascript.js
@@ -640,7 +640,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
return cont(expect("variable"), maybetypeOrIn, expect("]"), typeprop)
} else if (type == "(") {
return pass(functiondecl, typeprop)
- } else {
+ } else if (!type.match(/[;\}\)\],]/)) {
return cont()
}
}
From 37d7b2efceb192c94811a13b2b7b3eec4b786608 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Tue, 29 Dec 2020 18:10:02 +0100
Subject: [PATCH 127/342] Fix moving backwards across astral chars
Closes #6544
---
src/edit/methods.js | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/src/edit/methods.js b/src/edit/methods.js
index a5e2afc39f..eb8f8d28dc 100644
--- a/src/edit/methods.js
+++ b/src/edit/methods.js
@@ -480,9 +480,12 @@ function findPosH(doc, pos, dir, unit, visually) {
let next
if (unit == "codepoint") {
let ch = lineObj.text.charCodeAt(pos.ch + (unit > 0 ? 0 : -1))
- if (isNaN(ch)) next = null
- else next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (ch >= 0xD800 && ch < 0xDC00 ? 2 : 1))),
- -dir)
+ if (isNaN(ch)) {
+ next = null
+ } else {
+ let astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF
+ next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir)
+ }
} else if (visually) {
next = moveVisually(doc.cm, lineObj, pos, dir)
} else {
From 5e25c3ce3026d7be3e98b8653f1aa171333d43ca Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Wed, 30 Dec 2020 09:21:06 +0100
Subject: [PATCH 128/342] [sponsors] Add Execute Program logo
---
index.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/index.html b/index.html
index 849447a578..9631b88366 100644
--- a/index.html
+++ b/index.html
@@ -203,6 +203,7 @@ Sponsors
![CodePen](data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 138 26"><path fill="none" stroke="black" stroke-width="2.3" stroke-linecap="round" stroke-linejoin="round" d="M15 8a7 7 0 100 10m7-8.7L33 2l11 7.3v7.4L33 24l-11-7.3zm0 0l11 7.4 11-7.4m0 7.4L33 9.3l-11 7.4M33 2v7.3m0 7.4V24M52 6h5a7 7 0 010 14h-5zm28 0h-9v14h9m-9-7h6m11 1h6a4 4 0 000-8h-6v14m26-14h-9v14h9m-9-7h6m11 7V6l11 14V6"/></svg>)
![desmos](data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 107.05 22.17" fill="%23187a3d"%3E%3Cpath d="M89.91 7.50c-1.62-1.67-3.64-2.53-5.98-2.53-2.34 0-4.36.85-5.99 2.53s-2.45 3.73-2.45 6.1a8.4 8.4 0 0 0 2.43 6.02 8.13 8.13 0 0 0 6.02 2.51c2.37 0 4.4-.85 6-2.51 1.6-1.68 2.43-3.7 2.43-6.05a8.41 8.41 0 0 0-2.46-6.07m-5.98.41c1.47 0 2.72.56 3.81 1.68a5.6 5.6 0 0 1 1.61 4.01c0 1.58-.52 2.88-1.6 3.98-1.06 1.1-2.32 1.63-3.87 1.63-1.53 0-2.8-.53-3.82-1.61-1.05-1.1-1.56-2.4-1.56-3.97 0-1.58.53-2.90 1.61-4.05 1.07-1.13 2.32-1.68 3.80-1.68M15.25 0a1.47 1.47 0 0 0-1.44 1.25l-.00 5.78c-1.27-1.12-2.75-1.8-4.42-1.97h-.04c-.10-.01-.22-.01-.32-.03l-.33-.03a10.1 10.1 0 0 0-.76.01l-.06.01c-.11 0-.23.01-.34.02l-.43.04-.09.02-.28.04c-.14.01-.26.06-.41.08a7.94 7.94 0 0 0-3.55 1.98l-.04.02-.37.4-.18.21a7.34 7.34 0 0 0-.52.65 1.78 1.78 0 0 0-.15.21l-.04.06C.46 10.17 0 11.79 0 13.55l.00.44.07.78.05.33.07.33.05.26c.36 1.41 1.08 2.7 2.15 3.80a8.59 8.59 0 0 0 1.38 1.17l.23.15c.03.02.06.03.09.05l.03.01c.19.12.4.22.57.32l.38.17c.99.41 2.09.62 3.26.62h.04l.39-.01a1.36 1.36 0 0 0 .19-.01h.05l.18-.01c.04-.01.09-.01.12-.01a7.86 7.86 0 0 0 4.42-1.93v.67l.00.07a1.47 1.47 0 0 0 1.26 1.24h.38c.73-.1 1.27-.73 1.27-1.46V1.47c0-.8-.65-1.47-1.46-1.47M13.74 13.59c0 1.57-.51 2.85-1.57 3.94s-2.30 1.62-3.82 1.62a5.39 5.39 0 0 1-1.87-.32c-.02-.00-.04-.00-.05-.01l-.07-.03c-.64-.25-1.26-.67-1.79-1.23a5.46 5.46 0 0 1-1.38-2.58c-.1-.43-.14-.88-.14-1.34 0-1.57.51-2.87 1.58-4.01C5.66 8.48 6.9 7.94 8.36 7.94c1.47 0 2.69.54 3.77 1.67 1.1 1.13 1.60 2.43 1.60 3.97m21.89-.36c0-.2-.02-.43-.03-.65-.13-1.25-.52-2.41-1.15-3.45-.34-.57-.75-1.11-1.25-1.62-1.2-1.24-2.64-2.05-4.26-2.37l-.13-.01c-.11-.03-.24-.04-.35-.06l-.52-.05-.33-.02a11.34 11.34 0 0 0-.82 0c-1.50.07-2.88.50-4.08 1.30a7.49 7.49 0 0 0-.50.36l-.63.54-.32.31a8.49 8.49 0 0 0-2.45 6.10c0 1.1.19 2.17.57 3.14.39 1.03 1.02 2 1.86 2.86l.62.59a9.28 9.28 0 0 0 1.00.74l.72.39a8.75 8.75 0 0 0 1.96.64l.43.07.42.04c.13.01.26.02.40.02l.06.00a4.88 4.88 0 0 0 .37.01h.04l.39-.01.28-.01.12-.01a7.97 7.97 0 0 0 5.15-2.47c.32-.33.61-.68.86-1.04a4.51 4.51 0 0 0 .27-.40l.04-.08a1.45 1.45 0 0 0 .10-.53 1.5 1.5 0 0 0-1.50-1.49c-.5 0-.95.24-1.24.65a5.5 5.5 0 0 1-.71.89c-1.05 1.1-2.32 1.63-3.87 1.63-1.53 0-2.78-.53-3.83-1.61a7.25 7.25 0 0 1-.50-.6l-.05-.09c-.12-.18-.24-.36-.36-.60a5.01 5.01 0 0 1-.50-1.49h12.45l.11-.02c.62-.13 1.1-.65 1.16-1.30v-.04l-.01-.24m-13.64-1.11a5.36 5.36 0 0 1 .68-1.57l.04-.07c.2-.30.43-.58.7-.87 1.07-1.13 2.31-1.68 3.79-1.68s2.73.56 3.81 1.68c.50.53.89 1.11 1.17 1.74a5.44 5.44 0 0 1 .25.76zm51.46-1.14v9.57a1.48 1.48 0 0 1-1.48 1.47c-.75 0-1.39-.55-1.47-1.32v-9.68a3.2 3.2 0 0 0-.91-2.30c-.56-.57-1.19-.9-1.93-.94-.06-.01-.14-.01-.22-.01-.84 0-1.53.31-2.13.95a3.19 3.19 0 0 0-.91 2.14v.13l.00.09-.00.02v9.45a1.47 1.47 0 0 1-1.47 1.47 1.47 1.47 0 0 1-1.48-1.32l-.00-.05.01-9.64c-.01-.07-.01-.12-.01-.17-.02-.46-.41-1.37-.41-1.37s-.30-.53-.50-.74c-.60-.63-1.31-.95-2.15-.95-.83 0-1.52.31-2.13.95a3.2 3.2 0 0 0-.92 2.3v9.73a1.48 1.48 0 0 1-1.47 1.28 1.48 1.48 0 0 1-1.47-1.47V6.33c0-.82.66-1.48 1.47-1.48.60 0 1.14.38 1.37.91l.32-.21a5.89 5.89 0 0 1 2.83-.7c1.5 0 2.82.5 3.92 1.46a3.73 3.73 0 0 1 .34.34l.27.28.26-.28.35-.34a5.76 5.76 0 0 1 3.90-1.46l.50.02c1.3.1 2.45.58 3.42 1.46l.34.33a5.99 5.99 0 0 1 1.74 4.32"/%3E%3Cpath d="M50.32 17.13c0 2.74-2.21 4.98-4.94 5.03h-5.98a1.45 1.45 0 0 1-1.44-1.45c0-.8.64-1.44 1.45-1.44h5.91a2.13 2.13 0 0 0 2.1-2.13 2.13 2.13 0 0 0-2.12-2.12h-2.86c-2.77 0-5.03-2.24-5.03-5.02a5.04 5.04 0 0 1 5.03-5.03h5.91a1.46 1.46 0 0 1 1.45 1.46 1.46 1.46 0 0 1-1.45 1.44h-5.91c-1.17 0-2.12.95-2.12 2.12 0 1.15.94 2.1 2.1 2.12h.05c.01 0 .04 0 .09-.00h2.73c.70 0 1.39.14 2.03.43a5.04 5.04 0 0 1 3 4.59m56.74-.00c0 2.74-2.22 5-4.95 5.03h-5.98a1.46 1.46 0 0 1-1.45-1.45 1.45 1.45 0 0 1 1.45-1.44h5.9c1.15-.01 2.10-.96 2.10-2.13a2.13 2.13 0 0 0-2.12-2.12h-2.63c-.07.01-.14.01-.22.01-2.77 0-5.03-2.24-5.03-5.03a5.04 5.04 0 0 1 5.03-5.03h5.90a1.47 1.47 0 0 1 1.45 1.46c0 .79-.65 1.45-1.45 1.45h-5.90a2.13 2.13 0 0 0-2.13 2.12 2.14 2.14 0 0 0 2.10 2.12h.05c.01 0 .05 0 .08-.00h2.74a4.87 4.87 0 0 1 2.03.43c1.82.8 3 2.61 3 4.59"/%3E%3C/svg%3E%0A)
+ ![Execute Program](data:image/svg+xml,%3Csvg%20width%3D%22397%22%20height%3D%22109%22%20viewBox%3D%220%200%20397%20109%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill-rule%3D%22nonzero%22%20fill%3D%22none%22%3E%3Cpath%20d%3D%22M169.495%2063.68c2.8%200%205.254.671%207.36%202.015%202.105%201.344%203.688%203.162%204.751%205.453%201.063%202.292%201.594%204.878%201.594%207.76%200%204.408-1.241%208.054-3.724%2010.935-2.483%202.881-5.81%204.322-9.98%204.322-3.953%200-7.18-1.402-9.683-4.206v12.62c0%20.271-.085.489-.254.653a.88.88%200%200%201-.64.247h-4.767a.966.966%200%200%201-.656-.232c-.178-.155-.268-.377-.268-.668V65.188c0-.271.09-.489.268-.653a.932.932%200%200%201%20.656-.247h4.767a.88.88%200%200%201%20.64.247c.17.164.254.382.254.653v3.393h.625c1.986-3.268%205.006-4.902%209.057-4.902zm-.84%2024.874c2.752%200%204.865-.86%206.34-2.578%201.473-1.719%202.21-4.034%202.21-6.947%200-2.874-.737-5.156-2.21-6.846-1.475-1.69-3.588-2.534-6.34-2.534-2.576%200-4.625.855-6.148%202.563-1.524%201.71-2.285%203.986-2.285%206.831s.761%205.141%202.285%206.89c1.523%201.747%203.572%202.62%206.148%202.62zm39.147-24.875c3.374%200%206.111.99%208.213%202.968%202.1%201.978%203.151%204.771%203.151%208.379%200%20.582-.296.902-.888.96l-4.705.64c-.592.097-.917-.165-.977-.786-.138-2.114-.813-3.67-2.027-4.67-1.213-.998-2.836-1.497-4.868-1.497-1.44%200-2.757.266-3.95.8-1.194.533-2.142%201.183-2.842%201.949-.7.766-1.238%201.513-1.613%202.24-.375.727-.562%201.333-.562%201.818v16.147c0%20.271-.084.49-.252.654a.87.87%200%200%201-.636.248h-4.735a.954.954%200%200%201-.651-.233c-.178-.155-.267-.378-.267-.669V65.221c0-.271.09-.49.267-.654a.922.922%200%200%201%20.65-.248h4.47c.552%200%20.858.3.917.902l.237%203.928h.68c1.086-1.571%202.52-2.876%204.306-3.913%201.786-1.038%203.813-1.557%206.082-1.557zm31.331%2030.845c-4.25%200-7.807-1.475-10.673-4.423-2.866-2.95-4.298-6.616-4.298-11s1.432-8.05%204.298-10.999c2.866-2.948%206.423-4.423%2010.673-4.423%202.788%200%205.332.674%207.632%202.021%202.3%201.348%204.103%203.203%205.41%205.566%201.306%202.363%201.959%204.975%201.959%207.835%200%202.861-.653%205.468-1.96%207.821-1.306%202.353-3.109%204.209-5.41%205.566-2.3%201.357-4.843%202.036-7.63%202.036zm-6.43-8.608c1.7%201.759%203.847%202.638%206.445%202.638%202.597%200%204.745-.88%206.444-2.638%201.698-1.759%202.547-4.03%202.547-6.814%200-2.785-.849-5.057-2.547-6.815-1.699-1.759-3.847-2.638-6.444-2.638-2.598%200-4.746.88-6.444%202.638-1.699%201.758-2.548%204.03-2.548%206.815%200%202.784.85%205.055%202.548%206.814zm55.522-21.623c.272%200%20.487.082.642.248.156.165.234.384.234.657v27.976c0%201.772-.302%203.373-.906%204.804-.603%201.431-1.402%202.6-2.395%203.504-.993.906-2.157%201.67-3.49%202.293a16.713%2016.713%200%200%201-4.076%201.314c-1.383.253-2.814.38-4.294.38-2.337%200-4.543-.297-6.617-.891-2.074-.594-3.86-1.397-5.36-2.41-.448-.291-.546-.7-.293-1.226l1.49-2.774c.273-.526.672-.652%201.198-.38%202.707%201.46%205.735%202.19%209.085%202.19%201.169%200%202.293-.116%203.374-.35%201.074-.23%202.107-.62%203.068-1.153a6.016%206.016%200%200%200%202.293-2.235c.564-.953.847-2.073.847-3.358v-3.855c-2.513%203.154-5.726%204.731-9.64%204.731-2.688%200-5.132-.676-7.333-2.03a13.905%2013.905%200%200%201-5.112-5.475c-1.207-2.297-1.811-4.809-1.811-7.534%200-2.726.604-5.237%201.811-7.534%201.208-2.298%202.907-4.123%205.098-5.476%202.19-1.353%204.64-2.03%207.347-2.03%203.856%200%207.03%201.548%209.523%204.644l.175-3.125c.059-.604.36-.905.906-.905h4.236zm-13.596%2023.266c2.408%200%204.424-.894%206.045-2.68%201.622-1.788%202.433-3.898%202.433-6.332%200-2.396-.811-4.477-2.433-6.246-1.621-1.768-3.637-2.652-6.045-2.652-2.428%200-4.452.86-6.074%202.581-1.622%201.72-2.433%203.826-2.433%206.317%200%202.529.811%204.663%202.433%206.402%201.621%201.74%203.646%202.61%206.074%202.61zm40.073-23.88c3.374%200%206.111.99%208.213%202.968%202.1%201.978%203.151%204.771%203.151%208.379%200%20.582-.296.902-.888.96l-4.705.64c-.592.097-.917-.165-.977-.786-.138-2.114-.813-3.67-2.027-4.67-1.213-.998-2.836-1.497-4.868-1.497-1.44%200-2.757.266-3.95.8-1.194.533-2.142%201.183-2.842%201.949-.7.766-1.238%201.513-1.613%202.24-.375.727-.562%201.333-.562%201.818v16.147c0%20.271-.084.49-.252.654a.87.87%200%200%201-.636.248h-4.735a.954.954%200%200%201-.651-.233c-.178-.155-.267-.378-.267-.669V65.221c0-.271.09-.49.267-.654a.922.922%200%200%201%20.65-.248h4.47c.552%200%20.858.3.917.902l.237%203.928h.68c1.086-1.571%202.52-2.876%204.306-3.913%201.786-1.038%203.813-1.557%206.082-1.557zm46.24%2024.74c.393.098.673.22.84.367.167.147.25.377.25.69v3.551c0%20.626-.569.959-1.708.998-2.2.039-3.826-.343-4.877-1.145-1.051-.802-1.577-2.064-1.577-3.785h-.265c-1.493%201.682-3.399%203.008-5.717%203.976-2.318.968-4.577%201.453-6.778%201.453-3.241%200-5.726-.749-7.455-2.245-1.729-1.497-2.593-3.547-2.593-6.149%200-2.621.835-4.656%202.504-6.104%201.67-1.448%204.214-2.416%207.633-2.906l6.984-1.085c1.355-.196%202.347-.401%202.976-.617.629-.215%201.041-.479%201.238-.792-.079-1.957-.649-3.35-1.71-4.182-1.06-.832-2.622-1.247-4.685-1.247-4.302%200-6.65%201.36-7.043%204.079-.059.45-.353.665-.884.646h-4.48c-.647%200-.942-.304-.883-.91.334-3.326%201.66-5.713%203.978-7.161%202.318-1.448%205.452-2.172%209.4-2.172%204.224%200%207.392.959%209.504%202.876%202.112%201.918%203.168%204.706%203.168%208.364v11.035c-.02%201.35.707%202.172%202.18%202.466zm-19.06.135c4.132%200%207.518-1.307%2010.16-3.922v-6.028c-.258.566-1.53%201.024-3.814%201.375l-6.375.995c-1.728.274-2.96.742-3.695%201.405-.735.663-1.102%201.512-1.102%202.546%200%201.132.397%202.02%201.192%202.663.794.644%202.006.966%203.635.966zm48.252-24.875c2.377%200%204.116.796%205.216%202.386%201.1%201.59%201.65%204.248%201.65%207.971v18.59c0%20.272-.079.49-.236.655-.157.165-.383.248-.677.248h-4.244a.948.948%200%200%201-.648-.233c-.177-.155-.265-.378-.265-.669v-18.59c0-1.785-.207-3.036-.62-3.754-.412-.717-1.11-1.076-2.091-1.076-1.042%200-1.886.403-2.535%201.207a5.452%205.452%200%200%200-1.178%202.75v19.463c0%20.271-.079.49-.236.654-.157.165-.383.248-.678.248h-4.155c-.275%200-.496-.078-.663-.233-.167-.155-.25-.378-.25-.669v-18.59c0-1.804-.207-3.06-.62-3.768-.412-.708-1.11-1.062-2.092-1.062-1.04%200-1.88.398-2.52%201.193a5.675%205.675%200%200%200-1.193%202.764v19.463c0%20.271-.083.49-.25.654a.864.864%200%200%201-.634.248h-4.273c-.275%200-.496-.078-.662-.233-.168-.155-.251-.378-.251-.669V65.221c0-.271.083-.49.25-.654.167-.165.388-.248.663-.248h4.008c.57%200%20.874.3.914.902l.147%202.386h.442c.943-2.619%202.898-3.928%205.864-3.928%202.849%200%204.745%201.31%205.688%203.928h.353c1.061-2.619%202.986-3.928%205.776-3.928zM162.091%2016.126c1.86-.801%203.86-1.201%206.001-1.201%202.141%200%204.112.395%205.914%201.186%201.802.791%203.293%201.86%204.475%203.208%201.182%201.347%202.097%202.905%202.746%204.672.65%201.767.974%203.637.974%205.609%200%201.191-.121%202.04-.363%202.549-.243.507-.76.761-1.555.761h-20.807c.33%202.285%201.385%204.106%203.168%205.463%201.782%201.357%204.01%202.036%206.683%202.036%202.693%200%205.134-.84%207.324-2.52.464-.35.881-.341%201.249.03l1.947%201.992c.465.469.465.918%200%201.347-2.983%203.008-6.713%204.511-11.188%204.511-4.572%200-8.287-1.47-11.144-4.408-2.858-2.94-4.287-6.615-4.287-11.029%200-2.148.373-4.164%201.119-6.048.746-1.885%201.763-3.516%203.051-4.892%201.288-1.377%202.853-2.466%204.694-3.266zm5.71%203.774c-2.28%200-4.202.718-5.767%202.154-1.565%201.437-2.502%203.372-2.812%205.806h16.985c-.232-2.414-1.111-4.344-2.638-5.79-1.526-1.447-3.449-2.17-5.767-2.17zm51.123%2022.816c.236.268.3.513.191.733-.107.22-.348.33-.72.33h-5.562c-.47%200-.824-.162-1.06-.488l-8.592-10.002-8.592%2010.002c-.255.326-.618.488-1.089.488h-5.532c-.373%200-.613-.11-.72-.33-.109-.22-.045-.465.19-.733l12.036-13.795-11.212-12.933c-.235-.268-.299-.512-.191-.733.108-.22.348-.33.72-.33h5.504c.47%200%20.833.172%201.088.517l7.798%209.082%207.798-9.082c.255-.325.618-.498%201.089-.517h5.473c.373%200%20.618.105.736.316.117.21.059.46-.177.747l-11.152%2012.933%2011.976%2013.795zm14.101-26.59c1.86-.801%203.86-1.201%206-1.201%202.142%200%204.113.395%205.915%201.186%201.801.791%203.293%201.86%204.475%203.208%201.182%201.347%202.097%202.905%202.746%204.672.65%201.767.974%203.637.974%205.609%200%201.191-.122%202.04-.364%202.549-.242.507-.76.761-1.554.761H230.41c.329%202.285%201.385%204.106%203.167%205.463%201.782%201.357%204.01%202.036%206.684%202.036%202.693%200%205.134-.84%207.323-2.52.465-.35.882-.341%201.25.03l1.947%201.992c.465.469.465.918%200%201.347-2.984%203.008-6.713%204.511-11.189%204.511-4.572%200-8.286-1.47-11.144-4.408-2.858-2.94-4.286-6.615-4.286-11.029%200-2.148.373-4.164%201.118-6.048.746-1.885%201.764-3.516%203.052-4.892%201.288-1.377%202.852-2.466%204.693-3.266zm5.71%203.774c-2.28%200-4.203.718-5.767%202.154-1.566%201.437-2.503%203.372-2.812%205.806h16.984c-.232-2.414-1.11-4.344-2.637-5.79-1.527-1.447-3.45-2.17-5.768-2.17zm37.83%2019.894c3.133%200%205.619-1.191%207.457-3.574.348-.45.745-.527%201.19-.234l3.394%201.962c.542.332.639.733.29%201.201-1.315%202.012-3.06%203.618-5.237%204.819-2.176%201.2-4.58%201.801-7.21%201.801-4.392%200-8.043-1.474-10.955-4.423-2.911-2.949-4.367-6.615-4.367-10.999s1.456-8.05%204.367-11c2.912-2.948%206.563-4.422%2010.954-4.422%202.631%200%205.04.595%207.225%201.787%202.186%201.19%203.927%202.792%205.224%204.803.328.47.232.87-.29%201.202l-3.396%201.991c-.444.274-.841.196-1.19-.234-1.837-2.382-4.323-3.574-7.457-3.574-2.67%200-4.88.884-6.63%202.651-1.75%201.768-2.626%204.033-2.626%206.796s.875%205.028%202.626%206.796c1.75%201.767%203.96%202.65%206.63%202.65zm46.585-24.87c.276%200%20.499.083.666.248.168.165.252.383.252.654v27.379c0%20.271-.084.49-.252.654-.167.165-.39.247-.666.247h-4.475c-.573%200-.88-.3-.919-.901l-.237-3.953h-.652c-1.007%201.608-2.35%202.93-4.03%203.968-1.68%201.036-3.674%201.554-5.986%201.554-3.26%200-5.867-1.056-7.823-3.168-1.956-2.112-2.934-5.067-2.934-8.864V15.826c0-.271.08-.49.237-.654.159-.165.376-.247.652-.247h4.742c.276%200%20.499.082.666.247.168.165.252.383.252.654v15.956c0%202.403.583%204.18%201.749%205.334%201.165%201.153%202.785%201.73%204.86%201.73%201.343%200%202.573-.258%203.689-.771s1.99-1.129%202.623-1.846c.632-.717%201.116-1.4%201.452-2.049.335-.649.503-1.157.503-1.526V15.826c0-.271.08-.49.237-.654.158-.165.376-.247.652-.247h4.742zm37.595%2024.474c.353.446.382.852.088%201.22-.882%201.047-2.172%202.001-3.868%202.863-1.697.862-3.731%201.293-6.104%201.293-8.002%200-12.003-3.932-12.003-11.799V20.537h-7.884a.885.885%200%200%201-.647-.261.864.864%200%200%201-.264-.64v-3.603c0-.272.083-.49.25-.654.166-.165.387-.247.661-.247h7.884l.02-9.285c0-.271.084-.485.25-.64.167-.155.388-.232.662-.232h4.707c.255%200%20.466.078.633.233.166.154.25.368.25.639l-.02%209.285h11.943c.255%200%20.466.082.632.247.167.164.25.382.25.654v3.603a.89.89%200%200%201-.25.64.837.837%200%200%201-.632.261H345.36v11.741c0%201.337.18%202.465.544%203.386.363.92.873%201.613%201.53%202.077a6.487%206.487%200%200%200%202.059.989c.716.193%201.534.29%202.456.29%201.98%200%203.824-.668%205.53-2.005.452-.426.873-.407%201.265.058l2%202.325zm15.146-23.272c1.86-.801%203.86-1.201%206.001-1.201%202.141%200%204.112.395%205.914%201.186%201.802.791%203.293%201.86%204.475%203.208%201.182%201.347%202.097%202.905%202.746%204.672.65%201.767.974%203.637.974%205.609%200%201.191-.121%202.04-.363%202.549-.243.507-.76.761-1.555.761h-20.807c.33%202.285%201.385%204.106%203.168%205.463%201.782%201.357%204.01%202.036%206.683%202.036%202.693%200%205.134-.84%207.324-2.52.464-.35.881-.341%201.249.03l1.947%201.992c.465.469.465.918%200%201.347-2.983%203.008-6.713%204.511-11.188%204.511-4.572%200-8.287-1.47-11.145-4.408-2.857-2.94-4.286-6.615-4.286-11.029%200-2.148.373-4.164%201.119-6.048.746-1.885%201.763-3.516%203.051-4.892%201.288-1.377%202.853-2.466%204.693-3.266zm5.71%203.774c-2.28%200-4.202.718-5.767%202.154-1.565%201.437-2.502%203.372-2.812%205.806h16.985c-.232-2.414-1.112-4.344-2.638-5.79-1.526-1.447-3.449-2.17-5.768-2.17z%22%20fill%3D%22%23FFF%22%2F%3E%3Cpath%20d%3D%22M102.022%2037.886V19.427c0-2.582-1.455-3.873-4.363-3.873H82.51a1.87%201.87%200%200%201-1.333-.515c-.364-.342-.584-.776-.584-1.3V1.875c0-.565.22-1.019.584-1.361A1.87%201.87%200%200%201%2082.511%200h26.297c1.171%200%202.312.1%203.423.303%201.11.201%202.282.615%203.514%201.24a11.807%2011.807%200%200%201%203.212%202.36c.909.949%201.646%202.23%202.211%203.844.566%201.613.849%203.47.849%205.568v23.421c.04%201.09.262%201.877.666%202.36l12.18%2014.102c.645.767.605%201.594-.122%202.481l-12.058%2013.799c-.444.484-.666%201.271-.666%202.36V95.14c0%202.622-.414%204.852-1.243%206.688-.828%201.835-1.938%203.207-3.332%204.115-1.394.908-2.787%201.553-4.18%201.937-1.394.383-2.879.575-4.454.575H82.51c-.525%200-.97-.162-1.333-.485a1.716%201.716%200%200%201-.584-1.331V94.715c0-.564.22-1.018.584-1.361a1.87%201.87%200%200%201%201.333-.515H97.66c2.908%200%204.363-1.25%204.363-3.752V70.749c0-1.009.242-1.755.727-2.24l13.31-13.952a.217.217%200%200%200%200-.298l-13.31-14.194c-.485-.444-.728-1.17-.728-2.179zm-32.788-8.585L93.083%2053.15a1.523%201.523%200%200%201%200%202.154l-23.85%2023.849a1.523%201.523%200%200%201-2.153%200l-23.85-23.85a1.523%201.523%200%200%201%200-2.153L67.08%2029.3a1.523%201.523%200%200%201%202.154%200zm-35.937%208.585c0%201.009-.243%201.735-.728%202.18L19.26%2054.258a.217.217%200%200%200%200%20.298L32.57%2068.51c.485.484.728%201.23.728%202.24v18.337c0%202.501%201.454%203.752%204.362%203.752h15.148c.525%200%20.97.172%201.333.515.364.343.584.797.584%201.361v11.923c0%20.565-.22%201.009-.584%201.331-.363.323-.808.485-1.333.485H26.511c-1.576%200-3.06-.192-4.454-.575-1.394-.384-2.787-1.03-4.18-1.937-1.394-.908-2.505-2.28-3.333-4.115-.828-1.836-1.242-4.065-1.242-6.688v-23.3c0-1.09-.223-1.877-.667-2.36L.577%2055.678c-.727-.887-.767-1.715-.12-2.481l12.178-14.101c.404-.485.626-1.271.667-2.36V13.314c0-2.099.282-3.955.848-5.568.565-1.614%201.303-2.895%202.211-3.843a11.807%2011.807%200%200%201%203.212-2.36C20.805.917%2021.976.503%2023.087.302A19.123%2019.123%200%200%201%2026.511%200h26.296c.525%200%20.97.171%201.333.515.364.342.584.796.584%201.361v11.862c0%20.525-.22.959-.584%201.301a1.87%201.87%200%200%201-1.333.515H37.66c-2.908%200-4.362%201.291-4.362%203.873v18.459z%22%20fill%3D%22%234547E0%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E)
From 1698f003a5cfabfbabad106c69cd214ec4ed996a Mon Sep 17 00:00:00 2001
From: Yash Singh
Date: Thu, 31 Dec 2020 02:09:33 -0800
Subject: [PATCH 129/342] [manual] Add link to demo for jump-to-line
Closes #6539
---
doc/manual.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/manual.html b/doc/manual.html
index b7ca9a6972..00472c5236 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -2405,7 +2405,7 @@ Addons
Accepts linenumber
, +/-linenumber
, line:char
,
scroll%
and :linenumber
formats.
This will make use of openDialog
- when available to make prompting for line number neater.
+ when available to make prompting for line number neater. Demo avaliable here.
search/matchesonscrollbar.js
- Adds a
showMatchesOnScrollbar
method to editor
From bd37a96d362b8d92895d3960d569168ec39e4165 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Thu, 31 Dec 2020 13:02:29 +0100
Subject: [PATCH 130/342] Mark version 5.59.1
---
AUTHORS | 4 ++++
CHANGELOG.md | 6 ++++++
doc/manual.html | 2 +-
doc/releases.html | 6 ++++++
index.html | 2 +-
package.json | 2 +-
src/edit/main.js | 2 +-
7 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/AUTHORS b/AUTHORS
index 95134fa2d5..4ea87576d3 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -432,6 +432,7 @@ Jon Malmaud
Jon Sangster
Joo
Joost-Wim Boekesteijn
+José dBruxelles
Joseph Pecoraro
Josh Barnes
Josh Cohen
@@ -546,6 +547,7 @@ Martin Hasoň
Martin Hunt
Martin Laine
Martin Zagora
+Masahiro MATAYOSHI
Mason Malone
Mateusz Paprocki
Mathias Bynens
@@ -894,6 +896,8 @@ wonderboyjon
Wu Cheng-Han
Xavier Mendez
Yang Guo
+Yash Singh
+Yash-Singh1
Yassin N. Hassan
YNH Webdev
yoongu
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c1ffa87816..5a9baf4df1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 5.59.1 (2020-12-31)
+
+### Bug fixes
+
+Fix an issue where some Chrome browsers were detected as iOS.
+
## 5.59.0 (2020-12-20)
### Bug fixes
diff --git a/doc/manual.html b/doc/manual.html
index 00472c5236..285d420d9a 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -70,7 +70,7 @@
User manual and reference guide
- version 5.59.0
+ version 5.59.1
CodeMirror is a code-editor component that can be embedded in
diff --git a/doc/releases.html b/doc/releases.html
index 18987f5ea2..f6628b6548 100644
--- a/doc/releases.html
+++ b/doc/releases.html
@@ -30,6 +30,12 @@
Release notes and version history
Version 5.x
+ 31-12-2020: Version 5.59.1:
+
+
+ - Fix an issue where some Chrome browsers were detected as iOS.
+
+
20-12-2020: Version 5.59.0:
diff --git a/index.html b/index.html
index 9631b88366..a89b1de5d3 100644
--- a/index.html
+++ b/index.html
@@ -99,7 +99,7 @@ This is CodeMirror
- Get the current version:
5.59.0.
+ Get the current version:
5.59.1.
You can see the
code,
read the
release notes,
or study the
user manual.
diff --git a/package.json b/package.json
index 321a46c1d6..7ab19be203 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "codemirror",
- "version": "5.59.0",
+ "version": "5.59.1",
"main": "lib/codemirror.js",
"style": "lib/codemirror.css",
"author": {
diff --git a/src/edit/main.js b/src/edit/main.js
index 6550214906..cb8c8cac5b 100644
--- a/src/edit/main.js
+++ b/src/edit/main.js
@@ -66,4 +66,4 @@ import { addLegacyProps } from "./legacy.js"
addLegacyProps(CodeMirror)
-CodeMirror.version = "5.59.0"
+CodeMirror.version = "5.59.1"
From 9749ba3ce08154510e631217e21532987415d9b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Wielgus?=
<61328879+encap@users.noreply.github.com>
Date: Sun, 3 Jan 2021 19:58:51 +0100
Subject: [PATCH 131/342] [real world uses] Add coderush.xyz (typing speed
test)
Uses CodeMirror with dynamic mode switching
---
doc/realworld.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/doc/realworld.html b/doc/realworld.html
index 487208b286..698b0c3a80 100644
--- a/doc/realworld.html
+++ b/doc/realworld.html
@@ -58,6 +58,7 @@
CodeMirror real-world uses
- Codepen (gallery of animations)
- Coderba Google Web Toolkit (GWT) wrapper
- Coderpad (interviewing tool)
+
- CodeRush typing speed test for programmers
- Code School (online tech learning environment)
- Code Snippets (WordPress snippet management plugin)
- Code together (collaborative editing)
From c8059735fc9ef79a1b8176d776cb81a03771a28c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Wielgus?=
<61328879+encap@users.noreply.github.com>
Date: Sun, 3 Jan 2021 20:11:00 +0100
Subject: [PATCH 132/342] [real world uses] Update "clone-it" url
Previous url (clone-it.github.io) returns 404 because I changed github account.
---
doc/realworld.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/realworld.html b/doc/realworld.html
index 698b0c3a80..a7402551f7 100644
--- a/doc/realworld.html
+++ b/doc/realworld.html
@@ -41,7 +41,7 @@
CodeMirror real-world uses
- Cargo Collective (creative publishing platform)
- Chrome DevTools
- ClickHelp (technical writing tool)
-
- Clone-It (HTML & CSS learning game)
+
- Clone-It (HTML & CSS learning game)
- Colon (A flexible text editor or IDE)
- CodeWorld (Haskell playground)
- Complete.ly playground
From a46e33049de2c6f4550b77cad743d293039f2e93 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20=C5=9Alepowro=C5=84ski?=
<45392875+slepowronski@users.noreply.github.com>
Date: Mon, 4 Jan 2021 13:28:25 +0100
Subject: [PATCH 133/342] [show-hint addon] Changed closeOnCursorActivity to
updateOnCursorActivity
---
addon/hint/show-hint.js | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/addon/hint/show-hint.js b/addon/hint/show-hint.js
index 5ef1bba645..a9f2ded18c 100644
--- a/addon/hint/show-hint.js
+++ b/addon/hint/show-hint.js
@@ -61,8 +61,10 @@
this.startPos = this.cm.getCursor("start");
this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length;
- var self = this;
- cm.on("cursorActivity", this.activityFunc = function() { self.cursorActivity(); });
+ if (this.options.updateOnCursorActivity) {
+ var self = this;
+ cm.on("cursorActivity", this.activityFunc = function() { self.cursorActivity(); });
+ }
}
var requestAnimationFrame = window.requestAnimationFrame || function(fn) {
@@ -75,7 +77,9 @@
if (!this.active()) return;
this.cm.state.completionActive = null;
this.tick = null;
- this.cm.off("cursorActivity", this.activityFunc);
+ if (this.options.updateOnCursorActivity) {
+ this.cm.off("cursorActivity", this.activityFunc);
+ }
if (this.widget && this.data) CodeMirror.signal(this.data, "close");
if (this.widget) this.widget.close();
@@ -117,9 +121,7 @@
if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch ||
pos.ch < identStart.ch || this.cm.somethingSelected() ||
(!pos.ch || this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) {
- if (this.options.closeOnCursorActivity) {
- this.close();
- }
+ this.close();
} else {
var self = this;
this.debounce = requestAnimationFrame(function() {self.update();});
@@ -492,9 +494,9 @@
completeSingle: true,
alignWithWord: true,
closeCharacters: /[\s()\[\]{};:>,]/,
- closeOnCursorActivity: true,
closeOnPick: true,
closeOnUnfocus: true,
+ updateOnCursorActivity: true,
completeOnSingleClick: true,
container: null,
customKeys: null,
From 36c786bcca35c0650e78ab65ac8afb9d71abb89c Mon Sep 17 00:00:00 2001
From: Yash Singh
Date: Tue, 5 Jan 2021 02:42:31 -0800
Subject: [PATCH 134/342] [closetag demo] Add description
---
demo/closetag.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/demo/closetag.html b/demo/closetag.html
index 4f857fa4bb..1f86114a9f 100644
--- a/demo/closetag.html
+++ b/demo/closetag.html
@@ -38,4 +38,5 @@ Close-Tag Demo
autoCloseTags: true
});
+ Uses the closetag addon to auto-close tags.
From d19a746e51e041dd9aa1c9b79386b29cb1bcb3f1 Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke
Date: Wed, 6 Jan 2021 18:23:19 +0100
Subject: [PATCH 135/342] Fix bug in findPosH
Closes #6554
---
src/edit/methods.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/edit/methods.js b/src/edit/methods.js
index eb8f8d28dc..c33a859865 100644
--- a/src/edit/methods.js
+++ b/src/edit/methods.js
@@ -479,7 +479,7 @@ function findPosH(doc, pos, dir, unit, visually) {
function moveOnce(boundToLine) {
let next
if (unit == "codepoint") {
- let ch = lineObj.text.charCodeAt(pos.ch + (unit > 0 ? 0 : -1))
+ let ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1))
if (isNaN(ch)) {
next = null
} else {
From 498e7c0c0a762c2ad5b8bc8b455ef1f12db1e5bd Mon Sep 17 00:00:00 2001
From: Josh Soref
Date: Fri, 8 Jan 2021 08:32:22 -0500
Subject: [PATCH 136/342] Fix various spelling mistakes
* spelling: across
Signed-off-by: Josh Soref
* spelling: advise
Signed-off-by: Josh Soref
* spelling: aframework
Signed-off-by: Josh Soref
* spelling: after
Signed-off-by: Josh Soref
* spelling: alphanumeric
Signed-off-by: Josh Soref
* spelling: anyway
Signed-off-by: Josh Soref
* spelling: async
Signed-off-by: Josh Soref
* spelling: available
Signed-off-by: Josh Soref
* spelling: backticks
Signed-off-by: Josh Soref
* spelling: behavior
Signed-off-by: Josh Soref
* spelling: bracket
Signed-off-by: Josh Soref
* spelling: cacheable
Signed-off-by: Josh Soref
* spelling: characters
Signed-off-by: Josh Soref
* spelling: completeable
Signed-off-by: Josh Soref
* spelling: data
Signed-off-by: Josh Soref
* spelling: definition
Signed-off-by: Josh Soref
* spelling: different
Signed-off-by: Josh Soref
* spelling: do not
Signed-off-by: Josh Soref
* spelling: duplicate
Signed-off-by: Josh Soref
* spelling: e.g.
Signed-off-by: Josh Soref
* spelling: entities
Signed-off-by: Josh Soref
* spelling: expression-in
Signed-off-by: Josh Soref
* spelling: extract
Signed-off-by: Josh Soref
* spelling: feedback
Signed-off-by: Josh Soref
* spelling: filesystem
Signed-off-by: Josh Soref
* spelling: function
Signed-off-by: Josh Soref
* spelling: github
Signed-off-by: Josh Soref
* spelling: height
Signed-off-by: Josh Soref
* spelling: highlighted
Signed-off-by: Josh Soref
* spelling: i'm
Signed-off-by: Josh Soref
* spelling: identifier
Signed-off-by: Josh Soref
* spelling: immediately
Signed-off-by: Josh Soref
* spelling: in case
Signed-off-by: Josh Soref
* spelling: indentation
Signed-off-by: Josh Soref
* spelling: independent
Signed-off-by: Josh Soref
* spelling: initial
Signed-off-by: Josh Soref
* spelling: interchangeable
Signed-off-by: Josh Soref
* spelling: interruptible
Signed-off-by: Josh Soref
* spelling: interviews
Signed-off-by: Josh Soref
* spelling: intrinsic
Signed-off-by: Josh Soref
* spelling: javascript
Signed-off-by: Josh Soref
* spelling: label
Signed-off-by: Josh Soref
* spelling: matching
Signed-off-by: Josh Soref
* spelling: misbehavior
Signed-off-by: Josh Soref
* spelling: number
Signed-off-by: Josh Soref
* spelling: numbered
Signed-off-by: Josh Soref
* spelling: occurrences
Signed-off-by: Josh Soref
* spelling: repeatedly
Signed-off-by: Josh Soref
* spelling: separator
Signed-off-by: Josh Soref
* spelling: string
Signed-off-by: Josh Soref
* spelling: styleable
Signed-off-by: Josh Soref
* spelling: textarea
Signed-off-by: Josh Soref
* spelling: texture
Signed-off-by: Josh Soref
* spelling: useful
Signed-off-by: Josh Soref
* spelling: whenever
Signed-off-by: Josh Soref
* spelling: wikipedia
Signed-off-by: Josh Soref
---
CHANGELOG.md | 14 +++++++-------
addon/edit/continuelist.js | 2 +-
addon/edit/matchbrackets.js | 2 +-
addon/hint/javascript-hint.js | 2 +-
addon/hint/sql-hint.js | 4 ++--
addon/search/match-highlighter.js | 2 +-
demo/complete.html | 4 ++--
demo/matchhighlighter.html | 2 +-
demo/simplemode.html | 2 +-
doc/internals.html | 2 +-
doc/manual.html | 8 ++++----
doc/realworld.html | 4 ++--
doc/releases.html | 14 +++++++-------
doc/upgrade_v2.2.html | 2 +-
index.html | 2 +-
keymap/vim.js | 6 +++---
mode/asn.1/asn.1.js | 2 +-
mode/clike/clike.js | 2 +-
mode/clike/index.html | 2 +-
mode/dtd/dtd.js | 2 +-
mode/factor/factor.js | 2 +-
mode/factor/index.html | 2 +-
mode/fcl/index.html | 10 +++++-----
mode/forth/index.html | 2 +-
mode/gas/gas.js | 4 ++--
mode/gfm/test.js | 2 +-
mode/haml/haml.js | 2 +-
mode/htmlembedded/index.html | 2 +-
mode/idl/idl.js | 2 +-
mode/javascript/test.js | 2 +-
mode/markdown/index.html | 10 +++++-----
mode/markdown/markdown.js | 2 +-
mode/markdown/test.js | 4 ++--
mode/meta.js | 2 +-
mode/modelica/modelica.js | 6 +++---
mode/mumps/mumps.js | 2 +-
mode/nginx/index.html | 4 ++--
mode/ntriples/index.html | 2 +-
mode/oz/oz.js | 2 +-
mode/perl/perl.js | 4 ++--
mode/python/index.html | 2 +-
mode/python/test.js | 2 +-
mode/rpm/rpm.js | 4 ++--
mode/ruby/index.html | 2 +-
mode/scheme/scheme.js | 2 +-
mode/sieve/sieve.js | 2 +-
mode/sql/sql.js | 4 ++--
mode/vbscript/vbscript.js | 4 ++--
mode/velocity/velocity.js | 2 +-
mode/verilog/verilog.js | 4 ++--
mode/vue/index.html | 2 +-
mode/yaml/yaml.js | 4 ++--
52 files changed, 91 insertions(+), 91 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5a9baf4df1..3a3ee68cef 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -234,7 +234,7 @@ Make Shift-Delete to cut work on Firefox.
[handlebars mode](https://codemirror.net/mode/handlebars/): Fix triple-brace support.
-[searchcursor addon](https://codemirror.net/doc/manual.html#addon_searchcursor): Support mathing `$` in reverse regexp search.
+[searchcursor addon](https://codemirror.net/doc/manual.html#addon_searchcursor): Support matching `$` in reverse regexp search.
[panel addon](https://codemirror.net/doc/manual.html#addon_panel): Don't get confused by changing panel sizes.
@@ -490,7 +490,7 @@ Add `hintWords` (basic completion) helper to [clojure](https://codemirror.net/mo
[panel addon](https://codemirror.net/doc/manual.html#addon_panel): Fix problem where replacing the last remaining panel dropped the newly added panel.
-[hardwrap addon](https://codemirror.net/doc/manual.html#addon_hardwrap): Fix an infinite loop when the indention is greater than the target column.
+[hardwrap addon](https://codemirror.net/doc/manual.html#addon_hardwrap): Fix an infinite loop when the indentation is greater than the target column.
[jinja2](https://codemirror.net/mode/jinja2/) and [markdown](https://codemirror.net/mode/markdown/) modes: Add comment metadata.
@@ -878,7 +878,7 @@ Add `role=presentation` to more DOM elements to improve screen reader support.
[merge addon](https://codemirror.net/doc/manual.html#addon_merge): Make aligning of unchanged chunks more robust.
-[comment addon](https://codemirror.net/doc/manual.html#addon_comment): Fix comment-toggling on a block of text that starts and ends in a (differnet) block comment.
+[comment addon](https://codemirror.net/doc/manual.html#addon_comment): Fix comment-toggling on a block of text that starts and ends in a (different) block comment.
[javascript mode](https://codemirror.net/mode/javascript/): Improve support for TypeScript syntax.
@@ -996,7 +996,7 @@ New event: [`optionChange`](https://codemirror.net/doc/manual.html#event_optionC
Tapping/clicking the editor in [contentEditable mode](https://codemirror.net/doc/manual.html#option_inputStyle) on Chrome now puts the cursor at the tapped position.
-Fix various crashes and misbehaviors when reading composition events in [contentEditable mode](https://codemirror.net/doc/manual.html#option_inputStyle).
+Fix various crashes and misbehavior when reading composition events in [contentEditable mode](https://codemirror.net/doc/manual.html#option_inputStyle).
Catches and ignores an IE 'Unspecified Error' when creating an editor in an iframe before there is a ``.
@@ -1331,7 +1331,7 @@ Fix a [bug](https://github.com/codemirror/CodeMirror/issues/3834) that caused ph
* New modes: [Vue](https://codemirror.net/mode/vue/index.html), [Oz](https://codemirror.net/mode/oz/index.html), [MscGen](https://codemirror.net/mode/mscgen/index.html) (and dialects), [Closure Stylesheets](https://codemirror.net/mode/css/gss.html)
* Implement [CommonMark](http://commonmark.org)-style flexible list indent and cross-line code spans in [Markdown](https://codemirror.net/mode/markdown/index.html) mode
* Add a replace-all button to the [search addon](https://codemirror.net/doc/manual.html#addon_search), and make the persistent search dialog transparent when it obscures the match
-* Handle `acync`/`await` and ocal and binary numbers in [JavaScript mode](https://codemirror.net/mode/javascript/index.html)
+* Handle `async`/`await` and ocal and binary numbers in [JavaScript mode](https://codemirror.net/mode/javascript/index.html)
* Fix various issues with the [Haxe mode](https://codemirror.net/mode/haxe/index.html)
* Make the [closebrackets addon](https://codemirror.net/doc/manual.html#addon_closebrackets) select only the wrapped text when wrapping selection in brackets
* Tokenize properties as properties in the [CoffeeScript mode](https://codemirror.net/mode/coffeescript/index.html)
@@ -1818,7 +1818,7 @@ Emergency fix for a bug where an editor with line wrapping on IE will break when
* Slightly incompatible API changes. Read [this](https://codemirror.net/doc/upgrade_v2.2.html).
* New approach to [binding](https://codemirror.net/doc/manual.html#option_extraKeys) keys, support for [custom bindings](https://codemirror.net/doc/manual.html#option_keyMap).
* Support for overwrite (insert).
-* [Custom-width](https://codemirror.net/doc/manual.html#option_tabSize) and [stylable](https://codemirror.net/demo/visibletabs.html) tabs.
+* [Custom-width](https://codemirror.net/doc/manual.html#option_tabSize) and [styleable](https://codemirror.net/demo/visibletabs.html) tabs.
* Moved more code into [add-on scripts](https://codemirror.net/doc/manual.html#addons).
* Support for sane vertical cursor movement in wrapped lines.
* More reliable handling of editing [marked text](https://codemirror.net/doc/manual.html#markText).
@@ -1832,7 +1832,7 @@ Fixes `TextMarker.clear`, which is broken in 2.17.
## 2.17.0 (2011-11-21)
* Add support for [line wrapping](https://codemirror.net/doc/manual.html#option_lineWrapping) and [code folding](https://codemirror.net/doc/manual.html#hideLine).
-* Add [Github-style Markdown](https://codemirror.net/mode/gfm/index.html) mode.
+* Add [GitHub-style Markdown](https://codemirror.net/mode/gfm/index.html) mode.
* Add [Monokai](https://codemirror.net/theme/monokai.css) and [Rubyblue](https://codemirror.net/theme/rubyblue.css) themes.
* Add [`setBookmark`](https://codemirror.net/doc/manual.html#setBookmark) method.
* Move some of the demo code into reusable components under [`lib/util`](https://codemirror.net/addon/).
diff --git a/addon/edit/continuelist.js b/addon/edit/continuelist.js
index 2e5625adc4..6ec65010d2 100644
--- a/addon/edit/continuelist.js
+++ b/addon/edit/continuelist.js
@@ -90,7 +90,7 @@
});
} else {
if (startIndent.length > nextIndent.length) return;
- // This doesn't run if the next line immediatley indents, as it is
+ // This doesn't run if the next line immediately indents, as it is
// not clear of the users intention (new indented item or same level)
if ((startIndent.length < nextIndent.length) && (lookAhead === 1)) return;
skipCount += 1;
diff --git a/addon/edit/matchbrackets.js b/addon/edit/matchbrackets.js
index 0377408802..692e09e0cc 100644
--- a/addon/edit/matchbrackets.js
+++ b/addon/edit/matchbrackets.js
@@ -94,7 +94,7 @@
if (marks.length) {
// Kludge to work around the IE bug from issue #1193, where text
- // input stops going to the textare whever this fires.
+ // input stops going to the textarea whenever this fires.
if (ie_lt8 && cm.state.focused) cm.focus();
var clear = function() {
diff --git a/addon/hint/javascript-hint.js b/addon/hint/javascript-hint.js
index 6d09e6b44e..9f06b1b546 100644
--- a/addon/hint/javascript-hint.js
+++ b/addon/hint/javascript-hint.js
@@ -69,7 +69,7 @@
function getCoffeeScriptToken(editor, cur) {
// This getToken, it is for coffeescript, imitates the behavior of
// getTokenAt method in javascript.js, that is, returning "property"
- // type and treat "." as indepenent token.
+ // type and treat "." as independent token.
var token = editor.getTokenAt(cur);
if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {
token.end = token.start;
diff --git a/addon/hint/sql-hint.js b/addon/hint/sql-hint.js
index 5b65e29105..efdce813cf 100644
--- a/addon/hint/sql-hint.js
+++ b/addon/hint/sql-hint.js
@@ -97,7 +97,7 @@
if (name.charAt(0) == ".") {
name = name.substr(1);
}
- // replace doublicated identifierQuotes with single identifierQuotes
+ // replace duplicated identifierQuotes with single identifierQuotes
// and remove single identifierQuotes
var nameParts = name.split(identifierQuote+identifierQuote);
for (var i = 0; i < nameParts.length; i++)
@@ -109,7 +109,7 @@
var nameParts = getText(name).split(".");
for (var i = 0; i < nameParts.length; i++)
nameParts[i] = identifierQuote +
- // doublicate identifierQuotes
+ // duplicate identifierQuotes
nameParts[i].replace(new RegExp(identifierQuote,"g"), identifierQuote+identifierQuote) +
identifierQuote;
var escaped = nameParts.join(".");
diff --git a/addon/search/match-highlighter.js b/addon/search/match-highlighter.js
index 3a4a7dedc1..9b181ebc01 100644
--- a/addon/search/match-highlighter.js
+++ b/addon/search/match-highlighter.js
@@ -16,7 +16,7 @@
// highlighted only if the selected text is a word. showToken, when enabled,
// will cause the current token to be highlighted when nothing is selected.
// delay is used to specify how much time to wait, in milliseconds, before
-// highlighting the matches. If annotateScrollbar is enabled, the occurences
+// highlighting the matches. If annotateScrollbar is enabled, the occurrences
// will be highlighted on the scrollbar via the matchesonscrollbar addon.
(function(mod) {
diff --git a/demo/complete.html b/demo/complete.html
index 2fef796401..3e7bd5ff56 100644
--- a/demo/complete.html
+++ b/demo/complete.html
@@ -71,7 +71,7 @@ Autocomplete Demo
addons.
@@ -88,7 +88,7 @@ Autocomplete Demo
["here", "hither"],
["asynchronous", "nonsynchronous"],
["completion", "achievement", "conclusion", "culmination", "expirations"],
- ["hinting", "advive", "broach", "imply"],
+ ["hinting", "advise", "broach", "imply"],
["function","action"],
["provide", "add", "bring", "give"],
["synonyms", "equivalents"],
diff --git a/demo/matchhighlighter.html b/demo/matchhighlighter.html
index 6aa937782d..8e0ff25b89 100644
--- a/demo/matchhighlighter.html
+++ b/demo/matchhighlighter.html
@@ -98,6 +98,6 @@ Match Highlighter Demo
});
- Search and highlight occurences of the selected text.
+ Search and highlight occurrences of the selected text.
diff --git a/demo/simplemode.html b/demo/simplemode.html
index d7b0cface4..b03335fb87 100644
--- a/demo/simplemode.html
+++ b/demo/simplemode.html
@@ -129,7 +129,7 @@ Simple Mode Demo
*/
CodeMirror.defineSimpleMode("simplemode", {
- // The start state contains the rules that are intially used
+ // The start state contains the rules that are initially used
start: [
// The regex matches the token, the token property contains the type
{regex: /"(?:[^\\]|\\.)*?(?:"|$)/, token: "string"},
diff --git a/doc/internals.html b/doc/internals.html
index 2137c937f2..893604e936 100644
--- a/doc/internals.html
+++ b/doc/internals.html
@@ -293,7 +293,7 @@ Intelligent Updating
Parsers can be Simple
When I wrote CodeMirror 1, I
-thought interruptable
+thought interruptible
parsers were a hugely scary and complicated thing, and I used a
bunch of heavyweight abstractions to keep this supposed complexity
under control: parsers
diff --git a/doc/manual.html b/doc/manual.html
index 285d420d9a..7aade3df15 100644
--- a/doc/manual.html
+++ b/doc/manual.html
@@ -2405,7 +2405,7 @@
Addons
Accepts linenumber
, +/-linenumber
, line:char
,
scroll%
and :linenumber
formats.
This will make use of openDialog
- when available to make prompting for line number neater. Demo avaliable here.
+ when available to make prompting for line number neater. Demo available here.
search/matchesonscrollbar.js
- Adds a
showMatchesOnScrollbar
method to editor
@@ -2721,7 +2721,7 @@ Addons
the "hint"
type to find applicable hinting
functions, and tries them one by one. If that fails, it looks
for a "hintWords"
helper to fetch a list of
- completable words for the mode, and
+ completeable words for the mode, and
uses CodeMirror.hint.fromList
to complete from
those.
- When completions aren't simple strings, they should be
@@ -3683,13 +3683,13 @@
Extending VIM
getRegisterController()
- Returns the RegisterController that manages the state of registers
used by vim mode. For the RegisterController api see its
- defintion here.
+ definition here.
buildKeyMap()
-
Not currently implemented. If you would like to contribute this please open
- a pull request on Github.
+ a pull request on GitHub.
defineRegister()
diff --git a/doc/realworld.html b/doc/realworld.html
index a7402551f7..e5f8aef6f9 100644
--- a/doc/realworld.html
+++ b/doc/realworld.html
@@ -81,7 +81,7 @@ CodeMirror real-world uses
- Eloquent JavaScript (book)
- Emmet (fast XML editing)
- Espruino Web IDE (Chrome App for writing code on Espruino devices)
- - EXLskills Live Interivews
+ - EXLskills Live Interviews
- Fastfig (online computation/math tool)
- Farabi (modern Perl IDE)
- FathomJS integration (slides with editors, again)
@@ -92,7 +92,7 @@ CodeMirror real-world uses
- Gerrit's diff view and inline editor
- Git Crx (Chrome App for browsing local git repos)
- GitHub's Android app
- - Github's in-browser edit feature
+ - GitHub's in-browser edit feature
- Glitch (community-driven app building)
- Go language tour
- Google Apps Script
diff --git a/doc/releases.html b/doc/releases.html
index f6628b6548..feeb8088d5 100644
--- a/doc/releases.html
+++ b/doc/releases.html
@@ -193,7 +193,7 @@ Version 5.x
- Make Shift-Delete to cut work on Firefox.
- closetag addon: Properly handle self-closing tags.
- handlebars mode: Fix triple-brace support.
- - searchcursor addon: Support mathing
$
in reverse regexp search.
+ - searchcursor addon: Support matching
$
in reverse regexp search.
- panel addon: Don’t get confused by changing panel sizes.
- javascript-hint addon: Complete variables defined in outer scopes.
- sublime bindings: Make by-subword motion more consistent with Sublime Text.
@@ -354,7 +354,7 @@ Version 5.x
- New method
phrase
and option phrases
to make translating UI text in addons easier.
- closebrackets addon: Fix issue where bracket-closing wouldn't work before punctuation.
- panel addon: Fix problem where replacing the last remaining panel dropped the newly added panel.
- - hardwrap addon: Fix an infinite loop when the indention is greater than the target column.
+ - hardwrap addon: Fix an infinite loop when the indentation is greater than the target column.
- jinja2 and markdown modes: Add comment metadata.
@@ -588,7 +588,7 @@ Version 5.x
- Fix handling of shadow DOM roots when finding the active element.
- Add
role=presentation
to more DOM elements to improve screen reader support.
- merge addon: Make aligning of unchanged chunks more robust.
- - comment addon: Fix comment-toggling on a block of text that starts and ends in a (differnet) block comment.
+ - comment addon: Fix comment-toggling on a block of text that starts and ends in a (different) block comment.
- javascript mode: Improve support for TypeScript syntax.
- r mode: Fix indentation after semicolon-less statements.
- shell mode: Properly handle escaped parentheses in parenthesized expressions.
@@ -653,7 +653,7 @@ Version 5.x
- Tapping/clicking the editor in contentEditable mode on Chrome now puts the cursor at the tapped position.
- - Fix various crashes and misbehaviors when reading composition events in contentEditable mode.
+ - Fix various crashes and misbehavior when reading composition events in contentEditable mode.
- Catches and ignores an IE 'Unspecified Error' when creating an editor in an iframe before there is a
<body>
.
- merge addon: Fix several issues in the chunk-aligning feature.
- verilog mode: Rewritten to address various issues.
@@ -876,7 +876,7 @@ Version 5.x
- New modes: Vue, Oz, MscGen (and dialects), Closure Stylesheets
- Implement CommonMark-style flexible list indent and cross-line code spans in Markdown mode
- Add a replace-all button to the search addon, and make the persistent search dialog transparent when it obscures the match
- - Handle
acync
/await
and ocal and binary numbers in JavaScript mode
+ - Handle
async
/await
and ocal and binary numbers in JavaScript mode
- Fix various issues with the Haxe mode
- Make the closebrackets addon select only the wrapped text when wrapping selection in brackets
- Tokenize properties as properties in the CoffeeScript mode
@@ -1683,7 +1683,7 @@ Version 2.x
bindings.
- Support for overwrite (insert).
- Custom-width
- and stylable tabs.
+ and styleable tabs.
- Moved more code into add-on scripts.
- Support for sane vertical cursor movement in wrapped lines.
- More reliable handling of
@@ -1704,7 +1704,7 @@
Version 2.x
- Add support for line
wrapping and code
folding.
- - Add Github-style Markdown mode.
+ - Add GitHub-style Markdown mode.
- Add Monokai
and Rubyblue themes.
- Add
setBookmark
method.
diff --git a/doc/upgrade_v2.2.html b/doc/upgrade_v2.2.html
index 5709e652bf..dabe974cfa 100644
--- a/doc/upgrade_v2.2.html
+++ b/doc/upgrade_v2.2.html
@@ -79,7 +79,7 @@ Different key customization
and indent it less when shift is held ("indentLess"
).
There are also "indentAuto"
(smart indent)
and "insertTab"
commands provided for alternate
-behaviors. Or you can write your own handler function to do something
+behavior. Or you can write your own handler function to do something
different altogether.
Tabs
diff --git a/index.html b/index.html
index a89b1de5d3..3934c309d9 100644
--- a/index.html
+++ b/index.html
@@ -100,7 +100,7 @@ This is CodeMirror
diff --git a/keymap/vim.js b/keymap/vim.js
index 789e1e55b3..dba9d7c1e0 100644
--- a/keymap/vim.js
+++ b/keymap/vim.js
@@ -737,7 +737,7 @@
// TODO: Convert keymap into dictionary format for fast lookup.
},
// Testing hook, though it might be useful to expose the register
- // controller anyways.
+ // controller anyway.
getRegisterController: function() {
return vimGlobalState.registerController;
},
@@ -4322,7 +4322,7 @@
raw += ' ' + desc + '';
return raw;
}
- var searchPromptDesc = '(Javascript regexp)';
+ var searchPromptDesc = '(JavaScript regexp)';
function showPrompt(cm, options) {
var shortText = (options.prefix || '') + ' ' + (options.desc || '');
var prompt = makePrompt(options.prefix, options.desc);
@@ -5234,7 +5234,7 @@
* @param {Cursor} lineEnd Line to stop replacing at.
* @param {RegExp} query Query for performing matches with.
* @param {string} replaceWith Text to replace matches with. May contain $1,
- * $2, etc for replacing captured groups using Javascript replace.
+ * $2, etc for replacing captured groups using JavaScript replace.
* @param {function()} callback A callback for when the replace is done.
*/
function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query,
diff --git a/mode/asn.1/asn.1.js b/mode/asn.1/asn.1.js
index d3ecb08781..df1330b686 100644
--- a/mode/asn.1/asn.1.js
+++ b/mode/asn.1/asn.1.js
@@ -190,7 +190,7 @@
" NetworkAddress BITS BMPString TimeStamp TimeTicks" +
" TruthValue RowStatus DisplayString GeneralString" +
" GraphicString IA5String NumericString" +
- " PrintableString SnmpAdminAtring TeletexString" +
+ " PrintableString SnmpAdminString TeletexString" +
" UTF8String VideotexString VisibleString StringStore" +
" ISO646String T61String UniversalString Unsigned32" +
" Integer32 Gauge Gauge32 Counter Counter32 Counter64"),
diff --git a/mode/clike/clike.js b/mode/clike/clike.js
index 2154f1d2df..5d01e1cd4c 100644
--- a/mode/clike/clike.js
+++ b/mode/clike/clike.js
@@ -749,7 +749,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
"gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " +
"gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " +
"gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " +
- "gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose " +
+ "gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose " +
"gl_ProjectionMatrixInverseTranspose " +
"gl_ModelViewProjectionMatrixInverseTranspose " +
"gl_TextureMatrixInverseTranspose " +
diff --git a/mode/clike/index.html b/mode/clike/index.html
index 0cfae2149e..b1c881904f 100644
--- a/mode/clike/index.html
+++ b/mode/clike/index.html
@@ -148,7 +148,7 @@ Objective-C example
*/
#import "MyClass.h"
-#import
+#import
@import BFrameworkModule;
NS_ENUM(SomeValues) {
diff --git a/mode/dtd/dtd.js b/mode/dtd/dtd.js
index 74b8c6bded..40370a393d 100644
--- a/mode/dtd/dtd.js
+++ b/mode/dtd/dtd.js
@@ -34,7 +34,7 @@ CodeMirror.defineMode("dtd", function(config) {
state.tokenize = inBlock("meta", "?>");
return ret("meta", ch);
} else if (ch == "#" && stream.eatWhile(/[\w]/)) return ret("atom", "tag");
- else if (ch == "|") return ret("keyword", "seperator");
+ else if (ch == "|") return ret("keyword", "separator");
else if (ch.match(/[\(\)\[\]\-\.,\+\?>]/)) return ret(null, ch);//if(ch === ">") return ret(null, "endtag"); else
else if (ch.match(/[\[\]]/)) return ret("rule", ch);
else if (ch == "\"" || ch == "'") {
diff --git a/mode/factor/factor.js b/mode/factor/factor.js
index 7108278cca..4c876d4d29 100644
--- a/mode/factor/factor.js
+++ b/mode/factor/factor.js
@@ -16,7 +16,7 @@
"use strict";
CodeMirror.defineSimpleMode("factor", {
- // The start state contains the rules that are intially used
+ // The start state contains the rules that are initially used
start: [
// comments
{regex: /#?!.*/, token: "comment"},
diff --git a/mode/factor/index.html b/mode/factor/index.html
index 574d402dda..6a77230d40 100644
--- a/mode/factor/index.html
+++ b/mode/factor/index.html
@@ -70,7 +70,7 @@ Factor mode
});
-Simple mode that handles Factor Syntax (Factor on WikiPedia).
+Simple mode that handles Factor Syntax (Factor on Wikipedia).
MIME types defined: text/x-factor
.
diff --git a/mode/fcl/index.html b/mode/fcl/index.html
index e51fa166b9..9194dfddaf 100644
--- a/mode/fcl/index.html
+++ b/mode/fcl/index.html
@@ -61,7 +61,7 @@ FCL mode
END_FUZZIFY
DEFUZZIFY ProbabilityAccess
- TERM hight := 1;
+ TERM height := 1;
TERM medium := 0.5;
TERM low := 0;
ACCU: MAX;
@@ -70,7 +70,7 @@ FCL mode
END_DEFUZZIFY
DEFUZZIFY ProbabilityDistribution
- TERM hight := 1;
+ TERM height := 1;
TERM medium := 0.5;
TERM low := 0;
ACCU: MAX;
@@ -80,14 +80,14 @@ FCL mode
RULEBLOCK No1
AND : MIN;
- RULE 1 : IF TimeDay IS outside AND ApplicateHost IS few THEN ProbabilityAccess IS hight;
- RULE 2 : IF ApplicateHost IS many THEN ProbabilityAccess IS hight;
+ RULE 1 : IF TimeDay IS outside AND ApplicateHost IS few THEN ProbabilityAccess IS height;
+ RULE 2 : IF ApplicateHost IS many THEN ProbabilityAccess IS height;
RULE 3 : IF TimeDay IS inside AND ApplicateHost IS few THEN ProbabilityAccess IS low;
END_RULEBLOCK
RULEBLOCK No2
AND : MIN;
- RULE 1 : IF ApplicateHost IS many THEN ProbabilityDistribution IS hight;
+ RULE 1 : IF ApplicateHost IS many THEN ProbabilityDistribution IS height;
END_RULEBLOCK
END_FUNCTION_BLOCK
diff --git a/mode/forth/index.html b/mode/forth/index.html
index c6f0b5c5c8..6b6477cae7 100644
--- a/mode/forth/index.html
+++ b/mode/forth/index.html
@@ -68,7 +68,7 @@ Forth mode
});
-Simple mode that handle Forth-Syntax (Forth on WikiPedia).
+Simple mode that handle Forth-Syntax (Forth on Wikipedia).
MIME types defined: text/x-forth
.
diff --git a/mode/gas/gas.js b/mode/gas/gas.js
index e34d7a7b61..b3515abe77 100644
--- a/mode/gas/gas.js
+++ b/mode/gas/gas.js
@@ -302,11 +302,11 @@ CodeMirror.defineMode("gas", function(_config, parserConfig) {
}
if (ch === '{') {
- return "braket";
+ return "bracket";
}
if (ch === '}') {
- return "braket";
+ return "bracket";
}
if (/\d/.test(ch)) {
diff --git a/mode/gfm/test.js b/mode/gfm/test.js
index d933896aa5..e2002879cb 100644
--- a/mode/gfm/test.js
+++ b/mode/gfm/test.js
@@ -92,7 +92,7 @@
"[em *foo ][em&link bar/hello@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2][em *]");
MT("wordSHA",
- "ask for feedbac")
+ "ask for feedback")
MT("num",
"foo [link #1] bar");
diff --git a/mode/haml/haml.js b/mode/haml/haml.js
index 3c8f505eb5..d941d97433 100644
--- a/mode/haml/haml.js
+++ b/mode/haml/haml.js
@@ -72,7 +72,7 @@
}
}
- // donot handle --> as valid ruby, make it HTML close comment instead
+ // do not handle --> as valid ruby, make it HTML close comment instead
if (state.startOfLine && !stream.match("-->", false) && (ch == "=" || ch == "-" )) {
state.tokenize = ruby;
return state.tokenize(stream, state);
diff --git a/mode/htmlembedded/index.html b/mode/htmlembedded/index.html
index b1cafde973..d17afec8b1 100644
--- a/mode/htmlembedded/index.html
+++ b/mode/htmlembedded/index.html
@@ -55,6 +55,6 @@ Html Embedded Scripts mode
JavaScript, CSS and XML.
Other dependencies include those of the scripting language chosen.
MIME types defined: application/x-aspx
(ASP.NET),
- application/x-ejs
(Embedded Javascript), application/x-jsp
(JavaServer Pages)
+ application/x-ejs
(Embedded JavaScript), application/x-jsp
(JavaServer Pages)
and application/x-erb
diff --git a/mode/idl/idl.js b/mode/idl/idl.js
index 168761cd88..37302bb90f 100644
--- a/mode/idl/idl.js
+++ b/mode/idl/idl.js
@@ -62,7 +62,7 @@
'empty', 'enable_sysrtn', 'eof', 'eos', 'erase',
'erf', 'erfc', 'erfcx', 'erode', 'errorplot',
'errplot', 'estimator_filter', 'execute', 'exit', 'exp',
- 'expand', 'expand_path', 'expint', 'extrac', 'extract_slice',
+ 'expand', 'expand_path', 'expint', 'extract', 'extract_slice',
'f_cvf', 'f_pdf', 'factorial', 'fft', 'file_basename',
'file_chmod', 'file_copy', 'file_delete', 'file_dirname',
'file_expand_path', 'file_gunzip', 'file_gzip', 'file_info',
diff --git a/mode/javascript/test.js b/mode/javascript/test.js
index ffff05f513..26a81ffc8d 100644
--- a/mode/javascript/test.js
+++ b/mode/javascript/test.js
@@ -252,7 +252,7 @@
MT("async_object",
"[keyword let] [def obj] [operator =] { [property async]: [atom false] };");
- // async be highlighet as keyword and foo as def, but it requires potentially expensive look-ahead. See #4173
+ // async be highlighted as keyword and foo as def, but it requires potentially expensive look-ahead. See #4173
MT("async_object_function",
"[keyword let] [def obj] [operator =] { [property async] [property foo]([def args]) { [keyword return] [atom true]; } };");
diff --git a/mode/markdown/index.html b/mode/markdown/index.html
index da3fe61b98..4984c04b2c 100644
--- a/mode/markdown/index.html
+++ b/mode/markdown/index.html
@@ -159,7 +159,7 @@ Markdown mode
Unordered (bulleted) lists use asterisks, pluses, and hyphens (`*`,
`+`, and `-`) as list markers. These three markers are
-interchangable; this:
+interchangeable; this:
* Candy.
* Gum.
@@ -306,7 +306,7 @@ Markdown mode
I strongly recommend against using any `<blink>` tags.
I wish SmartyPants used named entities like `—`
- instead of decimal-encoded entites like `—`.
+ instead of decimal-encoded entities like `—`.
Output:
@@ -315,7 +315,7 @@ Markdown mode
<p>I wish SmartyPants used named entities like
<code>&mdash;</code> instead of decimal-encoded
- entites like <code>&#8212;</code>.</p>
+ entities like <code>&#8212;</code>.</p>
To specify an entire block of pre-formatted code, indent every line of
@@ -360,7 +360,7 @@ Markdown mode
});
- If you also want support strikethrough
, emoji
and few other goodies, check out Github-Flavored Markdown mode.
+ If you also want support strikethrough
, emoji
and few other goodies, check out GitHub-Flavored Markdown mode.
Optionally depends on other modes for properly highlighted code blocks,
and XML mode for properly highlighted inline XML blocks.
@@ -370,7 +370,7 @@ Markdown mode
-
highlightFormatting: boolean
- - Whether to separately highlight markdown meta characterts (
*[]()
etc.) (default: false
).
+ - Whether to separately highlight markdown meta characters (
*[]()
etc.) (default: false
).
-
diff --git a/mode/markdown/markdown.js b/mode/markdown/markdown.js
index 287f39b55d..aee76c43ac 100644
--- a/mode/markdown/markdown.js
+++ b/mode/markdown/markdown.js
@@ -223,7 +223,7 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
// Add this list item's content's indentation to the stack
state.listStack.push(state.indentation);
- // Reset inline styles which shouldn't propagate aross list items
+ // Reset inline styles which shouldn't propagate across list items
state.em = false;
state.strong = false;
state.code = false;
diff --git a/mode/markdown/test.js b/mode/markdown/test.js
index 929e7bba19..fd5a1fb4d5 100644
--- a/mode/markdown/test.js
+++ b/mode/markdown/test.js
@@ -315,7 +315,7 @@
"[header&header-2 bar]",
"[header&header-2 ---]");
- MT("setextAferATX",
+ MT("setextAfterATX",
"[header&header-1 # foo]",
"[header&header-2 bar]",
"[header&header-2 ---]");
@@ -659,7 +659,7 @@
" [variable-2 text after fenced code]");
// should correctly parse numbered list content indentation
- MT("listCommonMark_NumeberedListIndent",
+ MT("listCommonMark_NumberedListIndent",
"[variable-2 1000. list with base indent of 6]",
"",
" [variable-2 text must be indented 6 spaces at minimum]",
diff --git a/mode/meta.js b/mode/meta.js
index c7738a514c..92b68074ca 100644
--- a/mode/meta.js
+++ b/mode/meta.js
@@ -44,7 +44,7 @@
{name: "edn", mime: "application/edn", mode: "clojure", ext: ["edn"]},
{name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]},
{name: "Elm", mime: "text/x-elm", mode: "elm", ext: ["elm"]},
- {name: "Embedded Javascript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]},
+ {name: "Embedded JavaScript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]},
{name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]},
{name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]},
{name: "Esper", mime: "text/x-esper", mode: "sql"},
diff --git a/mode/modelica/modelica.js b/mode/modelica/modelica.js
index a83a4135d0..2e9622f03f 100644
--- a/mode/modelica/modelica.js
+++ b/mode/modelica/modelica.js
@@ -90,7 +90,7 @@
return "error";
}
- function tokenUnsignedNuber(stream, state) {
+ function tokenUnsignedNumber(stream, state) {
stream.eatWhile(isDigit);
if (stream.eat('.')) {
stream.eatWhile(isDigit);
@@ -164,9 +164,9 @@
else if(ch == '"') {
state.tokenize = tokenString;
}
- // UNSIGNED_NUBER
+ // UNSIGNED_NUMBER
else if(isDigit.test(ch)) {
- state.tokenize = tokenUnsignedNuber;
+ state.tokenize = tokenUnsignedNumber;
}
// ERROR
else {
diff --git a/mode/mumps/mumps.js b/mode/mumps/mumps.js
index 3671c9cb36..c53b4bf3a2 100644
--- a/mode/mumps/mumps.js
+++ b/mode/mumps/mumps.js
@@ -26,7 +26,7 @@
var brackets = new RegExp("[()]");
var identifiers = new RegExp("^[%A-Za-z][A-Za-z0-9]*");
var commandKeywords = ["break","close","do","else","for","goto", "halt", "hang", "if", "job","kill","lock","merge","new","open", "quit", "read", "set", "tcommit", "trollback", "tstart", "use", "view", "write", "xecute", "b","c","d","e","f","g", "h", "i", "j","k","l","m","n","o", "q", "r", "s", "tc", "tro", "ts", "u", "v", "w", "x"];
- // The following list includes instrinsic functions _and_ special variables
+ // The following list includes intrinsic functions _and_ special variables
var intrinsicFuncsWords = ["\\$ascii", "\\$char", "\\$data", "\\$ecode", "\\$estack", "\\$etrap", "\\$extract", "\\$find", "\\$fnumber", "\\$get", "\\$horolog", "\\$io", "\\$increment", "\\$job", "\\$justify", "\\$length", "\\$name", "\\$next", "\\$order", "\\$piece", "\\$qlength", "\\$qsubscript", "\\$query", "\\$quit", "\\$random", "\\$reverse", "\\$select", "\\$stack", "\\$test", "\\$text", "\\$translate", "\\$view", "\\$x", "\\$y", "\\$a", "\\$c", "\\$d", "\\$e", "\\$ec", "\\$es", "\\$et", "\\$f", "\\$fn", "\\$g", "\\$h", "\\$i", "\\$j", "\\$l", "\\$n", "\\$na", "\\$o", "\\$p", "\\$q", "\\$ql", "\\$qs", "\\$r", "\\$re", "\\$s", "\\$st", "\\$t", "\\$tr", "\\$v", "\\$z"];
var intrinsicFuncs = wordRegexp(intrinsicFuncsWords);
var command = wordRegexp(commandKeywords);
diff --git a/mode/nginx/index.html b/mode/nginx/index.html
index 5c2bc6e2cf..1aa690a6d4 100644
--- a/mode/nginx/index.html
+++ b/mode/nginx/index.html
@@ -62,7 +62,7 @@
NGINX mode
location / {
index index.html index.php; ## Allow a static html file to be shown first
try_files $uri $uri/ @handler; ## If missing pass the URI to Magento's front handler
- expires 30d; ## Assume all files are cachable
+ expires 30d; ## Assume all files are cacheable
}
## These locations would be hidden by .htaccess normally
@@ -128,7 +128,7 @@ NGINX mode
location / {
index index.html index.php; ## Allow a static html file to be shown first
try_files $uri $uri/ @handler; ## If missing pass the URI to Magento's front handler
- expires 30d; ## Assume all files are cachable
+ expires 30d; ## Assume all files are cacheable
}
## These locations would be hidden by .htaccess normally
diff --git a/mode/ntriples/index.html b/mode/ntriples/index.html
index 5473dbffc0..275cf08b49 100644
--- a/mode/ntriples/index.html
+++ b/mode/ntriples/index.html
@@ -58,7 +58,7 @@
"literal 1" .
_:bnode3 .
_:bnode4 "literal 2"@lang .
- # if a graph labe
+ # if a graph label
_:bnode5 "literal 3"^^ .
diff --git a/mode/oz/oz.js b/mode/oz/oz.js
index a9738495b6..63ad806abc 100644
--- a/mode/oz/oz.js
+++ b/mode/oz/oz.js
@@ -130,7 +130,7 @@ CodeMirror.defineMode("oz", function (conf) {
return "operator";
}
- // If nothing match, we skip the entire alphanumerical block
+ // If nothing match, we skip the entire alphanumeric block
stream.eatWhile(/\w/);
return "variable";
diff --git a/mode/perl/perl.js b/mode/perl/perl.js
index 220b0a6994..ffe7877af1 100644
--- a/mode/perl/perl.js
+++ b/mode/perl/perl.js
@@ -347,7 +347,7 @@ CodeMirror.defineMode("perl",function(){
lc :1, // - return lower-case version of a string
lcfirst :1, // - return a string with just the next letter in lower case
length :1, // - return the number of bytes in a string
- 'link' :1, // - create a hard link in the filesytem
+ 'link' :1, // - create a hard link in the filesystem
listen :1, // - register your socket as a server
local : 2, // - create a temporary value for a global variable (dynamic scoping)
localtime :1, // - convert UNIX time into record or string using local time
@@ -441,7 +441,7 @@ CodeMirror.defineMode("perl",function(){
state :1, // - declare and assign a state variable (persistent lexical scoping)
study :1, // - optimize input data for repeated searches
'sub' :1, // - declare a subroutine, possibly anonymously
- 'substr' :1, // - get or alter a portion of a stirng
+ 'substr' :1, // - get or alter a portion of a string
symlink :1, // - create a symbolic link to a file
syscall :1, // - execute an arbitrary system call
sysopen :1, // - open a file, pipe, or descriptor
diff --git a/mode/python/index.html b/mode/python/index.html
index bdfc8f574c..78a3a14641 100644
--- a/mode/python/index.html
+++ b/mode/python/index.html
@@ -190,7 +190,7 @@ Configuration Options for Python mode:
- hangingIndent - int - If you want to write long arguments to a function starting on a new line, how much that line should be indented. Defaults to one normal indentation unit.
Advanced Configuration Options:
- Usefull for superset of python syntax like Enthought enaml, IPython magics and questionmark help
+ Useful for superset of python syntax like Enthought enaml, IPython magics and questionmark help