From 76ffa5a2c53b49c8f237b1dcae8c8a4edc372a5c Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Fri, 27 Jul 2012 11:47:30 -0700 Subject: [PATCH 1/7] change toggle-fold to fold --- spec/app/display-buffer-spec.coffee | 13 +++++-------- src/app/display-buffer.coffee | 10 ++++------ src/app/edit-session.coffee | 11 ++++------- src/app/editor.coffee | 4 ++-- 4 files changed, 15 insertions(+), 23 deletions(-) diff --git a/spec/app/display-buffer-spec.coffee b/spec/app/display-buffer-spec.coffee index 70faf4c21..3a90f3857 100644 --- a/spec/app/display-buffer-spec.coffee +++ b/spec/app/display-buffer-spec.coffee @@ -172,27 +172,24 @@ describe "DisplayBuffer", -> expect(displayBuffer.activeFolds[4].length).toBe(1) it "doesn't fold lines that are already folded", -> - displayBuffer.toggleFoldAtBufferRow(4) + displayBuffer.foldScopeContainingBufferRow(4) displayBuffer.foldAll() expect(Object.keys(displayBuffer.activeFolds).length).toBe(3) expect(displayBuffer.activeFolds[0].length).toBe(1) expect(displayBuffer.activeFolds[1].length).toBe(1) expect(displayBuffer.activeFolds[4].length).toBe(1) - describe ".toggleFoldAtBufferRow(bufferRow)", -> + describe ".foldScopeContainingBufferRow(bufferRow)", -> describe "when bufferRow can be folded", -> - it "creates/destroys a fold based on the syntactic region starting at the given row", -> - displayBuffer.toggleFoldAtBufferRow(1) + it "creates a fold based on the syntactic region starting at the given row", -> + displayBuffer.foldScopeContainingBufferRow(1) fold = displayBuffer.lineForRow(1).fold expect(fold.startRow).toBe 1 expect(fold.endRow).toBe 9 - displayBuffer.toggleFoldAtBufferRow(1) - expect(displayBuffer.lineForRow(1).fold).toBeUndefined() - describe "when bufferRow can't be folded", -> it "searches upward for the first row that begins a syntatic region containing the given buffer row (and folds it)", -> - displayBuffer.toggleFoldAtBufferRow(8) + displayBuffer.foldScopeContainingBufferRow(8) fold = displayBuffer.lineForRow(1).fold expect(fold.startRow).toBe 1 expect(fold.endRow).toBe 9 diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index 2ea45661a..dc5a41077 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -56,17 +56,15 @@ class DisplayBuffer @createFold(startRow, endRow) - toggleFoldAtBufferRow: (bufferRow) -> + foldScopeContainingBufferRow: (bufferRow) -> for currentRow in [bufferRow..0] [startRow, endRow] = @tokenizedBuffer.rowRangeForFoldAtBufferRow(currentRow) ? [] continue unless startRow? and startRow <= bufferRow <= endRow + fold = @largestFoldStartingAtBufferRow(startRow) + @createFold(startRow, endRow) unless fold - if fold = @largestFoldStartingAtBufferRow(startRow) - fold.destroy() - else - @createFold(startRow, endRow) + return - break isFoldContainedByActiveFold: (fold) -> for row, folds of @activeFolds diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 90996f294..3eabf2c25 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -198,19 +198,16 @@ class EditSession redo: -> @buffer.redo(this) + fold: -> + bufferRow = @bufferPositionForScreenPosition(@getCursorScreenPosition()).row + @foldAtBufferRow(bufferRow) + foldSelection: -> selection.fold() for selection in @getSelections() foldAll: -> @displayBuffer.foldAll() - toggleFold: -> - bufferRow = @bufferPositionForScreenPosition(@getCursorScreenPosition()).row - @toggleFoldAtBufferRow(bufferRow) - - toggleFoldAtBufferRow: (bufferRow) -> - @displayBuffer.toggleFoldAtBufferRow(bufferRow) - createFold: (startRow, endRow) -> @displayBuffer.createFold(startRow, endRow) diff --git a/src/app/editor.coffee b/src/app/editor.coffee index 49e52e002..71e5113c6 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -139,7 +139,7 @@ class Editor extends View 'newline-below': @insertNewlineBelow 'toggle-soft-wrap': @toggleSoftWrap 'fold-all': @foldAll - 'toggle-fold': @toggleFold + 'fold': @fold 'fold-selection': @foldSelection 'unfold': => @unfoldCurrentRow() 'split-left': @splitLeft @@ -220,11 +220,11 @@ class Editor extends View undo: -> @activeEditSession.undo() redo: -> @activeEditSession.redo() createFold: (startRow, endRow) -> @activeEditSession.createFold(startRow, endRow) + fold: -> @activeEditSession.fold() foldAll: -> @activeEditSession.foldAll() foldSelection: -> @activeEditSession.foldSelection() destroyFold: (foldId) -> @activeEditSession.destroyFold(foldId) destroyFoldsContainingBufferRow: (bufferRow) -> @activeEditSession.destroyFoldsContainingBufferRow(bufferRow) - toggleFold: -> @activeEditSession.toggleFold() isFoldedAtScreenRow: (screenRow) -> @activeEditSession.isFoldedAtScreenRow(screenRow) unfoldCurrentRow: -> @activeEditSession.unfoldCurrentRow() From 7ff31d1ad7298194b009db576de6ab87a79bc6b6 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Fri, 27 Jul 2012 13:46:50 -0700 Subject: [PATCH 2/7] Remove toggleFold and replace with fold --- spec/app/edit-session-spec.coffee | 51 ++++++------------------------- spec/app/editor-spec.coffee | 4 +-- src/app/display-buffer.coffee | 24 ++++++++++----- src/app/edit-session.coffee | 5 ++- 4 files changed, 32 insertions(+), 52 deletions(-) diff --git a/spec/app/edit-session-spec.coffee b/spec/app/edit-session-spec.coffee index 796c4905c..9cf2c354a 100644 --- a/spec/app/edit-session-spec.coffee +++ b/spec/app/edit-session-spec.coffee @@ -825,7 +825,7 @@ describe "EditSession", -> describe "when the cursor is on the first column of a line below a fold", -> it "absorbs the current line into the fold", -> editSession.setCursorScreenPosition([4,0]) - editSession.toggleFold() + editSession.fold() editSession.setCursorScreenPosition([5,0]) editSession.backspace() @@ -835,7 +835,7 @@ describe "EditSession", -> describe "when the cursor is in the middle of a line below a fold", -> it "backspaces as normal", -> editSession.setCursorScreenPosition([4,0]) - editSession.toggleFold() + editSession.fold() editSession.setCursorScreenPosition([5,5]) editSession.backspace() @@ -845,7 +845,7 @@ describe "EditSession", -> describe "when the cursor is on a folded screen line", -> it "deletes all of the folded lines along with the fold", -> editSession.setCursorBufferPosition([3, 0]) - editSession.toggleFold() + editSession.fold() editSession.backspace() expect(buffer.lineForRow(1)).toBe "" expect(buffer.lineForRow(2)).toBe " return sort(Array.apply(this, arguments));" @@ -912,7 +912,7 @@ describe "EditSession", -> describe "when the selection ends on a folded line", -> it "destroys the fold", -> editSession.setSelectedBufferRange([[3,0], [4,0]]) - editSession.toggleFoldAtBufferRow(4) + editSession.foldScopeContainingBufferRow(4) editSession.backspace() expect(buffer.lineForRow(3)).toBe " return sort(left).concat(pivot).concat(sort(right));" @@ -972,7 +972,7 @@ describe "EditSession", -> describe "when the cursor is on the end of a line above a fold", -> it "only deletes the lines inside the fold", -> - editSession.toggleFoldAtBufferRow(4) + editSession.foldScopeContainingBufferRow(4) editSession.setCursorScreenPosition([3, Infinity]) cursorPositionBefore = editSession.getCursorScreenPosition() @@ -984,7 +984,7 @@ describe "EditSession", -> describe "when the cursor is in the middle a line above a fold", -> it "deletes as normal", -> - editSession.toggleFoldAtBufferRow(4) + editSession.foldScopeContainingBufferRow(4) editSession.setCursorScreenPosition([3, 4]) cursorPositionBefore = editSession.getCursorScreenPosition() @@ -1371,41 +1371,10 @@ describe "EditSession", -> describe "folding", -> describe "structural folding", -> - describe "when a toggle-fold event is triggered", -> - it "creates/destroys a structual fold based on cursor position", -> - editSession.setCursorBufferPosition([1,0]) - - editSession.toggleFold() - expect(editSession.lineForScreenRow(1).fold).toBeDefined() - - editSession.toggleFold() - expect(editSession.lineForScreenRow(1).fold).toBeUndefined() - - it "creates/destroys the largest fold containing the cursor position", -> - editSession.foldAll() - editSession.setCursorBufferPosition([5,1]) - - editSession.toggleFold() - expect(editSession.lineForScreenRow(0).fold).toBeUndefined() - expect(editSession.lineForScreenRow(1).fold).toBeDefined() - - editSession.toggleFold() - expect(editSession.lineForScreenRow(0).fold).toBeUndefined() - expect(editSession.lineForScreenRow(1).fold).toBeUndefined() - expect(editSession.lineForScreenRow(4).fold).toBeDefined() - - describe "when a fold-all event is triggered", -> - it "creates folds on every line that can be folded", -> - editSession.setCursorBufferPosition([5,13]) - - editSession.foldAll() - expect(editSession.lineForScreenRow(0).fold).toBeDefined() - expect(editSession.lineForScreenRow(1)).toBeUndefined() - - it "maintains cursor buffer position when a fold is created/destroyed", -> - editSession.setCursorBufferPosition([5,5]) - editSession.foldAll() - expect(editSession.getCursorBufferPosition()).toEqual([5,5]) + it "maintains cursor buffer position when a fold is created/destroyed", -> + editSession.setCursorBufferPosition([5,5]) + editSession.foldAll() + expect(editSession.getCursorBufferPosition()).toEqual([5,5]) describe "anchors", -> [anchor, destroyHandler] = [] diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 7f840d27e..8a5c3fab8 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -1377,8 +1377,8 @@ describe "Editor", -> it "renders lines properly", -> editor.lineOverdraw = 1 editor.attachToDom(heightInLines: 5) - editor.activeEditSession.toggleFoldAtBufferRow(4) - editor.activeEditSession.toggleFoldAtBufferRow(0) + editor.activeEditSession.foldScopeContainingBufferRow(4) + editor.activeEditSession.foldScopeContainingBufferRow(0) expect(editor.renderedLines.find('.line').length).toBe 1 expect(editor.renderedLines.find('.line').text()).toBe buffer.lineForRow(0) diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index dc5a41077..b651dbc16 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -65,15 +65,14 @@ class DisplayBuffer return + unfoldScopeContainingBufferRow: (bufferRow) -> + for currentRow in [bufferRow..0] + [startRow, endRow] = @tokenizedBuffer.rowRangeForFoldAtBufferRow(currentRow) ? [] + continue unless startRow? and startRow <= bufferRow <= endRow + fold = @largestFoldStartingAtBufferRow(startRow) + fold.destroy() if fold - isFoldContainedByActiveFold: (fold) -> - for row, folds of @activeFolds - for otherFold in folds - return otherFold if fold != otherFold and fold.isContainedByFold(otherFold) - - foldFor: (startRow, endRow) -> - _.find @activeFolds[startRow] ? [], (fold) -> - fold.startRow == startRow and fold.endRow == endRow + return createFold: (startRow, endRow) -> return fold if fold = @foldFor(startRow, endRow) @@ -92,6 +91,15 @@ class DisplayBuffer fold + isFoldContainedByActiveFold: (fold) -> + for row, folds of @activeFolds + for otherFold in folds + return otherFold if fold != otherFold and fold.isContainedByFold(otherFold) + + foldFor: (startRow, endRow) -> + _.find @activeFolds[startRow] ? [], (fold) -> + fold.startRow == startRow and fold.endRow == endRow + destroyFold: (fold) -> @unregisterFold(fold.startRow, fold) diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 3eabf2c25..e6a5ce891 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -200,7 +200,10 @@ class EditSession fold: -> bufferRow = @bufferPositionForScreenPosition(@getCursorScreenPosition()).row - @foldAtBufferRow(bufferRow) + @foldScopeContainingBufferRow(bufferRow) + + foldScopeContainingBufferRow: (bufferRow) -> + @displayBuffer.foldScopeContainingBufferRow(bufferRow) foldSelection: -> selection.fold() for selection in @getSelections() From 69d7ff0a55f3f7ddccc4457894417be61eeb9ff1 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Fri, 27 Jul 2012 16:05:56 -0700 Subject: [PATCH 3/7] add unfold to display buffer --- spec/app/display-buffer-spec.coffee | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/spec/app/display-buffer-spec.coffee b/spec/app/display-buffer-spec.coffee index 3a90f3857..3932bbab6 100644 --- a/spec/app/display-buffer-spec.coffee +++ b/spec/app/display-buffer-spec.coffee @@ -194,6 +194,21 @@ describe "DisplayBuffer", -> expect(fold.startRow).toBe 1 expect(fold.endRow).toBe 9 + describe ".unfoldScopeContainingBufferRow(bufferRow)", -> + describe "when bufferRow can be unfolded", -> + it "destroys a fold based on the syntactic region starting at the given row", -> + displayBuffer.foldScopeContainingBufferRow(1) + expect(displayBuffer.lineForRow(1).fold).toBeDefined() + + displayBuffer.unfoldScopeContainingBufferRow(1) + expect(displayBuffer.lineForRow(1).fold).toBeUndefined() + + describe "when bufferRow can't be unfolded", -> + it "does not throw an error", -> + expect(displayBuffer.lineForRow(1).fold).toBeUndefined() + displayBuffer.unfoldScopeContainingBufferRow(1) + expect(displayBuffer.lineForRow(1).fold).toBeUndefined() + describe "primitive folding", -> beforeEach -> buffer.destroy() From 75f0438f6a168955a634a37cc341050922647309 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Mon, 30 Jul 2012 09:41:59 -0700 Subject: [PATCH 4/7] Rename fold/unfold to foldCurrentRow/unfoldCurrentRow --- spec/app/edit-session-spec.coffee | 6 +++--- spec/app/editor-spec.coffee | 12 ++++++------ src/app/edit-session.coffee | 15 ++++++++------- src/app/editor.coffee | 8 ++++---- src/app/keymaps/editor.coffee | 4 ++-- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/spec/app/edit-session-spec.coffee b/spec/app/edit-session-spec.coffee index 9cf2c354a..9f5d9eb5d 100644 --- a/spec/app/edit-session-spec.coffee +++ b/spec/app/edit-session-spec.coffee @@ -825,7 +825,7 @@ describe "EditSession", -> describe "when the cursor is on the first column of a line below a fold", -> it "absorbs the current line into the fold", -> editSession.setCursorScreenPosition([4,0]) - editSession.fold() + editSession.foldCurrentRow() editSession.setCursorScreenPosition([5,0]) editSession.backspace() @@ -835,7 +835,7 @@ describe "EditSession", -> describe "when the cursor is in the middle of a line below a fold", -> it "backspaces as normal", -> editSession.setCursorScreenPosition([4,0]) - editSession.fold() + editSession.foldCurrentRow() editSession.setCursorScreenPosition([5,5]) editSession.backspace() @@ -845,7 +845,7 @@ describe "EditSession", -> describe "when the cursor is on a folded screen line", -> it "deletes all of the folded lines along with the fold", -> editSession.setCursorBufferPosition([3, 0]) - editSession.fold() + editSession.foldCurrentRow() editSession.backspace() expect(buffer.lineForRow(1)).toBe "" expect(buffer.lineForRow(2)).toBe " return sort(Array.apply(this, arguments));" diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 8a5c3fab8..1221397ac 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -1569,8 +1569,8 @@ describe "Editor", -> describe "when a fold placeholder line is clicked", -> it "removes the associated fold and places the cursor at its beginning", -> - editor.getSelection().setBufferRange(new Range([3, 0], [9, 0])) - editor.trigger 'fold-selection' + editor.setCursorBufferPosition([3,0]) + editor.trigger 'fold-current-row' editor.find('.fold.line').mousedown() @@ -1580,13 +1580,13 @@ describe "Editor", -> expect(editor.getCursorBufferPosition()).toEqual [3, 0] - describe "when the unfold event is triggered when the cursor is on a fold placeholder line", -> + describe "when the unfold-current-row event is triggered when the cursor is on a fold placeholder line", -> it "removes the associated fold and places the cursor at its beginning", -> - editor.getSelection().setBufferRange(new Range([3, 0], [9, 0])) - editor.trigger 'fold-selection' + editor.setCursorBufferPosition([3,0]) + editor.trigger 'fold-current-row' editor.setCursorBufferPosition([3,0]) - editor.trigger 'unfold' + editor.trigger 'unfold-current-row' expect(editor.find('.fold')).not.toExist() expect(editor.renderedLines.find('.line:eq(4)').text()).toMatch /4-+/ diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index e6a5ce891..b1c820185 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -198,13 +198,20 @@ class EditSession redo: -> @buffer.redo(this) - fold: -> + foldCurrentRow: -> bufferRow = @bufferPositionForScreenPosition(@getCursorScreenPosition()).row @foldScopeContainingBufferRow(bufferRow) foldScopeContainingBufferRow: (bufferRow) -> @displayBuffer.foldScopeContainingBufferRow(bufferRow) + unfoldCurrentRow: -> + bufferRow = @bufferPositionForScreenPosition(@getCursorScreenPosition()).row + @unfoldScopeContainingBufferRow(bufferRow) + + unfoldScopeContainingBufferRow: (bufferRow) -> + @displayBuffer.unfoldScopeContainingBufferRow(bufferRow) + foldSelection: -> selection.fold() for selection in @getSelections() @@ -221,9 +228,6 @@ class EditSession for row in [bufferRange.start.row..bufferRange.end.row] @destroyFoldsContainingBufferRow(row) - unfoldCurrentRow: -> - @largestFoldStartingAtBufferRow(@getLastCursor().getBufferRow())?.destroy() - destroyFold: (foldId) -> fold = @displayBuffer.foldsById[foldId] fold.destroy() @@ -232,9 +236,6 @@ class EditSession isFoldedAtScreenRow: (screenRow) -> @lineForScreenRow(screenRow).fold? - largestFoldStartingAtBufferRow: (bufferRow) -> - @displayBuffer.largestFoldStartingAtBufferRow(bufferRow) - largestFoldContainingBufferRow: (bufferRow) -> @displayBuffer.largestFoldContainingBufferRow(bufferRow) diff --git a/src/app/editor.coffee b/src/app/editor.coffee index 71e5113c6..3ac7bbd0a 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -139,9 +139,9 @@ class Editor extends View 'newline-below': @insertNewlineBelow 'toggle-soft-wrap': @toggleSoftWrap 'fold-all': @foldAll - 'fold': @fold + 'fold-current-row': @foldCurrentRow + 'unfold-current-row': @unfoldCurrentRow 'fold-selection': @foldSelection - 'unfold': => @unfoldCurrentRow() 'split-left': @splitLeft 'split-right': @splitRight 'split-up': @splitUp @@ -220,13 +220,13 @@ class Editor extends View undo: -> @activeEditSession.undo() redo: -> @activeEditSession.redo() createFold: (startRow, endRow) -> @activeEditSession.createFold(startRow, endRow) - fold: -> @activeEditSession.fold() + foldCurrentRow: -> @activeEditSession.foldCurrentRow() + unfoldCurrentRow: -> @activeEditSession.unfoldCurrentRow() foldAll: -> @activeEditSession.foldAll() foldSelection: -> @activeEditSession.foldSelection() destroyFold: (foldId) -> @activeEditSession.destroyFold(foldId) destroyFoldsContainingBufferRow: (bufferRow) -> @activeEditSession.destroyFoldsContainingBufferRow(bufferRow) isFoldedAtScreenRow: (screenRow) -> @activeEditSession.isFoldedAtScreenRow(screenRow) - unfoldCurrentRow: -> @activeEditSession.unfoldCurrentRow() lineForScreenRow: (screenRow) -> @activeEditSession.lineForScreenRow(screenRow) linesForScreenRows: (start, end) -> @activeEditSession.linesForScreenRows(start, end) diff --git a/src/app/keymaps/editor.coffee b/src/app/keymaps/editor.coffee index 60aef8450..d0c5e9e85 100644 --- a/src/app/keymaps/editor.coffee +++ b/src/app/keymaps/editor.coffee @@ -17,10 +17,10 @@ window.keymap.bindKeys '.editor', 'meta-z': 'undo' 'meta-Z': 'redo' 'alt-meta-w': 'toggle-soft-wrap' - 'ctrl-9': 'toggle-fold' + 'ctrl-[': 'fold-current-row' + 'ctrl-]': 'unfold-current-row' 'ctrl-(': 'fold-all' 'alt-meta-ctrl-f': 'fold-selection' - 'alt-meta-u': 'unfold' 'alt-meta-left': 'split-left' 'alt-meta-right': 'split-right' 'alt-meta-up': 'split-up' From 9622d6f9b3bc9cedd779c910a9f3ae46bc290117 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Mon, 30 Jul 2012 10:25:53 -0700 Subject: [PATCH 5/7] Rename un/foldScopeContainingBufferRow to un/foldBufferRow. Scope containing buffer row was a misnomer. Waiting until I implement the repeat folding feature before considering a better name. --- spec/app/display-buffer-spec.coffee | 16 ++++++++-------- spec/app/edit-session-spec.coffee | 6 +++--- spec/app/editor-spec.coffee | 4 ++-- src/app/display-buffer.coffee | 4 ++-- src/app/edit-session.coffee | 12 ++++++------ 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/spec/app/display-buffer-spec.coffee b/spec/app/display-buffer-spec.coffee index 3932bbab6..7475ba31e 100644 --- a/spec/app/display-buffer-spec.coffee +++ b/spec/app/display-buffer-spec.coffee @@ -172,41 +172,41 @@ describe "DisplayBuffer", -> expect(displayBuffer.activeFolds[4].length).toBe(1) it "doesn't fold lines that are already folded", -> - displayBuffer.foldScopeContainingBufferRow(4) + displayBuffer.foldBufferRow(4) displayBuffer.foldAll() expect(Object.keys(displayBuffer.activeFolds).length).toBe(3) expect(displayBuffer.activeFolds[0].length).toBe(1) expect(displayBuffer.activeFolds[1].length).toBe(1) expect(displayBuffer.activeFolds[4].length).toBe(1) - describe ".foldScopeContainingBufferRow(bufferRow)", -> + describe ".foldBufferRow(bufferRow)", -> describe "when bufferRow can be folded", -> it "creates a fold based on the syntactic region starting at the given row", -> - displayBuffer.foldScopeContainingBufferRow(1) + displayBuffer.foldBufferRow(1) fold = displayBuffer.lineForRow(1).fold expect(fold.startRow).toBe 1 expect(fold.endRow).toBe 9 describe "when bufferRow can't be folded", -> it "searches upward for the first row that begins a syntatic region containing the given buffer row (and folds it)", -> - displayBuffer.foldScopeContainingBufferRow(8) + displayBuffer.foldBufferRow(8) fold = displayBuffer.lineForRow(1).fold expect(fold.startRow).toBe 1 expect(fold.endRow).toBe 9 - describe ".unfoldScopeContainingBufferRow(bufferRow)", -> + describe ".unfoldBufferRow(bufferRow)", -> describe "when bufferRow can be unfolded", -> it "destroys a fold based on the syntactic region starting at the given row", -> - displayBuffer.foldScopeContainingBufferRow(1) + displayBuffer.foldBufferRow(1) expect(displayBuffer.lineForRow(1).fold).toBeDefined() - displayBuffer.unfoldScopeContainingBufferRow(1) + displayBuffer.unfoldBufferRow(1) expect(displayBuffer.lineForRow(1).fold).toBeUndefined() describe "when bufferRow can't be unfolded", -> it "does not throw an error", -> expect(displayBuffer.lineForRow(1).fold).toBeUndefined() - displayBuffer.unfoldScopeContainingBufferRow(1) + displayBuffer.unfoldBufferRow(1) expect(displayBuffer.lineForRow(1).fold).toBeUndefined() describe "primitive folding", -> diff --git a/spec/app/edit-session-spec.coffee b/spec/app/edit-session-spec.coffee index 9f5d9eb5d..8a9b29d01 100644 --- a/spec/app/edit-session-spec.coffee +++ b/spec/app/edit-session-spec.coffee @@ -912,7 +912,7 @@ describe "EditSession", -> describe "when the selection ends on a folded line", -> it "destroys the fold", -> editSession.setSelectedBufferRange([[3,0], [4,0]]) - editSession.foldScopeContainingBufferRow(4) + editSession.foldBufferRow(4) editSession.backspace() expect(buffer.lineForRow(3)).toBe " return sort(left).concat(pivot).concat(sort(right));" @@ -972,7 +972,7 @@ describe "EditSession", -> describe "when the cursor is on the end of a line above a fold", -> it "only deletes the lines inside the fold", -> - editSession.foldScopeContainingBufferRow(4) + editSession.foldBufferRow(4) editSession.setCursorScreenPosition([3, Infinity]) cursorPositionBefore = editSession.getCursorScreenPosition() @@ -984,7 +984,7 @@ describe "EditSession", -> describe "when the cursor is in the middle a line above a fold", -> it "deletes as normal", -> - editSession.foldScopeContainingBufferRow(4) + editSession.foldBufferRow(4) editSession.setCursorScreenPosition([3, 4]) cursorPositionBefore = editSession.getCursorScreenPosition() diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 1221397ac..5836cdf16 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -1377,8 +1377,8 @@ describe "Editor", -> it "renders lines properly", -> editor.lineOverdraw = 1 editor.attachToDom(heightInLines: 5) - editor.activeEditSession.foldScopeContainingBufferRow(4) - editor.activeEditSession.foldScopeContainingBufferRow(0) + editor.activeEditSession.foldBufferRow(4) + editor.activeEditSession.foldBufferRow(0) expect(editor.renderedLines.find('.line').length).toBe 1 expect(editor.renderedLines.find('.line').text()).toBe buffer.lineForRow(0) diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index b651dbc16..7e8452e31 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -56,7 +56,7 @@ class DisplayBuffer @createFold(startRow, endRow) - foldScopeContainingBufferRow: (bufferRow) -> + foldBufferRow: (bufferRow) -> for currentRow in [bufferRow..0] [startRow, endRow] = @tokenizedBuffer.rowRangeForFoldAtBufferRow(currentRow) ? [] continue unless startRow? and startRow <= bufferRow <= endRow @@ -65,7 +65,7 @@ class DisplayBuffer return - unfoldScopeContainingBufferRow: (bufferRow) -> + unfoldBufferRow: (bufferRow) -> for currentRow in [bufferRow..0] [startRow, endRow] = @tokenizedBuffer.rowRangeForFoldAtBufferRow(currentRow) ? [] continue unless startRow? and startRow <= bufferRow <= endRow diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index b1c820185..164cf2525 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -200,17 +200,17 @@ class EditSession foldCurrentRow: -> bufferRow = @bufferPositionForScreenPosition(@getCursorScreenPosition()).row - @foldScopeContainingBufferRow(bufferRow) + @foldBufferRow(bufferRow) - foldScopeContainingBufferRow: (bufferRow) -> - @displayBuffer.foldScopeContainingBufferRow(bufferRow) + foldBufferRow: (bufferRow) -> + @displayBuffer.foldBufferRow(bufferRow) unfoldCurrentRow: -> bufferRow = @bufferPositionForScreenPosition(@getCursorScreenPosition()).row - @unfoldScopeContainingBufferRow(bufferRow) + @unfoldBufferRow(bufferRow) - unfoldScopeContainingBufferRow: (bufferRow) -> - @displayBuffer.unfoldScopeContainingBufferRow(bufferRow) + unfoldBufferRow: (bufferRow) -> + @displayBuffer.unfoldBufferRow(bufferRow) foldSelection: -> selection.fold() for selection in @getSelections() From a7db67e68d00c28cea24937217e9d8cf6de4dc83 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Mon, 30 Jul 2012 11:33:15 -0700 Subject: [PATCH 6/7] When DisplayBuffer.foldBufferRow is called with a buffer row that is within a fold, it folds the scope that incloses the buffer row's fold --- spec/app/display-buffer-spec.coffee | 9 +++++++++ src/app/display-buffer.coffee | 12 ++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/spec/app/display-buffer-spec.coffee b/spec/app/display-buffer-spec.coffee index 7475ba31e..0ecf550fe 100644 --- a/spec/app/display-buffer-spec.coffee +++ b/spec/app/display-buffer-spec.coffee @@ -194,6 +194,15 @@ describe "DisplayBuffer", -> expect(fold.startRow).toBe 1 expect(fold.endRow).toBe 9 + describe "when the bufferRow is already folded", -> + it "searches upward for the first row that begins a syntatic region containing the folded row (and folds it)", -> + displayBuffer.foldBufferRow(2) + expect(displayBuffer.lineForRow(1).fold).toBeDefined() + expect(displayBuffer.lineForRow(0).fold).not.toBeDefined() + + displayBuffer.foldBufferRow(1) + expect(displayBuffer.lineForRow(0).fold).toBeDefined() + describe ".unfoldBufferRow(bufferRow)", -> describe "when bufferRow can be unfolded", -> it "destroys a fold based on the syntactic region starting at the given row", -> diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index 7e8452e31..a4b5e4392 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -61,18 +61,14 @@ class DisplayBuffer [startRow, endRow] = @tokenizedBuffer.rowRangeForFoldAtBufferRow(currentRow) ? [] continue unless startRow? and startRow <= bufferRow <= endRow fold = @largestFoldStartingAtBufferRow(startRow) - @createFold(startRow, endRow) unless fold + continue if fold + + @createFold(startRow, endRow) return unfoldBufferRow: (bufferRow) -> - for currentRow in [bufferRow..0] - [startRow, endRow] = @tokenizedBuffer.rowRangeForFoldAtBufferRow(currentRow) ? [] - continue unless startRow? and startRow <= bufferRow <= endRow - fold = @largestFoldStartingAtBufferRow(startRow) - fold.destroy() if fold - - return + @largestFoldContainingBufferRow(bufferRow)?.destroy() createFold: (startRow, endRow) -> return fold if fold = @foldFor(startRow, endRow) From f7614c210acbb8e9ff7fc115557af527161ff9d6 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Mon, 30 Jul 2012 12:11:54 -0700 Subject: [PATCH 7/7] Add unfold-all and bind it to ctrl-} --- spec/app/display-buffer-spec.coffee | 8 ++++++++ src/app/display-buffer.coffee | 5 +++++ src/app/edit-session.coffee | 9 ++++++--- src/app/editor.coffee | 2 ++ src/app/keymaps/editor.coffee | 3 ++- 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/spec/app/display-buffer-spec.coffee b/spec/app/display-buffer-spec.coffee index 0ecf550fe..87de8cbaf 100644 --- a/spec/app/display-buffer-spec.coffee +++ b/spec/app/display-buffer-spec.coffee @@ -160,6 +160,14 @@ describe "DisplayBuffer", -> expect(displayBuffer.lineForRow(2).foldable).toBeTruthy() expect(displayBuffer.lineForRow(3).foldable).toBeFalsy() + describe ".unfoldAll()", -> + it "unfolds every folded line", -> + displayBuffer.foldBufferRow(0) + displayBuffer.foldBufferRow(1) + + displayBuffer.unfoldAll() + expect(Object.keys(displayBuffer.activeFolds).length).toBe 0 + describe ".foldAll()", -> it "folds every foldable line", -> displayBuffer.foldAll() diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index a4b5e4392..a0e0049f1 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -56,6 +56,10 @@ class DisplayBuffer @createFold(startRow, endRow) + unfoldAll: -> + for row in [@buffer.getLastRow()..0] + @activeFolds[row]?.forEach (fold) => @destroyFold(fold) + foldBufferRow: (bufferRow) -> for currentRow in [bufferRow..0] [startRow, endRow] = @tokenizedBuffer.rowRangeForFoldAtBufferRow(currentRow) ? [] @@ -123,6 +127,7 @@ class DisplayBuffer folds = @activeFolds[bufferRow] _.remove(folds, fold) delete @foldsById[fold.id] + delete @activeFolds[bufferRow] if folds.length == 0 largestFoldStartingAtBufferRow: (bufferRow) -> return unless folds = @activeFolds[bufferRow] diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 164cf2525..8ad03b8e8 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -198,6 +198,12 @@ class EditSession redo: -> @buffer.redo(this) + foldAll: -> + @displayBuffer.foldAll() + + unfoldAll: -> + @displayBuffer.unfoldAll() + foldCurrentRow: -> bufferRow = @bufferPositionForScreenPosition(@getCursorScreenPosition()).row @foldBufferRow(bufferRow) @@ -215,9 +221,6 @@ class EditSession foldSelection: -> selection.fold() for selection in @getSelections() - foldAll: -> - @displayBuffer.foldAll() - createFold: (startRow, endRow) -> @displayBuffer.createFold(startRow, endRow) diff --git a/src/app/editor.coffee b/src/app/editor.coffee index 3ac7bbd0a..ee0c8cea8 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -139,6 +139,7 @@ class Editor extends View 'newline-below': @insertNewlineBelow 'toggle-soft-wrap': @toggleSoftWrap 'fold-all': @foldAll + 'unfold-all': @unfoldAll 'fold-current-row': @foldCurrentRow 'unfold-current-row': @unfoldCurrentRow 'fold-selection': @foldSelection @@ -223,6 +224,7 @@ class Editor extends View foldCurrentRow: -> @activeEditSession.foldCurrentRow() unfoldCurrentRow: -> @activeEditSession.unfoldCurrentRow() foldAll: -> @activeEditSession.foldAll() + unfoldAll: -> @activeEditSession.unfoldAll() foldSelection: -> @activeEditSession.foldSelection() destroyFold: (foldId) -> @activeEditSession.destroyFold(foldId) destroyFoldsContainingBufferRow: (bufferRow) -> @activeEditSession.destroyFoldsContainingBufferRow(bufferRow) diff --git a/src/app/keymaps/editor.coffee b/src/app/keymaps/editor.coffee index d0c5e9e85..5b2a819ff 100644 --- a/src/app/keymaps/editor.coffee +++ b/src/app/keymaps/editor.coffee @@ -19,7 +19,8 @@ window.keymap.bindKeys '.editor', 'alt-meta-w': 'toggle-soft-wrap' 'ctrl-[': 'fold-current-row' 'ctrl-]': 'unfold-current-row' - 'ctrl-(': 'fold-all' + 'ctrl-{': 'fold-all' + 'ctrl-}': 'unfold-all' 'alt-meta-ctrl-f': 'fold-selection' 'alt-meta-left': 'split-left' 'alt-meta-right': 'split-right'