X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=cmd%2Fmicro%2Fcursor.go;h=15dbb1b360bdf3da7903c18a6b0edf1ab8c63e76;hb=e289d440348a46646355018a00704a284f1bfb96;hp=65baa773ae0970723f5f19f2cedef364b0f6804c;hpb=1a575bc9ae39d562a6a8ca27f79a616f3ee86ec3;p=micro.git diff --git a/cmd/micro/cursor.go b/cmd/micro/cursor.go index 65baa773..15dbb1b3 100644 --- a/cmd/micro/cursor.go +++ b/cmd/micro/cursor.go @@ -28,13 +28,22 @@ type Cursor struct { Num int } -// Goto puts the cursor at the given cursor's location and gives the current cursor its selection too +// Goto puts the cursor at the given cursor's location and gives +// the current cursor its selection too func (c *Cursor) Goto(b Cursor) { c.X, c.Y, c.LastVisualX = b.X, b.Y, b.LastVisualX c.OrigSelection, c.CurSelection = b.OrigSelection, b.CurSelection } -// CopySelection copies the user's selection to either "primary" or "clipboard" +// GotoLoc puts the cursor at the given cursor's location and gives +// the current cursor its selection too +func (c *Cursor) GotoLoc(l Loc) { + c.X, c.Y = l.X, l.Y + c.LastVisualX = c.GetVisualX() +} + +// CopySelection copies the user's selection to either "primary" +// or "clipboard" func (c *Cursor) CopySelection(target string) { if c.HasSelection() { if target != "primary" || c.buf.Settings["useprimary"].(bool) { @@ -151,7 +160,8 @@ func (c *Cursor) SelectWord() { c.Loc = c.CurSelection[1] } -// AddWordToSelection adds the word the cursor is currently on to the selection +// AddWordToSelection adds the word the cursor is currently on +// to the selection func (c *Cursor) AddWordToSelection() { if c.Loc.GreaterThan(c.OrigSelection[0]) && c.Loc.LessThan(c.OrigSelection[1]) { c.CurSelection = c.OrigSelection @@ -183,7 +193,8 @@ func (c *Cursor) AddWordToSelection() { c.Loc = c.CurSelection[1] } -// SelectTo selects from the current cursor location to the given location +// SelectTo selects from the current cursor location to the given +// location func (c *Cursor) SelectTo(loc Loc) { if loc.GreaterThan(c.OrigSelection[0]) { c.SetSelectionStart(c.OrigSelection[0]) @@ -244,7 +255,6 @@ func (c *Cursor) RuneUnder(x int) rune { } return line[x] } - // UpN moves the cursor up N lines (if possible) func (c *Cursor) UpN(amount int) { proposedY := c.Y - amount @@ -255,10 +265,9 @@ func (c *Cursor) UpN(amount int) { proposedY = c.buf.NumLines - 1 } - runes := []rune(c.buf.Line(c.Y)) + runes := []rune(c.buf.Line(proposedY)) c.X = c.GetCharPosInLine(proposedY, c.LastVisualX) - - if c.X > len(runes) { + if c.X > len(runes) || (amount < 0 && proposedY == c.Y) { c.X = len(runes) } @@ -280,7 +289,8 @@ func (c *Cursor) Down() { c.DownN(1) } -// Left moves the cursor left one cell (if possible) or to the last line if it is at the beginning +// Left moves the cursor left one cell (if possible) or to +// the previous line if it is at the beginning func (c *Cursor) Left() { if c.Loc == c.buf.Start() { return @@ -294,7 +304,8 @@ func (c *Cursor) Left() { c.LastVisualX = c.GetVisualX() } -// Right moves the cursor right one cell (if possible) or to the next line if it is at the end +// Right moves the cursor right one cell (if possible) or +// to the next line if it is at the end func (c *Cursor) Right() { if c.Loc == c.buf.End() { return @@ -320,7 +331,21 @@ func (c *Cursor) Start() { c.LastVisualX = c.GetVisualX() } -// GetCharPosInLine gets the char position of a visual x y coordinate (this is necessary because tabs are 1 char but 4 visual spaces) +// StartOfText moves the cursor to the first non-whitespace rune of +// the line it is on +func (c *Cursor) StartOfText() { + c.Start() + for IsWhitespace(c.RuneUnder(c.X)) { + if c.X == Count(c.buf.Line(c.Y)) { + break + } + c.Right() + } +} + +// GetCharPosInLine gets the char position of a visual x y +// coordinate (this is necessary because tabs are 1 char but +// 4 visual spaces) func (c *Cursor) GetCharPosInLine(lineNum, visualPos int) int { // Get the tab size tabSize := int(c.buf.Settings["tabsize"].(float64)) @@ -355,8 +380,9 @@ func (c *Cursor) StoreVisualX() { c.LastVisualX = c.GetVisualX() } -// Relocate makes sure that the cursor is inside the bounds of the buffer -// If it isn't, it moves it to be within the buffer's lines +// Relocate makes sure that the cursor is inside the bounds +// of the buffer If it isn't, it moves it to be within the +// buffer's lines func (c *Cursor) Relocate() { if c.Y < 0 { c.Y = 0