Merge pull request #713 from Jipok/master
Copy/cut whole line if selection empty
This commit is contained in:
commit
61379a9ab8
|
@ -47,19 +47,32 @@ end
|
||||||
|
|
||||||
local function cut_or_copy(delete)
|
local function cut_or_copy(delete)
|
||||||
local full_text = ""
|
local full_text = ""
|
||||||
|
local text = ""
|
||||||
|
core.cursor_clipboard = {}
|
||||||
|
core.cursor_clipboard_whole_line = {}
|
||||||
for idx, line1, col1, line2, col2 in doc():get_selections() do
|
for idx, line1, col1, line2, col2 in doc():get_selections() do
|
||||||
if line1 ~= line2 or col1 ~= col2 then
|
if line1 ~= line2 or col1 ~= col2 then
|
||||||
local text = doc():get_text(line1, col1, line2, col2)
|
text = doc():get_text(line1, col1, line2, col2)
|
||||||
|
full_text = full_text == "" and text or (full_text .. " " .. text)
|
||||||
|
core.cursor_clipboard_whole_line[idx] = false
|
||||||
if delete then
|
if delete then
|
||||||
doc():delete_to_cursor(idx, 0)
|
doc():delete_to_cursor(idx, 0)
|
||||||
end
|
end
|
||||||
full_text = full_text == "" and text or (full_text .. "\n" .. text)
|
else -- Cut/copy whole line
|
||||||
doc().cursor_clipboard[idx] = text
|
text = doc().lines[line1]
|
||||||
else
|
full_text = full_text == "" and text or (full_text .. text)
|
||||||
doc().cursor_clipboard[idx] = ""
|
core.cursor_clipboard_whole_line[idx] = true
|
||||||
|
if delete then
|
||||||
|
if line1 < #doc().lines then
|
||||||
|
doc():remove(line1, 1, line1 + 1, 1)
|
||||||
|
else
|
||||||
|
doc():remove(line1 - 1, math.huge, line1, math.huge)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
core.cursor_clipboard[idx] = text
|
||||||
end
|
end
|
||||||
doc().cursor_clipboard["full"] = full_text
|
core.cursor_clipboard["full"] = full_text
|
||||||
system.set_clipboard(full_text)
|
system.set_clipboard(full_text)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -85,6 +98,13 @@ local function set_cursor(x, y, snap_type)
|
||||||
end
|
end
|
||||||
|
|
||||||
local selection_commands = {
|
local selection_commands = {
|
||||||
|
["doc:select-none"] = function()
|
||||||
|
local line, col = doc():get_selection()
|
||||||
|
doc():set_selection(line, col)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
local commands = {
|
||||||
["doc:cut"] = function()
|
["doc:cut"] = function()
|
||||||
cut_or_copy(true)
|
cut_or_copy(true)
|
||||||
end,
|
end,
|
||||||
|
@ -93,13 +113,6 @@ local selection_commands = {
|
||||||
cut_or_copy(false)
|
cut_or_copy(false)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
["doc:select-none"] = function()
|
|
||||||
local line, col = doc():get_selection()
|
|
||||||
doc():set_selection(line, col)
|
|
||||||
end
|
|
||||||
}
|
|
||||||
|
|
||||||
local commands = {
|
|
||||||
["doc:undo"] = function()
|
["doc:undo"] = function()
|
||||||
doc():undo()
|
doc():undo()
|
||||||
end,
|
end,
|
||||||
|
@ -111,12 +124,27 @@ local commands = {
|
||||||
["doc:paste"] = function()
|
["doc:paste"] = function()
|
||||||
local clipboard = system.get_clipboard()
|
local clipboard = system.get_clipboard()
|
||||||
-- If the clipboard has changed since our last look, use that instead
|
-- If the clipboard has changed since our last look, use that instead
|
||||||
if doc().cursor_clipboard["full"] ~= clipboard then
|
if core.cursor_clipboard["full"] ~= clipboard then
|
||||||
doc().cursor_clipboard = {}
|
core.cursor_clipboard = {}
|
||||||
|
core.cursor_clipboard_whole_line = {}
|
||||||
end
|
end
|
||||||
|
local value, whole_line
|
||||||
for idx, line1, col1, line2, col2 in doc():get_selections() do
|
for idx, line1, col1, line2, col2 in doc():get_selections() do
|
||||||
local value = doc().cursor_clipboard[idx] or clipboard
|
if #core.cursor_clipboard_whole_line == (#doc().selections/4) then
|
||||||
doc():text_input(value:gsub("\r", ""), idx)
|
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", ""))
|
||||||
|
if col1 == 1 then
|
||||||
|
doc():move_to_cursor(idx, #value)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
doc():text_input(value:gsub("\r", ""), idx)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
|
||||||
|
@ -393,27 +421,27 @@ local commands = {
|
||||||
os.remove(filename)
|
os.remove(filename)
|
||||||
core.log("Removed \"%s\"", filename)
|
core.log("Removed \"%s\"", filename)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
["doc:select-to-cursor"] = function(x, y, clicks)
|
["doc:select-to-cursor"] = function(x, y, clicks)
|
||||||
local line1, col1 = select(3, doc():get_selection())
|
local line1, col1 = select(3, doc():get_selection())
|
||||||
local line2, col2 = dv():resolve_screen_position(x, y)
|
local line2, col2 = dv():resolve_screen_position(x, y)
|
||||||
dv().mouse_selecting = { line1, col1, nil }
|
dv().mouse_selecting = { line1, col1, nil }
|
||||||
doc():set_selection(line2, col2, line1, col1)
|
doc():set_selection(line2, col2, line1, col1)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
["doc:set-cursor"] = function(x, y)
|
["doc:set-cursor"] = function(x, y)
|
||||||
set_cursor(x, y, "set")
|
set_cursor(x, y, "set")
|
||||||
end,
|
end,
|
||||||
|
|
||||||
["doc:set-cursor-word"] = function(x, y)
|
["doc:set-cursor-word"] = function(x, y)
|
||||||
set_cursor(x, y, "word")
|
set_cursor(x, y, "word")
|
||||||
end,
|
|
||||||
|
|
||||||
["doc:set-cursor-line"] = function(x, y, clicks)
|
|
||||||
set_cursor(x, y, "lines")
|
|
||||||
end,
|
end,
|
||||||
|
|
||||||
["doc:split-cursor"] = function(x, y, clicks)
|
["doc:set-cursor-line"] = function(x, y, clicks)
|
||||||
|
set_cursor(x, y, "lines")
|
||||||
|
end,
|
||||||
|
|
||||||
|
["doc:split-cursor"] = function(x, y, clicks)
|
||||||
local line, col = dv():resolve_screen_position(x, y)
|
local line, col = dv():resolve_screen_position(x, y)
|
||||||
doc():add_selection(line, col, line, col)
|
doc():add_selection(line, col, line, col)
|
||||||
end,
|
end,
|
||||||
|
|
|
@ -33,7 +33,6 @@ end
|
||||||
function Doc:reset()
|
function Doc:reset()
|
||||||
self.lines = { "\n" }
|
self.lines = { "\n" }
|
||||||
self.selections = { 1, 1, 1, 1 }
|
self.selections = { 1, 1, 1, 1 }
|
||||||
self.cursor_clipboard = {}
|
|
||||||
self.undo_stack = { idx = 1 }
|
self.undo_stack = { idx = 1 }
|
||||||
self.redo_stack = { idx = 1 }
|
self.redo_stack = { idx = 1 }
|
||||||
self.clean_change_id = 1
|
self.clean_change_id = 1
|
||||||
|
@ -198,7 +197,7 @@ function Doc:add_selection(line1, col1, line2, col2, swap)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Doc:set_selection(line1, col1, line2, col2, swap)
|
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)
|
self:set_selections(1, line1, col1, line2, col2, swap)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -208,12 +207,10 @@ function Doc:merge_cursors(idx)
|
||||||
if self.selections[i] == self.selections[j] and
|
if self.selections[i] == self.selections[j] and
|
||||||
self.selections[i+1] == self.selections[j+1] then
|
self.selections[i+1] == self.selections[j+1] then
|
||||||
common.splice(self.selections, i, 4)
|
common.splice(self.selections, i, 4)
|
||||||
common.splice(self.cursor_clipboard, i, 1)
|
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if #self.selections <= 4 then self.cursor_clipboard = {} end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function selection_iterator(invariant, idx)
|
local function selection_iterator(invariant, idx)
|
||||||
|
@ -356,7 +353,7 @@ function Doc:raw_insert(line, col, text, undo_stack, time)
|
||||||
|
|
||||||
-- splice lines into line array
|
-- splice lines into line array
|
||||||
common.splice(self.lines, line, 1, lines)
|
common.splice(self.lines, line, 1, lines)
|
||||||
|
|
||||||
-- keep cursors where they should be
|
-- keep cursors where they should be
|
||||||
for idx, cline1, ccol1, cline2, ccol2 in self:get_selections(true, true) do
|
for idx, cline1, ccol1, cline2, ccol2 in self:get_selections(true, true) do
|
||||||
if cline1 < line then break end
|
if cline1 < line then break end
|
||||||
|
@ -388,7 +385,7 @@ function Doc:raw_remove(line1, col1, line2, col2, undo_stack, time)
|
||||||
|
|
||||||
-- splice line into line array
|
-- splice line into line array
|
||||||
common.splice(self.lines, line1, line2 - line1 + 1, { before .. after })
|
common.splice(self.lines, line1, line2 - line1 + 1, { before .. after })
|
||||||
|
|
||||||
-- move all cursors back if they share a line with the removed text
|
-- move all cursors back if they share a line with the removed text
|
||||||
for idx, cline1, ccol1, cline2, ccol2 in self:get_selections(true, true) do
|
for idx, cline1, ccol1, cline2, ccol2 in self:get_selections(true, true) do
|
||||||
if cline1 < line2 then break end
|
if cline1 < line2 then break end
|
||||||
|
@ -458,7 +455,7 @@ end
|
||||||
function Doc:replace(fn)
|
function Doc:replace(fn)
|
||||||
local has_selection, n = false, 0
|
local has_selection, n = false, 0
|
||||||
for idx, line1, col1, line2, col2 in self:get_selections(true) do
|
for idx, line1, col1, line2, col2 in self:get_selections(true) do
|
||||||
if line1 ~= line2 or col1 ~= col2 then
|
if line1 ~= line2 or col1 ~= col2 then
|
||||||
n = n + self:replace_cursor(idx, line1, col1, line2, col2, fn)
|
n = n + self:replace_cursor(idx, line1, col1, line2, col2, fn)
|
||||||
has_selection = true
|
has_selection = true
|
||||||
end
|
end
|
||||||
|
|
|
@ -648,6 +648,8 @@ function core.init()
|
||||||
core.clip_rect_stack = {{ 0,0,0,0 }}
|
core.clip_rect_stack = {{ 0,0,0,0 }}
|
||||||
core.log_items = {}
|
core.log_items = {}
|
||||||
core.docs = {}
|
core.docs = {}
|
||||||
|
core.cursor_clipboard = {}
|
||||||
|
core.cursor_clipboard_whole_line = {}
|
||||||
core.window_mode = "normal"
|
core.window_mode = "normal"
|
||||||
core.threads = setmetatable({}, { __mode = "k" })
|
core.threads = setmetatable({}, { __mode = "k" })
|
||||||
core.blink_start = system.get_time()
|
core.blink_start = system.get_time()
|
||||||
|
|
Loading…
Reference in New Issue