From de19696b35942ddf1b1ddbc112040b9c993e239e Mon Sep 17 00:00:00 2001 From: EnumDev Date: Sun, 15 Jun 2025 09:11:51 +0300 Subject: [PATCH] Improve copy and pasting --- src/buffer.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/command.go | 26 +++++++++----------- 2 files changed, 75 insertions(+), 15 deletions(-) diff --git a/src/buffer.go b/src/buffer.go index c9abc29..d2f21b2 100644 --- a/src/buffer.go +++ b/src/buffer.go @@ -164,6 +164,70 @@ func (buffer *Buffer) GetSelectedText() string { } } +func (buffer *Buffer) CopyText() (string, int) { + if buffer.Selection == nil { + // Copy line + copiedText := "" + + // Add current letter to copied text + if buffer.CursorPos < len(buffer.Contents) { + copiedText = string(buffer.Contents[buffer.CursorPos]) + } + + // Find end of line + for i := buffer.CursorPos + 1; i < len(buffer.Contents); i++ { + currentLetter := buffer.Contents[i] + + copiedText += string(currentLetter) + if currentLetter == '\n' { + break + } + } + + // Find start of line + for i := buffer.CursorPos - 1; i >= 0; i-- { + currentLetter := buffer.Contents[i] + if currentLetter != '\n' { + copiedText = string(currentLetter) + copiedText + } else { + break + } + } + + return copiedText, 0 + } else { + // Copy selection + return buffer.GetSelectedText(), 1 + } +} + +func (buffer *Buffer) PasteText(window *Window, text string) { + str := buffer.Contents + + // Remove selected text + if buffer.Selection != nil { + edge1, edge2 := buffer.GetSelectionEdges() + if edge2 == len(buffer.Contents) { + edge2 = len(buffer.Contents) - 1 + } + + str = str[:edge1] + str[edge2+1:] + buffer.Contents = str + window.SetCursorPos(edge1) + buffer.Selection = nil + } + + index := buffer.CursorPos + + if index == len(str) { + str += text + } else { + str = str[:index] + text + str[index:] + } + buffer.Contents = str + window.SetCursorPos(buffer.CursorPos + len(text)) +} + func GetOpenFileBuffer(filename string) *Buffer { // Replace tilde with home directory if filename != "~" && strings.HasPrefix(filename, "~/") { diff --git a/src/command.go b/src/command.go index 61f60c0..df39a14 100644 --- a/src/command.go +++ b/src/command.go @@ -21,14 +21,16 @@ func initCommands() { copyCmd := Command{ cmd: "copy", run: func(window *Window, args ...string) { - if window.CurrentBuffer.Selection == nil { - // Copy line - _, line := window.GetCursorPos2D() - window.Clipboard = strings.SplitAfter(window.CurrentBuffer.Contents, "\n")[line] + // Copy text from buffer + copiedText, copyingMethod := window.CurrentBuffer.CopyText() + + // Put copied text to clipboard + window.Clipboard = copiedText + + // Send appropriate message depending on copying method + if copyingMethod == 0 { PrintMessage(window, "Copied line to clipboard.") } else { - // Copy selection - window.Clipboard = window.CurrentBuffer.GetSelectedText() PrintMessage(window, "Copied selection to clipboard.") } }, @@ -37,16 +39,10 @@ func initCommands() { pasteCmd := Command{ cmd: "paste", run: func(window *Window, args ...string) { - str := window.CurrentBuffer.Contents - index := window.CurrentBuffer.CursorPos - - if index == len(str) { - str += window.Clipboard - } else { - str = str[:index] + window.Clipboard + str[index:] + if window.Clipboard != "" { + window.CurrentBuffer.PasteText(window, window.Clipboard) + PrintMessage(window, "Pasted text to buffer.") } - window.CurrentBuffer.Contents = str - window.SetCursorPos(window.CurrentBuffer.CursorPos + len(window.Clipboard)) }, }