Merge branch 'editor' into highlight

Conflicts:
	src/atom/editor.coffee
This commit is contained in:
Nathan Sobo
2012-02-01 20:24:42 -07:00
12 changed files with 153 additions and 592 deletions

View File

@@ -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

View File

@@ -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()

View File

@@ -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

View File

@@ -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()

View File

@@ -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

View File

@@ -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 }

View File

@@ -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 }

View File

@@ -37,7 +37,7 @@ class Delete
execute: ->
if @motion
@motion.select()
@editor.delete()
@editor.getSelection().delete()
else
@editor.deleteLine()