code: func (v *View) EditDelete(back bool) {
  	x, y := v.ox+v.cx, v.oy+v.cy
  	if y < 0 {
  		return
  	} else if y >= len(v.viewLines) {
  		v.MoveCursor(-1, 0, true)
  		return
  	}
  
  	maxX, _ := v.Size()
  	if back {
  		if x == 0 { // start of the line
  			if y < 1 {
  				return
  			}
  
  			var maxPrevWidth int
  			if v.Wrap {
  				maxPrevWidth = maxX
  			} else {
  				maxPrevWidth = maxInt
  			}
  
  			if v.viewLines[y].linesX == 0 { // regular line
  				v.mergeLines(v.cy - 1)
  				if len(v.viewLines[y-1].line) < maxPrevWidth {
  					v.MoveCursor(-1, 0, true)
  				}
  			} else { // wrapped line
  				v.deleteRune(len(v.viewLines[y-1].line)-1, v.cy-1)
  				v.MoveCursor(-1, 0, true)
  			}
  		} else { // middle/end of the line
  			v.deleteRune(v.cx-1, v.cy)
  			v.MoveCursor(-1, 0, true)
  		}
  	} else {
  		if x == len(v.viewLines[y].line) { // end of the line
  			v.mergeLines(v.cy)
  		} else { // start/middle of the line
  			v.deleteRune(v.cx, v.cy)
  		}
  	}
  }
docs: // EditDelete deletes a rune at the cursor position. back determines the
  // direction.