diff --git a/spec/editor-spec.coffee b/spec/editor-spec.coffee index 8f46ae549..f037ac6af 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-component.coffee b/src/editor-component.coffee index e1b4028a1..14cca3dea 100644 --- a/src/editor-component.coffee +++ b/src/editor-component.coffee @@ -190,6 +190,8 @@ EditorComponent = React.createClass 'editor:delete-to-end-of-word': => editor.deleteToEndOfWord() 'editor:delete-line': => editor.deleteLine() 'editor:cut-to-end-of-line': => editor.cutToEndOfLine() + 'editor:move-to-beginning-of-next-paragraph': => editor.moveCursorToBeginningOfNextParagraph() + 'editor:move-to-beginning-of-previous-paragraph': => editor.moveCursorToBeginningOfPreviousParagraph() 'editor:move-to-beginning-of-screen-line': => editor.moveCursorToBeginningOfScreenLine() 'editor:move-to-beginning-of-line': => editor.moveCursorToBeginningOfLine() 'editor:move-to-end-of-screen-line': => editor.moveCursorToEndOfScreenLine() diff --git a/src/editor-view.coffee b/src/editor-view.coffee index 2b69becd1..c4c8b8e42 100644 --- a/src/editor-view.coffee +++ b/src/editor-view.coffee @@ -159,6 +159,8 @@ class EditorView extends View 'editor:delete-to-end-of-word': => @editor.deleteToEndOfWord() 'editor:delete-line': => @editor.deleteLine() 'editor:cut-to-end-of-line': => @editor.cutToEndOfLine() + 'editor:move-to-beginning-of-next-paragraph': => @editor.moveCursorToBeginningOfNextParagraph() + 'editor:move-to-beginning-of-previous-paragraph': => @editor.moveCursorToBeginningOfPreviousParagraph() 'editor:move-to-beginning-of-screen-line': => @editor.moveCursorToBeginningOfScreenLine() 'editor:move-to-beginning-of-line': => @editor.moveCursorToBeginningOfLine() 'editor:move-to-end-of-screen-line': => @editor.moveCursorToEndOfScreenLine() diff --git a/src/editor.coffee b/src/editor.coffee index 7c2c83b24..161a4455c 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()