From 4eee123efff4b28feb23b78ea8677ba4e9e8fcd6 Mon Sep 17 00:00:00 2001 From: Jipok Date: Wed, 8 Dec 2021 17:34:10 +0500 Subject: [PATCH] Make cursor_clipboard globa, not per doc --- data/core/commands/doc.lua | 35 ++++++++++++++++++++++------------- data/core/doc/init.lua | 4 +--- data/core/init.lua | 2 ++ 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/data/core/commands/doc.lua b/data/core/commands/doc.lua index c903f0ea..cca32ca8 100644 --- a/data/core/commands/doc.lua +++ b/data/core/commands/doc.lua @@ -48,19 +48,20 @@ end local function cut_or_copy(delete) local full_text = "" local text = "" + core.cursor_clipboard = {} + core.cursor_clipboard_whole_line = {} for idx, line1, col1, line2, col2 in doc():get_selections() do if line1 ~= line2 or col1 ~= col2 then text = doc():get_text(line1, col1, line2, col2) - full_text = full_text == "" and text or (full_text .. "\n" .. text) - doc().cursor_clipboard_whole_line[idx] = false + full_text = full_text == "" and text or (full_text .. " " .. text) + core.cursor_clipboard_whole_line[idx] = false if delete then doc():delete_to_cursor(idx, 0) end else -- Cut/copy whole line text = doc().lines[line1] full_text = full_text == "" and text or (full_text .. text) - doc().cursor_clipboard_whole_line[idx] = true - core.lines_in_clipboard = full_text + core.cursor_clipboard_whole_line[idx] = true if delete then if line1 < #doc().lines then doc():remove(line1, 1, line1 + 1, 1) @@ -69,9 +70,9 @@ local function cut_or_copy(delete) end end end - doc().cursor_clipboard[idx] = text + core.cursor_clipboard[idx] = text end - doc().cursor_clipboard["full"] = full_text + core.cursor_clipboard["full"] = full_text system.set_clipboard(full_text) end @@ -123,16 +124,24 @@ local commands = { ["doc:paste"] = function() local clipboard = system.get_clipboard() -- If the clipboard has changed since our last look, use that instead - if doc().cursor_clipboard["full"] ~= clipboard then - doc().cursor_clipboard = {} - doc().cursor_clipboard_whole_line = {} + if core.cursor_clipboard["full"] ~= clipboard then + core.cursor_clipboard = {} + core.cursor_clipboard_whole_line = {} end + local value, whole_line for idx, line1, col1, line2, col2 in doc():get_selections() do - local value = doc().cursor_clipboard[idx] or clipboard - if doc().cursor_clipboard_whole_line[idx] == true then + if #core.cursor_clipboard_whole_line == (#doc().selections/4) then + value = core.cursor_clipboard[idx] + whole_line = core.cursor_clipboard_whole_line[idx] == true + else + value = clipboard + whole_line = clipboard:find("\n") ~= nil + end + if whole_line then doc():insert(line1, 1, value:gsub("\r", "")) - elseif (core.lines_in_clipboard == clipboard) and (not doc().cursor_clipboard[idx]) then - doc():insert(line1, 1, clipboard:gsub("\r", "")) + if col1 == 1 then + doc():move_to_cursor(idx, #value) + end else doc():text_input(value:gsub("\r", ""), idx) end diff --git a/data/core/doc/init.lua b/data/core/doc/init.lua index 3aa76a62..7928d2a5 100644 --- a/data/core/doc/init.lua +++ b/data/core/doc/init.lua @@ -33,8 +33,6 @@ end function Doc:reset() self.lines = { "\n" } self.selections = { 1, 1, 1, 1 } - self.cursor_clipboard = {} - self.cursor_clipboard_whole_line = {} self.undo_stack = { idx = 1 } self.redo_stack = { idx = 1 } self.clean_change_id = 1 @@ -199,7 +197,7 @@ function Doc:add_selection(line1, col1, line2, col2, swap) end function Doc:set_selection(line1, col1, line2, col2, swap) - self.selections, self.cursor_clipboard = {}, {} + self.selections = {} self:set_selections(1, line1, col1, line2, col2, swap) end diff --git a/data/core/init.lua b/data/core/init.lua index aadccc66..f6cd91d1 100644 --- a/data/core/init.lua +++ b/data/core/init.lua @@ -648,6 +648,8 @@ function core.init() core.clip_rect_stack = {{ 0,0,0,0 }} core.log_items = {} core.docs = {} + core.cursor_clipboard = {} + core.cursor_clipboard_whole_line = {} core.window_mode = "normal" core.threads = setmetatable({}, { __mode = "k" }) core.blink_start = system.get_time()