From 037c3c993fe81a258ed273fccfdfcb9183d7fafb Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Sat, 4 Jul 2020 21:26:36 -0400 Subject: [PATCH] Add clipboard support for multicursors Fixes #1721 --- internal/action/actions.go | 6 +++--- internal/action/bufpane.go | 5 ++++- internal/buffer/cursor.go | 2 +- internal/clipboard/multi.go | 10 +++++++++- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/internal/action/actions.go b/internal/action/actions.go index b1ed974e..a8732630 100644 --- a/internal/action/actions.go +++ b/internal/action/actions.go @@ -995,7 +995,7 @@ func (h *BufPane) CutLine() bool { if clip, err := clipboard.Read(clipboard.ClipboardReg); err != nil { InfoBar.Error(err) } else { - clipboard.Write(clip+string(h.Cursor.GetSelection()), clipboard.ClipboardReg) + clipboard.WriteMulti(clip+string(h.Cursor.GetSelection()), clipboard.ClipboardReg, h.Cursor.Num) } } } else if time.Since(h.lastCutTime)/time.Second > 10*time.Second || h.freshClip == false { @@ -1139,7 +1139,7 @@ func (h *BufPane) MoveLinesDown() bool { // Paste whatever is in the system clipboard into the buffer // Delete and paste if the user has a selection func (h *BufPane) Paste() bool { - clip, err := clipboard.Read(clipboard.ClipboardReg) + clip, err := clipboard.ReadMulti(clipboard.ClipboardReg, h.Cursor.Num) if err != nil { InfoBar.Error(err) } else { @@ -1151,7 +1151,7 @@ func (h *BufPane) Paste() bool { // PastePrimary pastes from the primary clipboard (only use on linux) func (h *BufPane) PastePrimary() bool { - clip, err := clipboard.Read(clipboard.PrimaryReg) + clip, err := clipboard.ReadMulti(clipboard.PrimaryReg, h.Cursor.Num) if err != nil { InfoBar.Error(err) } else { diff --git a/internal/action/bufpane.go b/internal/action/bufpane.go index 10280abf..203a5b3a 100644 --- a/internal/action/bufpane.go +++ b/internal/action/bufpane.go @@ -113,6 +113,7 @@ func BufMapKey(k Event, action string) { cursors := h.Buf.GetCursors() success := true for i, a := range actionfns { + innerSuccess := true for j, c := range cursors { if c == nil { continue @@ -120,13 +121,14 @@ func BufMapKey(k Event, action string) { h.Buf.SetCurCursor(c.Num) h.Cursor = c if i == 0 || (success && types[i-1] == '&') || (!success && types[i-1] == '|') || (types[i-1] == ',') { - success = h.execAction(a, names[i], j) + innerSuccess = innerSuccess && h.execAction(a, names[i], j) } else { break } } // if the action changed the current pane, update the reference h = MainTab().CurPane() + success = innerSuccess } return true } @@ -689,6 +691,7 @@ var MultiActions = map[string]bool{ "FindNext": true, "FindPrevious": true, "CopyLine": true, + "Copy": true, "Cut": true, "CutLine": true, "DuplicateLine": true, diff --git a/internal/buffer/cursor.go b/internal/buffer/cursor.go index 0521ebc7..2aaf02bd 100644 --- a/internal/buffer/cursor.go +++ b/internal/buffer/cursor.go @@ -128,7 +128,7 @@ func (c *Cursor) End() { func (c *Cursor) CopySelection(target clipboard.Register) { if c.HasSelection() { if target != clipboard.PrimaryReg || c.buf.Settings["useprimary"].(bool) { - clipboard.Write(string(c.GetSelection()), target) + clipboard.WriteMulti(string(c.GetSelection()), target, c.Num) } } } diff --git a/internal/clipboard/multi.go b/internal/clipboard/multi.go index 47cc43eb..42c84363 100644 --- a/internal/clipboard/multi.go +++ b/internal/clipboard/multi.go @@ -54,8 +54,16 @@ func (c multiClipboard) isValid(r Register, clipboard string) bool { func (c multiClipboard) writeText(text string, r Register, num int) { content := c[r] - if content == nil || num >= cap(content) { + if content == nil { content = make([]string, num+1, num+1) + c[r] = content + } + + if num >= cap(content) { + newctnt := make([]string, num+1, num+1) + copy(newctnt, content) + content = newctnt + c[r] = content } content[num] = text