diff --git a/spec/app/edit-session-spec.coffee b/spec/app/edit-session-spec.coffee index 047b052b6..cf6ab48a5 100644 --- a/spec/app/edit-session-spec.coffee +++ b/spec/app/edit-session-spec.coffee @@ -1871,6 +1871,23 @@ describe "EditSession", -> expect(editSession.lineForBufferRow(0)).toBe 'ABc' expect(editSession.getSelectedBufferRange()).toEqual [[0, 0], [0, 2]] + describe ".lowerCase()", -> + describe "when there is no selection", -> + it "lower cases the current word", -> + editSession.buffer.setText("aBC") + editSession.setCursorScreenPosition([0, 1]) + editSession.lowerCase() + expect(editSession.lineForBufferRow(0)).toBe 'abc' + expect(editSession.getSelectedBufferRange()).toEqual [[0, 1], [0, 1]] + + describe "when there is a selection", -> + it "lower cases the current selection", -> + editSession.buffer.setText("ABC") + editSession.setSelectedBufferRange([[0,0], [0,2]]) + editSession.lowerCase() + expect(editSession.lineForBufferRow(0)).toBe 'abC' + expect(editSession.getSelectedBufferRange()).toEqual [[0, 0], [0, 2]] + describe "soft-tabs detection", -> it "assign soft / hard tabs based on the contents of the buffer, or uses the default if unknown", -> editSession = fixturesProject.buildEditSessionForPath('sample.js', softTabs: false) diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 55bd0fdcd..6b3d8e22b 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -314,6 +314,17 @@ class EditSession mutateSelectedText: (fn) -> @transact => fn(selection) for selection in @getSelections() + replaceSelectedText: (options={}, fn) -> + {selectWordIfEmpty} = options + @mutateSelectedText (selection) => + range = selection.getBufferRange() + if selectWordIfEmpty and selection.isEmpty() + selection.selectWord() + text = selection.getText() + selection.delete() + selection.insertText(fn(text)) + selection.setBufferRange(range) + pushOperation: (operation) -> @buffer.pushOperation(operation, this) @@ -553,14 +564,10 @@ class EditSession selection.insertText selection.getText().split('').reverse().join('') upperCase: -> - @mutateSelectedText (selection) => - range = selection.getBufferRange() - if selection.isEmpty() - selection.selectWord() - text = selection.getText() - selection.delete() - selection.insertText text.toUpperCase() - selection.setBufferRange(range) if range + @replaceSelectedText selectWordIfEmpty:true, (text) => text.toUpperCase() + + lowerCase: -> + @replaceSelectedText selectWordIfEmpty:true, (text) => text.toLowerCase() expandLastSelectionOverLine: -> @getLastSelection().expandOverLine() diff --git a/src/app/editor.coffee b/src/app/editor.coffee index e25a7cc8b..6bf7db30c 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -134,6 +134,7 @@ class Editor extends View 'editor:select-to-beginning-of-word': @selectToBeginningOfWord 'editor:transpose': @transpose 'editor:upper-case': @upperCase + 'editor:lower-case': @lowerCase unless @mini _.extend editorBindings, @@ -228,6 +229,7 @@ class Editor extends View selectToScreenPosition: (position) -> @activeEditSession.selectToScreenPosition(position) transpose: -> @activeEditSession.transpose() upperCase: -> @activeEditSession.upperCase() + lowerCase: -> @activeEditSession.lowerCase() clearSelections: -> @activeEditSession.clearSelections() backspace: -> @activeEditSession.backspace() diff --git a/src/app/keymaps/editor.cson b/src/app/keymaps/editor.cson index b2106ca59..cb3675501 100644 --- a/src/app/keymaps/editor.cson +++ b/src/app/keymaps/editor.cson @@ -32,3 +32,4 @@ 'ctrl-W': 'editor:select-word' 'meta-alt-p': 'editor:log-cursor-scope' 'meta-u': 'editor:upper-case' + 'meta-U': 'editor:lower-case'