mirror of
https://github.com/atom/atom.git
synced 2026-02-09 06:05:11 -05:00
Merge branch 'editor' into highlight
Conflicts: src/atom/editor.coffee
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
_ = require 'underscore'
|
||||
fs = require 'fs'
|
||||
Range = require 'range'
|
||||
|
||||
module.exports =
|
||||
class Buffer
|
||||
@@ -32,45 +34,37 @@ class Buffer
|
||||
getLines: ->
|
||||
@lines
|
||||
|
||||
getLine: (n) ->
|
||||
@lines[n]
|
||||
getLine: (row) ->
|
||||
@lines[row]
|
||||
|
||||
change: (preRange, string) ->
|
||||
@remove(preRange)
|
||||
postRange = @insert(preRange.start, string)
|
||||
@trigger 'change', { preRange, postRange, string }
|
||||
change: (preRange, newText) ->
|
||||
postRange = new Range(_.clone(preRange.start), _.clone(preRange.start))
|
||||
prefix = @lines[preRange.start.row][0...preRange.start.column]
|
||||
suffix = @lines[preRange.end.row][preRange.end.column..]
|
||||
newTextLines = newText.split('\n')
|
||||
|
||||
remove: (range) ->
|
||||
prefix = @lines[range.start.row][0...range.start.column]
|
||||
suffix = @lines[range.end.row][range.end.column..]
|
||||
@lines[range.start.row..range.end.row] = prefix + suffix
|
||||
|
||||
insert: ({row, column}, string) ->
|
||||
postRange =
|
||||
start: { row, column }
|
||||
end: { row, column }
|
||||
|
||||
prefix = @lines[row][0...column]
|
||||
suffix = @lines[row][column..]
|
||||
|
||||
lines = string.split('\n')
|
||||
|
||||
if lines.length == 1
|
||||
@lines[row] = prefix + string + suffix
|
||||
postRange.end.column += string.length
|
||||
if newTextLines.length == 1
|
||||
postRange.end.column += newText.length
|
||||
linesToInsert = [prefix + newText + suffix]
|
||||
else
|
||||
for line, i in lines
|
||||
curRow = row + i
|
||||
if i == 0 # replace first line
|
||||
@lines[curRow] = prefix + line
|
||||
else if i < lines.length - 1 # insert middle lines
|
||||
@lines[curRow...curRow] = line
|
||||
else # insert last line
|
||||
@lines[curRow...curRow] = line + suffix
|
||||
postRange.end.row = curRow
|
||||
postRange.end.column = line.length
|
||||
firstLineIndex = 0
|
||||
lastLineIndex = newTextLines.length - 1
|
||||
|
||||
postRange
|
||||
linesToInsert =
|
||||
for line, i in newTextLines
|
||||
switch i
|
||||
when firstLineIndex
|
||||
prefix + line
|
||||
when lastLineIndex
|
||||
postRange.end.row += i
|
||||
postRange.end.column = line.length
|
||||
line + suffix
|
||||
else
|
||||
line
|
||||
|
||||
@lines[preRange.start.row..preRange.end.row] = linesToInsert
|
||||
|
||||
@trigger 'change', { preRange, postRange, string: newText }
|
||||
|
||||
numLines: ->
|
||||
@getLines().length
|
||||
|
||||
@@ -4,6 +4,7 @@ Point = require 'point'
|
||||
Cursor = require 'cursor'
|
||||
Selection = require 'selection'
|
||||
Highlighter = require 'highlighter'
|
||||
Range = require 'range'
|
||||
|
||||
$ = require 'jquery'
|
||||
$$ = require 'template/builder'
|
||||
@@ -43,8 +44,8 @@ class Editor extends Template
|
||||
'shift-up': 'select-up'
|
||||
'shift-down': 'select-down'
|
||||
enter: 'newline'
|
||||
backspace: 'backspace'
|
||||
delete: 'delete'
|
||||
backspace: 'delete-left'
|
||||
delete: 'delete-right'
|
||||
'meta-c': 'copy'
|
||||
|
||||
@on 'move-right', => @moveCursorRight()
|
||||
@@ -56,8 +57,8 @@ class Editor extends Template
|
||||
@on 'select-up', => @selectUp()
|
||||
@on 'select-down', => @selectDown()
|
||||
@on 'newline', => @insertNewline()
|
||||
@on 'backspace', => @backspace()
|
||||
@on 'delete', => @delete()
|
||||
@on 'delete-left', => @deleteLeft()
|
||||
@on 'delete-right', => @deleteRight()
|
||||
@on 'copy', => @copySelection()
|
||||
|
||||
|
||||
@@ -183,8 +184,10 @@ class Editor extends Template
|
||||
else
|
||||
@scrollLeft() + @width()
|
||||
|
||||
getCursor: -> @cursor
|
||||
getSelection: -> @selection
|
||||
|
||||
getCurrentLine: -> @buffer.getLine(@getCursorRow())
|
||||
getCursor: -> @selection.cursor
|
||||
moveCursorUp: -> @cursor.moveUp()
|
||||
moveCursorDown: -> @cursor.moveDown()
|
||||
moveCursorRight: -> @cursor.moveRight()
|
||||
@@ -200,11 +203,18 @@ class Editor extends Template
|
||||
selectLeft: -> @selection.selectLeft()
|
||||
selectUp: -> @selection.selectUp()
|
||||
selectDown: -> @selection.selectDown()
|
||||
selectToPosition: (position) -> @selection.selectToPosition(position)
|
||||
selectToPosition: (position) ->
|
||||
@selection.selectToPosition(position)
|
||||
|
||||
insertText: (text) -> @selection.insertText(text)
|
||||
insertNewline: -> @selection.insertNewline()
|
||||
backspace: -> @selection.backspace()
|
||||
delete: -> @selection.delete()
|
||||
copySelection: -> @selection.copy()
|
||||
|
||||
deleteLeft: ->
|
||||
@selectLeft() if @selection.isEmpty()
|
||||
@selection.delete()
|
||||
|
||||
deleteRight: ->
|
||||
@selectRight() if @selection.isEmpty()
|
||||
@selection.delete()
|
||||
|
||||
|
||||
@@ -14,7 +14,10 @@ class Point
|
||||
constructor: (@row, @column) ->
|
||||
|
||||
isEqual: (other) ->
|
||||
@row == other.row && @column == other.column
|
||||
if other instanceof Array
|
||||
@row == other[0] and @column == other[1]
|
||||
else
|
||||
@row == other.row and @column == other.column
|
||||
|
||||
compare: (other) ->
|
||||
if @row > other.row
|
||||
|
||||
@@ -81,31 +81,9 @@ class Selection extends Template
|
||||
insertNewline: ->
|
||||
@insertText('\n')
|
||||
|
||||
backspace: ->
|
||||
range = @getRange()
|
||||
|
||||
if range.isEmpty()
|
||||
if range.start.column == 0
|
||||
return if range.start.row == 0
|
||||
range.start.column = @editor.buffer.getLine(range.start.row - 1).length
|
||||
range.start.row--
|
||||
else
|
||||
range.start.column--
|
||||
|
||||
@editor.buffer.change(range, '')
|
||||
|
||||
delete: ->
|
||||
range = @getRange()
|
||||
|
||||
if range.isEmpty()
|
||||
if range.end.column == @editor.buffer.getLine(range.end.row).length
|
||||
return if range.end.row == @editor.buffer.numLines() - 1
|
||||
range.end.column = 0
|
||||
range.end.row++
|
||||
else
|
||||
range.end.column++
|
||||
|
||||
@editor.buffer.change(range, '')
|
||||
@editor.buffer.change(range, '') unless range.isEmpty()
|
||||
|
||||
isEmpty: ->
|
||||
@getRange().isEmpty()
|
||||
|
||||
@@ -28,7 +28,7 @@ class VimMode
|
||||
@bindCommandModeKeys
|
||||
'i': 'insert'
|
||||
'd': 'delete'
|
||||
'x': 'delete-char'
|
||||
'x': 'delete-right'
|
||||
'h': 'move-left'
|
||||
'j': 'move-down'
|
||||
'k': 'move-up'
|
||||
@@ -38,7 +38,7 @@ class VimMode
|
||||
@handleCommands
|
||||
'insert': => @activateInsertMode()
|
||||
'delete': => @delete()
|
||||
'delete-char': => new commands.DeleteChar(@editor)
|
||||
'delete-right': => new commands.DeleteRight(@editor)
|
||||
'move-left': => new motions.MoveLeft(@editor)
|
||||
'move-up': => new motions.MoveUp(@editor)
|
||||
'move-down': => new motions.MoveDown @editor
|
||||
@@ -101,4 +101,3 @@ class VimMode
|
||||
|
||||
topOperator: ->
|
||||
_.last @opStack
|
||||
|
||||
|
||||
@@ -2,9 +2,9 @@ class Command
|
||||
constructor: (@editor) ->
|
||||
isComplete: -> true
|
||||
|
||||
class DeleteChar extends Command
|
||||
class DeleteRight extends Command
|
||||
execute: ->
|
||||
@editor.deleteChar()
|
||||
@editor.deleteRight()
|
||||
|
||||
module.exports = { DeleteChar }
|
||||
module.exports = { DeleteRight }
|
||||
|
||||
|
||||
@@ -6,41 +6,41 @@ class Motion
|
||||
|
||||
class MoveLeft extends Motion
|
||||
execute: ->
|
||||
{column, row} = @editor.getPosition()
|
||||
@editor.moveLeft() if column > 0
|
||||
{column, row} = @editor.getCursorPosition()
|
||||
@editor.moveCursorLeft() if column > 0
|
||||
|
||||
select: ->
|
||||
position = @editor.getPosition()
|
||||
position = @editor.getCursorPosition()
|
||||
position.column-- if position.column > 0
|
||||
@editor.selectToPosition position
|
||||
|
||||
class MoveRight extends Motion
|
||||
execute: ->
|
||||
{column, row} = @editor.getPosition()
|
||||
currentLineLength = @editor.getLineText(row).length
|
||||
@editor.moveRight() if column < currentLineLength
|
||||
{column, row} = @editor.getCursorPosition()
|
||||
currentLineLength = @editor.buffer.getLine(row).length
|
||||
@editor.moveCursorRight() if column < currentLineLength
|
||||
|
||||
class MoveUp extends Motion
|
||||
execute: ->
|
||||
{column, row} = @editor.getPosition()
|
||||
@editor.moveUp() if row > 0
|
||||
{column, row} = @editor.getCursorPosition()
|
||||
@editor.moveCursorUp() if row > 0
|
||||
|
||||
class MoveDown extends Motion
|
||||
execute: ->
|
||||
{column, row} = @editor.getPosition()
|
||||
@editor.moveDown() if row < (@editor.getAceSession().getLength() - 1)
|
||||
{column, row} = @editor.getCursorPosition()
|
||||
@editor.moveCursorDown() if row < (@editor.buffer.numLines() - 1)
|
||||
|
||||
class MoveToNextWord extends Motion
|
||||
execute: ->
|
||||
@editor.setPosition(@nextWordPosition())
|
||||
@editor.setCursorPosition(@nextWordPosition())
|
||||
|
||||
select: ->
|
||||
@editor.selectToPosition(@nextWordPosition())
|
||||
|
||||
nextWordPosition: ->
|
||||
regex = getWordRegex()
|
||||
{ row, column } = @editor.getPosition()
|
||||
rightOfCursor = @editor.getLineText(row).substring(column)
|
||||
{ row, column } = @editor.getCursorPosition()
|
||||
rightOfCursor = @editor.buffer.getLine(row).substring(column)
|
||||
|
||||
match = regex.exec(rightOfCursor)
|
||||
# If we're on top of part of a word, match the next one.
|
||||
@@ -48,8 +48,10 @@ class MoveToNextWord extends Motion
|
||||
|
||||
if match
|
||||
column += match.index
|
||||
else if row + 1 == @editor.buffer.numLines()
|
||||
column = @editor.buffer.getLine(row).length
|
||||
else
|
||||
nextLineMatch = regex.exec(@editor.getLineText(++row))
|
||||
nextLineMatch = regex.exec(@editor.buffer.getLine(++row))
|
||||
column = nextLineMatch?.index or 0
|
||||
{ row, column }
|
||||
|
||||
@@ -62,8 +64,7 @@ class SelectLines extends Motion
|
||||
setCount: (@count) ->
|
||||
|
||||
select: ->
|
||||
@editor.setPosition(column: 0, row: @editor.getRow())
|
||||
@editor.selectToPosition(column: 0, row: @editor.getRow() + @count)
|
||||
@editor.setCursorPosition(column: 0, row: @editor.getCursorRow())
|
||||
@editor.selectToPosition(column: 0, row: @editor.getCursorRow() + @count)
|
||||
|
||||
module.exports = { MoveLeft, MoveRight, MoveUp, MoveDown, MoveToNextWord, SelectLines }
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ class Delete
|
||||
execute: ->
|
||||
if @motion
|
||||
@motion.select()
|
||||
@editor.delete()
|
||||
@editor.getSelection().delete()
|
||||
else
|
||||
@editor.deleteLine()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user