+ #clamp values
+ if column < 0
+ column = 0
+ else if column >= @width
+ column = @width - 1
+ if row < 0
+ row = 0
+ if row >= @height
+ row = @height - 1
+
+ #move the cursor
+ @x = column
+ @y = row
+
+ # clear to screen edge(es)
+ csi_J: (direction) ->
+ switch @fix_esc_arg direction, '0'
+ when '0' # erase down
+ # rest of current line
+ @csi_K direction
+ # rest of lines
+ for row in [@y...@height]
+ for i in [0...@width]
+ @text[row][i] = ' '
+ @attributes[row][i] = @a
+ when '1' # erase up
+ # beginning of current line
+ @csi_K direction
+ # all previous lines
+ for row in [0..@y]
+ for i in [0...@width]
+ @text[row][i] = ' '
+ @attributes[row][i] = @a
+ when '2' # erase everything
+ for row in [0...@height]
+ for i in [0...@width]
+ @text[row][i] = ' '
+ @attributes[row][i] = @a
+ else
+ console.log "confusing arg for csi_J: #{direction}"
+ return
+
+ # clear (some or all of) current line
+ csi_K: (direction) ->
+ switch @fix_esc_arg direction, '0'
+ when '0' # erase to right
+ for i in [@x...@width]
+ @text[@y][i] = ' '
+ @attributes[@y][i] = @a
+ when '1' # erase to left
+ # @x can equal @width (after printing to right-most column)
+ if @x < @width
+ max = @x
+ else
+ max = @width - 1
+ for i in [0..max]
+ @text[@y][i] = ' '
+ @attributes[@y][i] = @a
+ when '2' # erase whole line
+ for i in [0...@width]
+ @text[@y][i] = ' '
+ @attributes[@y][i] = @a
+ else
+ console.log "confusing arg for csi_K: #{direction}"
+ return
+
+ # misc
+ csiq_h: ->
+ args = []
+ for i in arguments
+ arg = @fix_esc_arg i, ''
+ switch arg
+ when '25'
+ @cursor_visible = true
+ when '1049'
+ if @saved_normal_screen?
+ console.log "ignoring request to switch to the alt screen because we're already on the alt screen"
+ return
+ @saved_normal_screen = [@x, @y, @text, @attributes]
+ @text = []
+ @attributes = []
+ for y in [0...@height]
+ @text[y] = []
+ @attributes[y] = []
+ for x in [0...@width]
+ @text[y].push ' '
+ @attributes[y].push 0x07
+ else
+ console.log "confusing arg for csiq_h: #{arg}"
+ # unmisc
+ csiq_l: ->
+ args = []
+ for i in arguments
+ arg = @fix_esc_arg i, ''
+ switch arg
+ when '25'
+ @cursor_visible = false
+ when '1049'
+ if not @saved_normal_screen?
+ console.log "ignoring request to switch to the normal screen because we're already on the normal screen"
+ return
+ @x = @saved_normal_screen[0]
+ @y = @saved_normal_screen[1]
+ @text = @saved_normal_screen[2]
+ @attributes = @saved_normal_screen[3]
+ @saved_normal_screen = null
+ else
+ console.log "confusing arg for csiq_l: #{arg}"
+
+ # set color, bold, underline, etc
+ csi_m: ->
+ args = []