diff --git a/lib/ex.coffee b/lib/ex.coffee index 2923602..a1e5ad3 100644 --- a/lib/ex.coffee +++ b/lib/ex.coffee @@ -442,4 +442,24 @@ class Ex throw new CommandError("No such option: #{option}") optionProcessor() + sort: ({ range }) => + editor = atom.workspace.getActiveTextEditor() + sortingRange = [[]] + + # If no range is provided, the entire file should be sorted. + isMultiLine = range[1] - range[0] > 1 + if isMultiLine + sortingRange = [[range[0], 0], [range[1] + 1, 0]] + else + sortingRange = [[0, 0], [editor.getLastBufferRow(), 0]] + + # Store every bufferedRow string in an array. + textLines = [] + for lineIndex in [sortingRange[0][0]..sortingRange[1][0] - 1] + textLines.push(editor.lineTextForBufferRow(lineIndex)) + + # Sort the array and join them together with newlines for writing back to the file. + sortedText = _.sortBy(textLines).join('\n') + '\n' + editor.buffer.setTextInRange(sortingRange, sortedText) + module.exports = Ex diff --git a/spec/ex-commands-spec.coffee b/spec/ex-commands-spec.coffee index 4e3d839..2eb252a 100644 --- a/spec/ex-commands-spec.coffee +++ b/spec/ex-commands-spec.coffee @@ -983,3 +983,18 @@ describe "the commands", -> expect(calls.length).toEqual 2 expect(calls[0].args[0].range).toEqual [0, 2] expect(calls[1].args[0].range).toEqual [3, 3] + + describe ':sort', -> + beforeEach -> + editor.setText('ghi\nabc\njkl\ndef\n142\nzzz\n91xfds9\n') + editor.setCursorBufferPosition([0, 0]) + + it "sorts entire file if range is not multi-line", -> + openEx() + submitNormalModeInputText('sort') + expect(editor.getText()).toEqual('142\n91xfds9\nabc\ndef\nghi\njkl\nzzz\n') + + it "sorts specific range if range is multi-line", -> + openEx() + submitNormalModeInputText('2,4sort') + expect(editor.getText()).toEqual('ghi\nabc\ndef\njkl\n142\nzzz\n91xfds9\n')