// Move cursor to the 'boffset' position in the 'line'. Obviously 'line' must be // from the attached buffer. If 'boffset' < 0, use 'last_cursor_voffset'. Keep // in mind that there is no need to maintain connections between lines (e.g. for // moving from a deleted line to another line). func (v *View) MoveCursorTo(c buffer.Cursor) { v.dirty |= dirtyStatus if c.Boffset < 0 { bo, co, vo := c.Line.FindClosestOffsets(v.lastCursorVoffset) v.cursor.Boffset = bo v.cursorCoffset = co v.cursorVoffset = vo } else { vo, co := c.VoffsetCoffset() v.cursor.Boffset = c.Boffset v.cursorCoffset = co v.cursorVoffset = vo } if c.Boffset >= 0 { v.lastCursorVoffset = v.cursorVoffset } if c.Line != v.cursor.Line { if v.lineVoffset != 0 { v.dirty = dirtyEverything } v.lineVoffset = 0 } v.cursor.Line = c.Line v.cursor.LineNum = c.LineNum v.adjustLineVoffset() v.adjustTopLine() if v.selection.Type != SelectionNone { v.dirty |= dirtyContents v.selection.End = v.Cursor() } }
func (v *View) deindentLine(line buffer.Cursor) { line.Boffset = 0 if r, _ := line.RuneUnder(); r == '\t' { v.buf.Delete(line, 1) } if v.cursor.Line == line.Line && v.cursor.Boffset > 0 { cursor := v.cursor cursor.Boffset -= 1 v.MoveCursorTo(cursor) } }
func (v *view) prependToKillBuffer(cursor buffer.Cursor, nbytes int) { kb := *v.ctx.killBuffer switch v.lastCommand.Cmd { case vCommandKillWord, vCommandKillWordBackward, vCommandKillRegion, vCommandKillLine: default: kb = kb[:0] } kb = append(cursor.ExtractBytes(nbytes), kb...) *v.ctx.killBuffer = kb }
func (v *View) indentLine(line buffer.Cursor) { line.Boffset = 0 v.buf.Insert(line, []byte{'\t'}) if v.cursor.Line == line.Line { cursor := v.cursor cursor.Boffset += 1 v.MoveCursorTo(cursor) } }
func (s Selection) includes(c buffer.Cursor) bool { if s.Type == SelectionNone { return false } start, end := buffer.SortCursors(s.Start, s.End) inc := false switch s.Type { case SelectionChar: inc = (start.Before(c) || start.Equals(c)) && (c.Before(end) || c.Equals(end)) case SelectionLine: inc = start.LineNum <= c.LineNum && c.LineNum <= end.LineNum case SelectionBlock: // TODO panic("not implemented") } return inc }
func (v *view) cursorPositionFor(cursor buffer.Cursor) (int, int) { y := cursor.LineNum - v.topLineNum vo, _ := cursor.VoffsetCoffset() x := vo - v.lineVoffset return x, y }