From 117d7439ad5ae59f0192cc0999334998ae0f7728 Mon Sep 17 00:00:00 2001 From: Robby Date: Sun, 6 Aug 2017 21:23:41 -0500 Subject: [PATCH 1/5] Adds save ex-mode command --- lib/ex.coffee | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/ex.coffee b/lib/ex.coffee index e026b96..6913b52 100644 --- a/lib/ex.coffee +++ b/lib/ex.coffee @@ -133,6 +133,7 @@ class Ex qall: => @quitall() + tabedit: (args) => if args.args.trim() isnt '' @edit(args) @@ -437,4 +438,11 @@ class Ex throw new CommandError("No such option: #{option}") optionProcessor() + sort: ({ range }) => + range = [[range[0], 0], [range[1] + 1, 0]] + editor = atom.workspace.getActiveTextEditor() + text = editor.getTextInBufferRange(range) + sortedText = _.sortBy(text.split(/\n/)).join('\n') + editor.buffer.setTextInRange(range, sortedText) + module.exports = Ex From 15296ff369b87400975ff308487ae05809a31ed8 Mon Sep 17 00:00:00 2001 From: Robby Date: Sun, 6 Aug 2017 21:24:22 -0500 Subject: [PATCH 2/5] Removes accidental newline --- lib/ex.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ex.coffee b/lib/ex.coffee index 6913b52..16f74f9 100644 --- a/lib/ex.coffee +++ b/lib/ex.coffee @@ -133,7 +133,6 @@ class Ex qall: => @quitall() - tabedit: (args) => if args.args.trim() isnt '' @edit(args) From 43127775084196b1bdbd3038e272a4abaffeefab Mon Sep 17 00:00:00 2001 From: Robby Date: Sun, 6 Aug 2017 23:22:13 -0500 Subject: [PATCH 3/5] Modifies sort function and adds a unit test --- lib/ex.coffee | 17 +++++++++++++---- spec/ex-commands-spec.coffee | 10 ++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/ex.coffee b/lib/ex.coffee index 16f74f9..46ab42b 100644 --- a/lib/ex.coffee +++ b/lib/ex.coffee @@ -438,10 +438,19 @@ class Ex optionProcessor() sort: ({ range }) => - range = [[range[0], 0], [range[1] + 1, 0]] editor = atom.workspace.getActiveTextEditor() - text = editor.getTextInBufferRange(range) - sortedText = _.sortBy(text.split(/\n/)).join('\n') - editor.buffer.setTextInRange(range, sortedText) + sortingRange = [[]] + isMultiLine = range[1] - range[0] > 1 + if isMultiLine + sortingRange = [[range[0], 0], [range[1] + 1, 0]] + else + sortingRange = [[0, 0], [editor.getLastBufferRow(), 0]] + + textLines = [] + for lineIndex in [sortingRange[0][0]..sortingRange[1][0] - 1] + textLines.push(editor.lineTextForBufferRow(lineIndex)) + + 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..2d9facc 100644 --- a/spec/ex-commands-spec.coffee +++ b/spec/ex-commands-spec.coffee @@ -983,3 +983,13 @@ 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] + + desctibe ':sort', -> + beforeEach -> + editor.setText('ghi\nabc\njkl\ndef\n') + editor.setCursorBufferPosition([0, 0]) + + it "sorts entire file if range is not multi-line", -> + openEx() + submitNormalModeInputText('sort') + expect(atom.getText()).toEqual('abc\ndef\nghi\njkl\n') From d76940dabc05ef7967ecdce5d69cd4b351285c0e Mon Sep 17 00:00:00 2001 From: Robby Date: Sun, 6 Aug 2017 23:40:06 -0500 Subject: [PATCH 4/5] Adds another unit test --- spec/ex-commands-spec.coffee | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/spec/ex-commands-spec.coffee b/spec/ex-commands-spec.coffee index 2d9facc..2eb252a 100644 --- a/spec/ex-commands-spec.coffee +++ b/spec/ex-commands-spec.coffee @@ -984,12 +984,17 @@ describe "the commands", -> expect(calls[0].args[0].range).toEqual [0, 2] expect(calls[1].args[0].range).toEqual [3, 3] - desctibe ':sort', -> + describe ':sort', -> beforeEach -> - editor.setText('ghi\nabc\njkl\ndef\n') + 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(atom.getText()).toEqual('abc\ndef\nghi\njkl\n') + 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') From 791c62a3bad988d977a177cac7f76a1adedb0ba5 Mon Sep 17 00:00:00 2001 From: Robert Paul Date: Tue, 8 Aug 2017 14:02:29 -0500 Subject: [PATCH 5/5] Adds clarification comments --- lib/ex.coffee | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/ex.coffee b/lib/ex.coffee index 46ab42b..c84fbbf 100644 --- a/lib/ex.coffee +++ b/lib/ex.coffee @@ -440,16 +440,20 @@ class Ex 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)