diff --git a/cmd/micro/bindings.go b/cmd/micro/bindings.go index a6631092..ebe8e863 100644 --- a/cmd/micro/bindings.go +++ b/cmd/micro/bindings.go @@ -5,6 +5,7 @@ import ( "io/ioutil" "os" "strings" + "time" "github.com/gdamore/tcell" "github.com/mitchellh/go-homedir" @@ -35,6 +36,7 @@ func InitBindings() { "Redo": Redo, "Copy": Copy, "Cut": Cut, + "CutLine": CutLine, "Paste": Paste, "SelectAll": SelectAll, "OpenFile": OpenFile, @@ -218,6 +220,7 @@ func DefaultBindings() map[string]string { "CtrlY": "Redo", "CtrlC": "Copy", "CtrlX": "Cut", + "CtrlK": "CutLine", "CtrlV": "Paste", "CtrlA": "SelectAll", "Home": "Beginning", @@ -435,16 +438,40 @@ func Redo(v *View) bool { func Copy(v *View) bool { if v.cursor.HasSelection() { clipboard.WriteAll(v.cursor.GetSelection()) + v.freshClip = true } return true } +// AddCopy appends to the clipboard +func CutLine(v *View) bool { + v.cursor.SelectLine() + if v.freshClip == true { + + if v.cursor.HasSelection() { + if clip, err := clipboard.ReadAll(); err != nil { + messenger.Error(err) + } else { + clipboard.WriteAll(clip + v.cursor.GetSelection()) + } + } + } else if time.Since(v.lastCutTime)/time.Second > 10*time.Second || v.freshClip == false { + Copy(v) + } + v.freshClip = true + v.lastCutTime = time.Now() + v.cursor.DeleteSelection() + v.cursor.ResetSelection() + return true +} + // Cut the selection to the system clipboard func Cut(v *View) bool { if v.cursor.HasSelection() { clipboard.WriteAll(v.cursor.GetSelection()) v.cursor.DeleteSelection() v.cursor.ResetSelection() + v.freshClip = true } return true } @@ -459,6 +486,7 @@ func Paste(v *View) bool { clip, _ := clipboard.ReadAll() v.eh.Insert(v.cursor.Loc(), clip) v.cursor.SetLoc(v.cursor.Loc() + Count(clip)) + v.freshClip = false return true } diff --git a/cmd/micro/cursor.go b/cmd/micro/cursor.go index 60529728..43f2cc22 100644 --- a/cmd/micro/cursor.go +++ b/cmd/micro/cursor.go @@ -91,6 +91,8 @@ func (c *Cursor) DeleteSelection() { if c.curSelection[0] > c.curSelection[1] { c.v.eh.Remove(c.curSelection[1], c.curSelection[0]) c.SetLoc(c.curSelection[1]) + } else if c.GetSelection() == "" { + return } else { c.v.eh.Remove(c.curSelection[0], c.curSelection[1]) c.SetLoc(c.curSelection[0]) diff --git a/cmd/micro/view.go b/cmd/micro/view.go index 55f7214a..d884881a 100644 --- a/cmd/micro/view.go +++ b/cmd/micro/view.go @@ -48,6 +48,13 @@ type View struct { // This is useful for detecting double and triple clicks lastClickTime time.Time + // lastCutTime stores when the last ctrl+k was issued. + // It is used for clearing the clipboard to replace it with fresh cut lines. + lastCutTime time.Time + + // freshClip returns true if the clipboard has never been pasted. + freshClip bool + // Was the last mouse event actually a double click? // Useful for detecting triple clicks -- if a double click is detected // but the last mouse event was actually a double click, it's a triple click