diff --git a/spec/editor-spec.coffee b/spec/editor-spec.coffee index 6b37d6f86..277effef6 100644 --- a/spec/editor-spec.coffee +++ b/spec/editor-spec.coffee @@ -622,6 +622,38 @@ describe "Editor", -> editor.moveCursorToBeginningOfNextWord() expect(editor.getCursorBufferPosition()).toEqual [11, 9] + describe ".moveCursorToBeginningOfNextParagraph()", -> + it "moves the cursor before the first line of the next paragraph", -> + editor.setCursorBufferPosition [0,6] + cursor = editor.getCursor() + + editor.moveCursorToBeginningOfNextParagraph() + + expect(cursor.getBufferPosition()).toEqual { row : 10, column : 0 } + + editor.setText("") + editor.setCursorBufferPosition [0,0] + cursor = editor.getCursor() + editor.moveCursorToBeginningOfNextParagraph() + + expect(cursor.getBufferPosition()).toEqual [0, 0] + + describe ".moveCursorToBeginningOfPreviousParagraph()", -> + it "moves the cursor before the first line of the pevious paragraph", -> + editor.setCursorBufferPosition [10,0] + cursor = editor.getCursor() + + editor.moveCursorToBeginningOfPreviousParagraph() + + expect(cursor.getBufferPosition()).toEqual { row : 0, column : 0 } + + editor.setText("") + editor.setCursorBufferPosition [0,0] + cursor = editor.getCursor() + editor.moveCursorToBeginningOfPreviousParagraph() + + expect(cursor.getBufferPosition()).toEqual [0, 0] + describe ".getCurrentParagraphBufferRange()", -> it "returns the buffer range of the current paragraph, delimited by blank lines or the beginning / end of the file", -> buffer.setText """ diff --git a/src/cursor.coffee b/src/cursor.coffee index 4a8895769..df9e5e06b 100644 --- a/src/cursor.coffee +++ b/src/cursor.coffee @@ -457,6 +457,43 @@ class Cursor extends Model getCurrentLineBufferRange: (options) -> @editor.bufferRangeForBufferRow(@getBufferRow(), options) + # Public: Moves the cursor to the beginning of the next paragraph + moveToBeginningOfNextParagraph: -> + if position = @getBeginningOfNextParagraphBufferPosition() + @setBufferPosition(position) + + # Public: Moves the cursor to the beginning of the previous paragraph + moveToBeginningOfPreviousParagraph: -> + if position = @getBeginningOfPreviousParagraphBufferPosition() + @setBufferPosition(position) + + getBeginningOfNextParagraphBufferPosition: (editor) -> + start = @getBufferPosition() + eof = @editor.getEofBufferPosition() + scanRange = [start, eof] + + {row, column} = eof + position = new Point(row, column - 1) + + @editor.scanInBufferRange /^\n*$/g, scanRange, ({range, stop}) => + if !range.start.isEqual(start) + position = range.start + stop() + @editor.screenPositionForBufferPosition(position) + + getBeginningOfPreviousParagraphBufferPosition: (editor) -> + start = @editor.getCursorBufferPosition() + + {row, column} = start + scanRange = [[row-1, column], [0,0]] + position = new Point(0, 0) + zero = new Point(0,0) + @editor.backwardsScanInBufferRange /^\n*$/g, scanRange, ({range, stop}) => + if !range.start.isEqual(zero) + position = range.start + stop() + @editor.screenPositionForBufferPosition(position) + # Public: Retrieves the range for the current paragraph. # # A paragraph is defined as a block of text surrounded by empty lines. diff --git a/src/editor.coffee b/src/editor.coffee index bd714ecb1..25411c765 100644 --- a/src/editor.coffee +++ b/src/editor.coffee @@ -1488,6 +1488,14 @@ class Editor extends Model moveCursorToNextWordBoundary: -> @moveCursors (cursor) -> cursor.moveToNextWordBoundary() + # Public: Move every cursor to the beginning of the next paragraph. + moveCursorToBeginningOfNextParagraph: -> + @moveCursors (cursor) -> cursor.moveToBeginningOfNextParagraph() + + # Public: Move every cursor to the beginning of the previous paragraph. + moveCursorToBeginningOfPreviousParagraph: -> + @moveCursors (cursor) -> cursor.moveToBeginningOfPreviousParagraph() + scrollToCursorPosition: -> @getCursor().autoscroll()