XXX This is a scratch file I used for notes; information may be out of date or random -- dgreenspan
- rename ace2.js to ace.js
Editor goals:
- Highlight JavaScript accurately (including regular expression, etc.)
- On large documents (say 2000 lines), be responsive to new input and rehighlight the screen quickly
- Highlight "as you type", not when you're done with the current line
- Propagate multi-line comment highlighting efficiently
- Look and feel as "clean" and "native" as possible to the user
- Support unlimited "undo" with arbitrary undo model
- Allow features such as auto-indentation and parenthesis-flashing to be added easily
- Work in IE 6, FF 2, Safari 3, Camino
- Support native copy and paste, within the buffer and with other programs
- Not display any flickering, blurring, or any kind of artifact
- Support incremental syntax-highlighting of other languages too
- Be extensible -- multiple views of whole document, lines, tokens, characters
- Support native selection behavior, international input, assistive devices (potentially)
- Resizable text
- Unlimited editors per page
compatibility, speed, power, generality,
- enhancement ideas
- show mismatched brackets
- undo history limit
ace2 changelog for week of 5/9:
- full "undo" support! control-Z (Windows) or command-Z (Mac)
- flashing parentheses are back, and better than before!
- appjet:css sections are syntax-highlighted
- optimizations for slower machines
- fixed various quirks
- lines too long for browser are hard-wrapped on entry
== path to calls that change rep
- doLineSplice
- incorporateUserChanges
- idleWorkTimer
- handleKeyEvent
- performDocumentLineSplice
- setCodeText
- importCode
- setup
- handleReturnIndentation
- handleKeyEvent
- performDocumentReplaceRange
- handleKeyEvent
- performDocumentReplaceSelection
- handleKeyEvent
- repSelectionChange
- incorporateUserChanges
- idleWorkTimer
- handleKeyEvent
- performSelectionChange
- setCodeText
- importCode
- setup
- handleReturnIndentation
- handleKeyEvent
- performDocumentReplaceRange
- doLineSplice
make ace2_common local?
next steps:
- safari scroll jump
- FF 1.6 support
- weird "delete" bug
- speed on slow machines
- paren flashing
- undo
- investigate errors with special "delete" handling turned off
- track down FF quirk (delete at begging of line starting with one space)
- (done for now: look for IE memory leaks)
Outstanding issues:
+ Bugs:
+ Quirks:
- FF: delete at beginning of line where line starts with 1 space (space briefly disappears)
- IE: clicking below document body clears selection (instead of moving caret)
- IE: horizontal scroll-bar sometimes unnecessary
+ Speed:
- skip-list is slow for insert/delete lines on highlighting
- return at bottom of 3000-line file takes too long to normalize in Firefox (probably worse in IE)
+ feature parity
- regular expression highlighting not smart in lexically ambiguous cases (should use previous token)
- paren flashing
+ additional features
- less zealous IDE document-dirty marking (e.g. arrow-key marks dirty)
- undo
+ fancy todo
- bring back rich shell editor
- use same highlighting for view-source, highlight on server
- highlight CSS and stuff
+ done
- multi-line strings
- does tab do the right thing?
- indent on return
- quirk: return key doesn't scroll caret into view
- line numbers
- highlight appjet directives
- IE Support
- slightly smarter indentation
- tab deletes until a stop
- interface: import/export
- interface: rich/plain
- bugfix: IE: return, delete, etc. doesn't mark document dirty!
- bugfix: IE: can't copy/paste within document
- caret not always in view after an edit
====================
Highlighting strategy:
- allow incremental dirty-region highlighting, based on time and char to pass
- first lex the viewport, based on information extending a little before it
- then highlight the viewport
- then highlight around the viewport?
- lex the whole document from the top
- highlight lines outside the viewport
- deal with key events in relation to when they are responded to (doLater after all?)
- use Pygment!
- handle international characters (fragile DOM state)
- normalize only when idle (make sure that works)
- better detection, e.g. paste in Safari
- selectionchange event?
- can eventually allow discarding user changes!
DONE:
- editing when lines consist of spans
- all browsers: scroll to full left on return, etc
- why does IE let you type without firing events?
- slow in IE?
tests:
- type some stuff, return, type more stuff, return
- return repeatedly starting at end of line, delete repeatedly
- return repeatedly starting at beginning of line, delete repeatedly
- return repeatedly starting in middle of line, delete repeatedly
- return/delete starting between blank lines
- try to move past end of document, then try to type, then try to move
- from collapsed selection, shift-left repeatedly, across lines, shift-right repeatedly
- from collapsed selection, shift-right repeatedly, across lines, shift-left repeatedly
- shift-up, shift-down; shift-down, shift-up
- cut-and-paste span of characters into middle of line
- cut-and-paste span of characters into blank line (FF)
- cut-and-paste span of characters at end of line (FF)
- cut-and-paste selection with blank lines in it, make sure lines still blank
- cut-and-paste selection starting and ending with blank lines (IE, FF)
- doc with blank lines, select-all, cut, paste
- doc starting and ending in blank lines, select-all, cut, paste (IE, Firefox)
- IE currently loses one blank line at end if > 0
- Safari loses one blank line at end if > 1
- non-empty doc, select-all, delete, select-all, delete (IE crash, Safari hidden cursor)
- non-empty doc select-all, return, return, return (IE)
- on last line of document: type stuff, return, type stuff. down arrow goes down = bad (IE)
- on last line of document: type stuff, return, return. should be no extra lines (IE)
- go to start of next-to-last line, shift-down, cut (IE)
- cursor at start of line, shift-down, cut, paste (IE cursor jump)
- cursor at start of one empty line, shift-down, cut, paste (IE)
- cursor at start of two empty lines, shift-down, cut, paste (IE, FF)
- on IE, no new line is pasted; default behavior is worse, so I'll take it
- on FF, the equivalent of two returns; good enough
- cursor at start of two empty lines, shift-down, cut, paste in middle of line (IE, FF)
- in IE, FF, Safari, the equivalent of two returns
- type letter on blank line, delete it (IE)
- type space on blank line, delete it (IE)
- type space before non-blank line, delete it
- delete blank line, then delete again quickly
- delete blank line from caret at start of line starting with one space (FF)
- type over selection from middle of one line to middle of next
- in middle of a word (span), quickly delete, then type a character, then delete (IE)
- paste text with blank lines from an external source
- meta-delete
- up arrow from beginning of line (WebKit)