mirror of
https://github.com/atom/atom.git
synced 2026-01-23 22:08:08 -05:00
Merge remote-tracking branch 'origin/command-extensions' into dev
Conflicts: spec/app/editor-spec.coffee spec/app/root-view-spec.coffee src/app/editor.coffee src/extensions/strip-trailing-whitespace.coffee
This commit is contained in:
@@ -2136,3 +2136,55 @@ describe "Editor", ->
|
||||
expect(editor.reloadGrammar()).toBeFalsy()
|
||||
expect(editor.updateDisplay).not.toHaveBeenCalled()
|
||||
expect(editor.getGrammar().name).toBe 'JavaScript'
|
||||
|
||||
describe ".replaceSelectedText()", ->
|
||||
it "doesn't call the replace function when the selection is empty", ->
|
||||
replaced = false
|
||||
edited = false
|
||||
replacer = (text) ->
|
||||
replaced = true
|
||||
'new'
|
||||
|
||||
editor.moveCursorToTop()
|
||||
edited = editor.replaceSelectedText(replacer)
|
||||
expect(replaced).toBe false
|
||||
expect(edited).toBe false
|
||||
|
||||
it "returns true when transformed text is non-empty", ->
|
||||
replaced = false
|
||||
edited = false
|
||||
replacer = (text) ->
|
||||
replaced = true
|
||||
'new'
|
||||
|
||||
editor.moveCursorToTop()
|
||||
editor.selectToEndOfLine()
|
||||
edited = editor.replaceSelectedText(replacer)
|
||||
expect(replaced).toBe true
|
||||
expect(edited).toBe true
|
||||
|
||||
it "returns false when transformed text is null", ->
|
||||
replaced = false
|
||||
edited = false
|
||||
replacer = (text) ->
|
||||
replaced = true
|
||||
null
|
||||
|
||||
editor.moveCursorToTop()
|
||||
editor.selectToEndOfLine()
|
||||
edited = editor.replaceSelectedText(replacer)
|
||||
expect(replaced).toBe true
|
||||
expect(edited).toBe false
|
||||
|
||||
it "returns false when transformed text is undefined", ->
|
||||
replaced = false
|
||||
edited = false
|
||||
replacer = (text) ->
|
||||
replaced = true
|
||||
undefined
|
||||
|
||||
editor.moveCursorToTop()
|
||||
editor.selectToEndOfLine()
|
||||
edited = editor.replaceSelectedText(replacer)
|
||||
expect(replaced).toBe true
|
||||
expect(edited).toBe false
|
||||
|
||||
@@ -710,3 +710,59 @@ describe "RootView", ->
|
||||
|
||||
lowerRightEditor = rightEditor.splitDown()
|
||||
expect(lowerRightEditor.find(".line:first").text()).toBe " "
|
||||
|
||||
describe ".eachEditor(callback)", ->
|
||||
beforeEach ->
|
||||
rootView.attachToDom()
|
||||
|
||||
it "invokes the callback for existing editor", ->
|
||||
count = 0
|
||||
callbackEditor = null
|
||||
callback = (editor) ->
|
||||
callbackEditor = editor
|
||||
count++
|
||||
rootView.eachEditor(callback)
|
||||
expect(count).toBe 1
|
||||
expect(callbackEditor).toBe rootView.getActiveEditor()
|
||||
|
||||
it "invokes the callback for new editor", ->
|
||||
count = 0
|
||||
callbackEditor = null
|
||||
callback = (editor) ->
|
||||
callbackEditor = editor
|
||||
count++
|
||||
|
||||
rootView.eachEditor(callback)
|
||||
count = 0
|
||||
callbackEditor = null
|
||||
rootView.getActiveEditor().splitRight()
|
||||
expect(count).toBe 1
|
||||
expect(callbackEditor).toBe rootView.getActiveEditor()
|
||||
|
||||
describe ".eachBuffer(callback)", ->
|
||||
beforeEach ->
|
||||
rootView.attachToDom()
|
||||
|
||||
it "invokes the callback for existing buffer", ->
|
||||
count = 0
|
||||
callbackBuffer = null
|
||||
callback = (buffer) ->
|
||||
callbackBuffer = buffer
|
||||
count++
|
||||
rootView.eachBuffer(callback)
|
||||
expect(count).toBe 1
|
||||
expect(callbackBuffer).toBe rootView.getActiveEditor().getBuffer()
|
||||
|
||||
it "invokes the callback for new buffer", ->
|
||||
count = 0
|
||||
callbackBuffer = null
|
||||
callback = (buffer) ->
|
||||
callbackBuffer = buffer
|
||||
count++
|
||||
|
||||
rootView.eachBuffer(callback)
|
||||
count = 0
|
||||
callbackBuffer = null
|
||||
rootView.open(require.resolve('fixtures/sample.txt'))
|
||||
expect(count).toBe 1
|
||||
expect(callbackBuffer).toBe rootView.getActiveEditor().getBuffer()
|
||||
|
||||
@@ -1127,3 +1127,20 @@ class Editor extends View
|
||||
@clearRenderedLines()
|
||||
@updateDisplay()
|
||||
grammarChanged
|
||||
|
||||
bindToKeyedEvent: (key, event, callback) ->
|
||||
binding = {}
|
||||
binding[key] = event
|
||||
window.keymap.bindKeys '.editor', binding
|
||||
@on event, =>
|
||||
callback(this, event)
|
||||
|
||||
replaceSelectedText: (replaceFn) ->
|
||||
selection = @getSelection()
|
||||
return false if selection.isEmpty()
|
||||
|
||||
text = replaceFn(@getTextInRange(selection.getBufferRange()))
|
||||
return false if text is null or text is undefined
|
||||
|
||||
@insertText(text, select: true)
|
||||
true
|
||||
|
||||
@@ -258,3 +258,17 @@ class RootView extends View
|
||||
|
||||
saveAll: ->
|
||||
editor.save() for editor in @getEditors()
|
||||
|
||||
eachEditor: (callback) ->
|
||||
for editor in @getEditors()
|
||||
callback(editor)
|
||||
|
||||
@on 'editor:attached', (e, editor) ->
|
||||
callback(editor)
|
||||
|
||||
eachBuffer: (callback) ->
|
||||
for buffer in @project.getBuffers()
|
||||
callback(buffer)
|
||||
|
||||
@project.on 'buffer-created', (buffer) ->
|
||||
callback(buffer)
|
||||
|
||||
@@ -174,7 +174,10 @@ class Selection
|
||||
text = @normalizeIndent(text, options) if options.normalizeIndent
|
||||
@clear()
|
||||
newBufferRange = @editSession.buffer.change(oldBufferRange, text)
|
||||
@cursor.setBufferPosition(newBufferRange.end, skipAtomicTokens: true) if wasReversed
|
||||
if options.select
|
||||
@setBufferRange(newBufferRange, reverse: wasReversed)
|
||||
else
|
||||
@cursor.setBufferPosition(newBufferRange.end, skipAtomicTokens: true) if wasReversed
|
||||
|
||||
if @editSession.autoIndent and options.autoIndent
|
||||
if text == '\n'
|
||||
|
||||
8
src/extensions/strip-trailing-whitespace.coffee
Normal file
8
src/extensions/strip-trailing-whitespace.coffee
Normal file
@@ -0,0 +1,8 @@
|
||||
module.exports =
|
||||
name: "strip trailing whitespace"
|
||||
|
||||
activate: (rootView) ->
|
||||
rootView.eachBuffer (buffer) ->
|
||||
buffer.on 'before-save', ->
|
||||
buffer.scan /[ \t]+$/g, (match, range, { replace }) ->
|
||||
replace('')
|
||||
1
src/packages/lowercase-command/index.coffee
Normal file
1
src/packages/lowercase-command/index.coffee
Normal file
@@ -0,0 +1 @@
|
||||
module.exports = require "./src/lowercase-command"
|
||||
@@ -0,0 +1,23 @@
|
||||
LowerCaseCommand = require 'lowercase-command'
|
||||
RootView = require 'root-view'
|
||||
fs = require 'fs'
|
||||
|
||||
describe "LowerCaseCommand", ->
|
||||
[rootView, editor, path] = []
|
||||
|
||||
beforeEach ->
|
||||
rootView = new RootView
|
||||
rootView.open(require.resolve 'fixtures/sample.js')
|
||||
|
||||
rootView.focus()
|
||||
editor = rootView.getActiveEditor()
|
||||
|
||||
afterEach ->
|
||||
rootView.remove()
|
||||
|
||||
it "replaces the selected text with all lower case characters", ->
|
||||
LowerCaseCommand.activate(rootView)
|
||||
editor.setSelectedBufferRange([[11,14], [11,19]])
|
||||
expect(editor.getTextInRange(editor.getSelection().getBufferRange())).toBe 'Array'
|
||||
editor.trigger 'lowercase'
|
||||
expect(editor.getTextInRange(editor.getSelection().getBufferRange())).toBe 'array'
|
||||
@@ -0,0 +1,8 @@
|
||||
module.exports =
|
||||
class LowerCaseCommand
|
||||
|
||||
@activate: (rootView) ->
|
||||
rootView.eachEditor (editor) ->
|
||||
editor.bindToKeyedEvent 'meta-Y', 'lowercase', ->
|
||||
editor.replaceSelectedText (text) ->
|
||||
text.toLowerCase()
|
||||
@@ -2,11 +2,7 @@ module.exports =
|
||||
name: "strip trailing whitespace"
|
||||
|
||||
activate: (rootView) ->
|
||||
for buffer in rootView.project.getBuffers()
|
||||
@stripTrailingWhitespaceBeforeSave(buffer)
|
||||
|
||||
rootView.project.on 'buffer-created', (buffer) =>
|
||||
@stripTrailingWhitespaceBeforeSave(buffer)
|
||||
rootView.eachBuffer (buffer) => @stripTrailingWhitespaceBeforeSave(buffer)
|
||||
|
||||
stripTrailingWhitespaceBeforeSave: (buffer) ->
|
||||
buffer.on 'will-be-saved', ->
|
||||
|
||||
1
src/packages/uppercase-command/index.coffee
Normal file
1
src/packages/uppercase-command/index.coffee
Normal file
@@ -0,0 +1 @@
|
||||
module.exports = require "./src/uppercase-command"
|
||||
@@ -0,0 +1,23 @@
|
||||
UpperCaseCommand = require 'uppercase-command'
|
||||
RootView = require 'root-view'
|
||||
fs = require 'fs'
|
||||
|
||||
describe "UpperCaseCommand", ->
|
||||
[rootView, editor, path] = []
|
||||
|
||||
beforeEach ->
|
||||
rootView = new RootView
|
||||
rootView.open(require.resolve 'fixtures/sample.js')
|
||||
|
||||
rootView.focus()
|
||||
editor = rootView.getActiveEditor()
|
||||
|
||||
afterEach ->
|
||||
rootView.remove()
|
||||
|
||||
it "replaces the selected text with all upper case characters", ->
|
||||
UpperCaseCommand.activate(rootView)
|
||||
editor.setSelectedBufferRange([[0,0], [0,3]])
|
||||
expect(editor.getTextInRange(editor.getSelection().getBufferRange())).toBe 'var'
|
||||
editor.trigger 'uppercase'
|
||||
expect(editor.getTextInRange(editor.getSelection().getBufferRange())).toBe 'VAR'
|
||||
@@ -0,0 +1,8 @@
|
||||
module.exports =
|
||||
class UpperCaseCommand
|
||||
|
||||
@activate: (rootView) ->
|
||||
rootView.eachEditor (editor) ->
|
||||
editor.bindToKeyedEvent 'meta-X', 'uppercase', ->
|
||||
editor.replaceSelectedText (text) ->
|
||||
text.toUpperCase()
|
||||
Reference in New Issue
Block a user