From f025bec910ce2f1fcb1307db35cae8aa141d49d6 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Thu, 14 Jun 2012 15:52:54 -0600 Subject: [PATCH] If a selection ends on a fold, backspace/delete delete all lines inside the fold --- spec/app/edit-session-spec.coffee | 20 +++++++++++++++++--- src/app/display-buffer.coffee | 6 +++--- src/app/edit-session.coffee | 5 ++++- src/app/fold.coffee | 9 +++++++-- src/app/selection.coffee | 11 +++++++---- 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/spec/app/edit-session-spec.coffee b/spec/app/edit-session-spec.coffee index fddbf1bbe..8a816ff4c 100644 --- a/spec/app/edit-session-spec.coffee +++ b/spec/app/edit-session-spec.coffee @@ -783,6 +783,15 @@ describe "EditSession", -> expect(buffer.lineForRow(7)).toBe " } return sort(left).concat(pivot).concat(sort(right));" expect(buffer.lineForRow(8)).toBe " };" + describe "when the cursor is on a folded screen line", -> + it "deletes all of the folded lines along with the fold", -> + editSession.toggleFoldAtBufferRow(1) + editSession.setCursorScreenPosition([1, 0]) + editSession.backspace() + expect(buffer.lineForRow(1)).toBe "" + expect(buffer.lineForRow(2)).toBe " return sort(Array.apply(this, arguments));" + expect(editSession.getCursorScreenPosition()).toEqual [1, 0] + describe "when there are multiple cursors", -> describe "when cursors are on the same line", -> it "removes the characters preceding each cursor", -> @@ -843,10 +852,15 @@ describe "EditSession", -> describe "when the selection ends on a folded line", -> it "destroys the fold", -> - editSession.createFold(2,4) - editSession.setSelectedBufferRange([[1,0], [2,0]]) + editSession.toggleFoldAtBufferRow(4) + editSession.setSelectedBufferRange([[3,0], [4,0]]) editSession.backspace() - expect(editSession.lineForScreenRow(2).fold).toBeUndefined() + + buffer.logLines() + + expect(buffer.lineForRow(3)).toBe " return sort(left).concat(pivot).concat(sort(right));" + expect(buffer.lineForRow(4)).toBe " };" + expect(editSession.getCursorScreenPosition()).toEqual [3, 0] describe "when there are multiple selections", -> it "removes all selected text", -> diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index fec398f56..b75a482a5 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -61,7 +61,7 @@ class DisplayBuffer [startRow, endRow] = @tokenizedBuffer.rowRangeForFoldAtBufferRow(currentRow) ? [] continue unless startRow? and startRow <= bufferRow <= endRow - if fold = @largestFoldForBufferRow(startRow) + if fold = @largestFoldStartingAtBufferRow(startRow) fold.destroy() else @createFold(startRow, endRow) @@ -121,7 +121,7 @@ class DisplayBuffer _.remove(folds, fold) delete @foldsById[fold.id] - largestFoldForBufferRow: (bufferRow) -> + largestFoldStartingAtBufferRow: (bufferRow) -> return unless folds = @activeFolds[bufferRow] (folds.sort (a, b) -> b.endRow - a.endRow)[0] @@ -200,7 +200,7 @@ class DisplayBuffer screenLine = @tokenizedBuffer.lineForScreenRow(currentBufferRow) screenLine.foldable = @tokenizedBuffer.isBufferRowFoldable(currentBufferRow) - if fold = @largestFoldForBufferRow(currentBufferRow) + if fold = @largestFoldStartingAtBufferRow(currentBufferRow) screenLine = screenLine.copy() screenLine.fold = fold screenLine.bufferDelta = fold.getBufferDelta() diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index bced1fb6a..751d6aefe 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -194,7 +194,7 @@ class EditSession @displayBuffer.destroyFoldsContainingBufferRow(bufferRow) unfoldCurrentRow: (row) -> - @displayBuffer.largestFoldForBufferRow(@getLastCursor().getCurrentBufferRow())?.destroy() + @displayBuffer.largestFoldStartingAtBufferRow(@getLastCursor().getCurrentBufferRow())?.destroy() destroyFold: (foldId) -> fold = @displayBuffer.foldsById[foldId] @@ -204,6 +204,9 @@ class EditSession isFoldedAtScreenRow: (screenRow) -> @lineForScreenRow(screenRow).fold? + largestFoldStartingAtBufferRow: (bufferRow) -> + @displayBuffer.largestFoldStartingAtBufferRow(bufferRow) + autoIndentTextAfterBufferPosition: (text, bufferPosition) -> return { text } unless @autoIndent @tokenizedBuffer.autoIndentTextAfterBufferPosition(text, bufferPosition) diff --git a/src/app/fold.coffee b/src/app/fold.coffee index 41e631453..966bf86f5 100644 --- a/src/app/fold.coffee +++ b/src/app/fold.coffee @@ -18,8 +18,13 @@ class Fold inspect: -> "Fold(#{@startRow}, #{@endRow})" - getBufferRange: -> - new Range([@startRow, 0], [@endRow, Infinity]) + getBufferRange: ({includeNewline}={}) -> + if includeNewline + end = [@endRow + 1, 0] + else + end = [@endRow, Infinity] + + new Range([@startRow, 0], end) getBufferDelta: -> new Point(@endRow - @startRow + 1, 0) diff --git a/src/app/selection.coffee b/src/app/selection.coffee index 38b028f77..59f673bf7 100644 --- a/src/app/selection.coffee +++ b/src/app/selection.coffee @@ -132,9 +132,7 @@ class Selection @autoOutdent() if shouldOutdent backspace: -> - @editSession.destroyFoldsContainingBufferRow(@getBufferRange().end.row) - - if @isEmpty() + if @isEmpty() and not @editSession.isFoldedAtScreenRow(@cursor.getCurrentScreenRow()) if @editSession.isFoldedAtScreenRow(@cursor.getCurrentScreenRow() - 1) @selectToBufferPosition([@cursor.getCurrentBufferRow() - 1, Infinity]) else @@ -156,8 +154,13 @@ class Selection deleteSelectedText: -> bufferRange = @getBufferRange() + if fold = @editSession.largestFoldStartingAtBufferRow(bufferRange.end.row) + bufferRange = bufferRange.union(fold.getBufferRange(includeNewline: true)) + @editSession.buffer.delete(bufferRange) unless bufferRange.isEmpty() - @clear() if @cursor + if @cursor + @cursor.setBufferPosition(bufferRange.start) + @clear() indentSelectedRows: -> range = @getBufferRange()