From 63971a2f1e91ab66f05e190846b256e50d12c8f8 Mon Sep 17 00:00:00 2001 From: Ben Thayer Date: Fri, 13 Sep 2019 17:38:54 -0500 Subject: [PATCH 1/5] Fixed multicursor backspacing --- packages/codemirror/src/editor.ts | 47 +++++++++++++++---------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/packages/codemirror/src/editor.ts b/packages/codemirror/src/editor.ts index d68ff9601f07..7395b2945d7d 100644 --- a/packages/codemirror/src/editor.ts +++ b/packages/codemirror/src/editor.ts @@ -1361,31 +1361,30 @@ namespace Private { */ export function delSpaceToPrevTabStop(cm: CodeMirror.Editor): void { let doc = cm.getDoc(); - let from = doc.getCursor('from'); - let to = doc.getCursor('to'); - let sel = !posEq(from, to); - if (sel) { - let ranges = doc.listSelections(); - for (let i = ranges.length - 1; i >= 0; i--) { - let head = ranges[i].head; - let anchor = ranges[i].anchor; - doc.replaceRange( - '', - CodeMirror.Pos(head.line, head.ch), - CodeMirror.Pos(anchor.line, anchor.ch) - ); + var tabSize = doc.getOption('indentUnit'); + var ranges = doc.listSelections(); // handle multicursor + for (var i = ranges.length - 1; i >= 0; i--) { + // iterate reverse so any deletions don't overlap + var head = ranges[i].head; + var anchor = ranges[i].anchor; + var sel = !posEq(head, anchor); + if (sel) { + // range is selection + doc.replaceRange('', anchor, head); + } else { + // range is cursor + var line = doc.getLine(head.line).substring(0, head.ch); + if (line.match(/^\ +$/) !== null) { + // delete tabs + var prevTabStop = (Math.ceil(head.ch / tabSize) - 1) * tabSize; + var from = CodeMirror.Position(head.line, prevTabStop); + doc.replaceRange('', from, head); + } else { + // delete non-tabs + var from = CodeMirror.Position(head.line, head.ch - 1); + doc.replaceRange('', from, head); + } } - return; - } - let cur = doc.getCursor(); - let tabsize = cm.getOption('indentUnit'); - let chToPrevTabStop = cur.ch - (Math.ceil(cur.ch / tabsize) - 1) * tabsize; - from = { ch: cur.ch - chToPrevTabStop, line: cur.line }; - let select = doc.getRange(from, cur); - if (select.match(/^\ +$/) !== null) { - doc.replaceRange('', from, cur); - } else { - CodeMirror.commands['delCharBefore'](cm); } } From 1d5eb4ba93394768f7fee31e1877df4d0ee55622 Mon Sep 17 00:00:00 2001 From: Ben Thayer Date: Mon, 21 Oct 2019 22:08:35 -0500 Subject: [PATCH 2/5] Fixed build errors --- packages/codemirror/src/editor.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/codemirror/src/editor.ts b/packages/codemirror/src/editor.ts index 7395b2945d7d..ef529e838eb9 100644 --- a/packages/codemirror/src/editor.ts +++ b/packages/codemirror/src/editor.ts @@ -1361,7 +1361,7 @@ namespace Private { */ export function delSpaceToPrevTabStop(cm: CodeMirror.Editor): void { let doc = cm.getDoc(); - var tabSize = doc.getOption('indentUnit'); + var tabSize = cm.getOption('indentUnit'); var ranges = doc.listSelections(); // handle multicursor for (var i = ranges.length - 1; i >= 0; i--) { // iterate reverse so any deletions don't overlap @@ -1377,11 +1377,11 @@ namespace Private { if (line.match(/^\ +$/) !== null) { // delete tabs var prevTabStop = (Math.ceil(head.ch / tabSize) - 1) * tabSize; - var from = CodeMirror.Position(head.line, prevTabStop); + var from = CodeMirror.Pos(head.line, prevTabStop); doc.replaceRange('', from, head); } else { // delete non-tabs - var from = CodeMirror.Position(head.line, head.ch - 1); + var from = CodeMirror.Pos(head.line, head.ch - 1); doc.replaceRange('', from, head); } } From 3bdc09782cc552af72e2296d1aede71bd450ab91 Mon Sep 17 00:00:00 2001 From: Ben Thayer Date: Mon, 21 Oct 2019 22:20:26 -0500 Subject: [PATCH 3/5] Changed variable for clarity --- packages/codemirror/src/editor.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/codemirror/src/editor.ts b/packages/codemirror/src/editor.ts index ef529e838eb9..deb8476ae7a3 100644 --- a/packages/codemirror/src/editor.ts +++ b/packages/codemirror/src/editor.ts @@ -1367,12 +1367,10 @@ namespace Private { // iterate reverse so any deletions don't overlap var head = ranges[i].head; var anchor = ranges[i].anchor; - var sel = !posEq(head, anchor); - if (sel) { - // range is selection + var isSelection = !posEq(head, anchor); + if (isSelection) { doc.replaceRange('', anchor, head); } else { - // range is cursor var line = doc.getLine(head.line).substring(0, head.ch); if (line.match(/^\ +$/) !== null) { // delete tabs From a56a093628d7a4c0cccdb0a06dee00db2ab3cfc0 Mon Sep 17 00:00:00 2001 From: Ben Thayer Date: Mon, 21 Oct 2019 23:38:24 -0500 Subject: [PATCH 4/5] Fixed backspacing newlines --- packages/codemirror/src/editor.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/codemirror/src/editor.ts b/packages/codemirror/src/editor.ts index deb8476ae7a3..45df4d12b285 100644 --- a/packages/codemirror/src/editor.ts +++ b/packages/codemirror/src/editor.ts @@ -1379,8 +1379,18 @@ namespace Private { doc.replaceRange('', from, head); } else { // delete non-tabs - var from = CodeMirror.Pos(head.line, head.ch - 1); - doc.replaceRange('', from, head); + if (head.ch == 0) { + if (head.line != 0) { + var from = CodeMirror.Pos( + head.line - 1, + doc.getLine(head.line - 1).length + ); + doc.replaceRange('', from, head); + } + } else { + var from = CodeMirror.Pos(head.line, head.ch - 1); + doc.replaceRange('', from, head); + } } } } From ec6c3f188a1ba52c959399c42e330c8a92ae13f0 Mon Sep 17 00:00:00 2001 From: Ben Thayer Date: Thu, 24 Oct 2019 12:55:35 -0500 Subject: [PATCH 5/5] Changed var to let and == to === and != to !== --- packages/codemirror/src/editor.ts | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/codemirror/src/editor.ts b/packages/codemirror/src/editor.ts index 45df4d12b285..8c8ae190a1a3 100644 --- a/packages/codemirror/src/editor.ts +++ b/packages/codemirror/src/editor.ts @@ -1361,34 +1361,34 @@ namespace Private { */ export function delSpaceToPrevTabStop(cm: CodeMirror.Editor): void { let doc = cm.getDoc(); - var tabSize = cm.getOption('indentUnit'); - var ranges = doc.listSelections(); // handle multicursor - for (var i = ranges.length - 1; i >= 0; i--) { + let tabSize = cm.getOption('indentUnit'); + let ranges = doc.listSelections(); // handle multicursor + for (let i = ranges.length - 1; i >= 0; i--) { // iterate reverse so any deletions don't overlap - var head = ranges[i].head; - var anchor = ranges[i].anchor; - var isSelection = !posEq(head, anchor); + let head = ranges[i].head; + let anchor = ranges[i].anchor; + let isSelection = !posEq(head, anchor); if (isSelection) { doc.replaceRange('', anchor, head); } else { - var line = doc.getLine(head.line).substring(0, head.ch); + let line = doc.getLine(head.line).substring(0, head.ch); if (line.match(/^\ +$/) !== null) { // delete tabs - var prevTabStop = (Math.ceil(head.ch / tabSize) - 1) * tabSize; - var from = CodeMirror.Pos(head.line, prevTabStop); + let prevTabStop = (Math.ceil(head.ch / tabSize) - 1) * tabSize; + let from = CodeMirror.Pos(head.line, prevTabStop); doc.replaceRange('', from, head); } else { // delete non-tabs - if (head.ch == 0) { - if (head.line != 0) { - var from = CodeMirror.Pos( + if (head.ch === 0) { + if (head.line !== 0) { + let from = CodeMirror.Pos( head.line - 1, doc.getLine(head.line - 1).length ); doc.replaceRange('', from, head); } } else { - var from = CodeMirror.Pos(head.line, head.ch - 1); + let from = CodeMirror.Pos(head.line, head.ch - 1); doc.replaceRange('', from, head); } }