]> git.lizzy.rs Git - micro.git/commitdiff
Add clipboard support for multicursors
authorZachary Yedidia <zyedidia@gmail.com>
Sun, 5 Jul 2020 01:26:36 +0000 (21:26 -0400)
committerZachary Yedidia <zyedidia@gmail.com>
Sun, 5 Jul 2020 01:26:36 +0000 (21:26 -0400)
Fixes #1721

internal/action/actions.go
internal/action/bufpane.go
internal/buffer/cursor.go
internal/clipboard/multi.go

index b1ed974e118b16d0639800e813443569c7aa2d83..a87326306e399ab5fc56737ebe462f8cca798e25 100644 (file)
@@ -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 {
index 10280abfd497d61c1a5fd64119f1fa627a71a17b..203a5b3a240acd76d70f70c2435d045711cb1b0e 100644 (file)
@@ -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,
index 0521ebc7cbf0a56f72b04183966bce7eaa958900..2aaf02bd12e79005cd2bcc045b8452a72d0925f7 100644 (file)
@@ -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)
                }
        }
 }
index 47cc43eba93fc986f82ba899f23345026b6e0970..42c84363e983fbcd358f10764c62f98342d8def6 100644 (file)
@@ -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