aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam <adamdharrison@gmail.com>2021-08-30 10:52:09 -0400
committerGitHub <noreply@github.com>2021-08-30 10:52:09 -0400
commit3eb6f1dbd410401fcc900460345219220eca8ab1 (patch)
treeae7a2564c8610f87e9054b8ffa620c714e3401bd
parente94718c5c4023e41c9ac7a59691049a22ecc653b (diff)
parent4ae16615e88251ff294533624692c2bec49e3a68 (diff)
downloadlite-xl-3eb6f1dbd410401fcc900460345219220eca8ab1.tar.gz
lite-xl-3eb6f1dbd410401fcc900460345219220eca8ab1.zip
Merge pull request #430 from adamharrison/vsc-multicursor-shortcuts
Added in two new VSC-style multicursor shortcuts.
-rw-r--r--data/core/commands/findreplace.lua30
-rw-r--r--data/core/doc/init.lua19
-rw-r--r--data/core/docview.lua10
-rw-r--r--data/core/keymap-macos.lua1
-rw-r--r--data/core/keymap.lua1
5 files changed, 52 insertions, 9 deletions
diff --git a/data/core/commands/findreplace.lua b/data/core/commands/findreplace.lua
index 6dd7ddae..b9a424fa 100644
--- a/data/core/commands/findreplace.lua
+++ b/data/core/commands/findreplace.lua
@@ -96,13 +96,33 @@ local function has_selection()
return core.active_view:is(DocView) and core.active_view.doc:has_selection()
end
-command.add(has_selection, {
- ["find-replace:select-next"] = function()
- local l1, c1, l2, c2 = doc():get_selection(true)
+local function has_unique_selection()
+ local text = nil
+ for idx, line1, col1, line2, col2 in doc():get_selections(true, true) do
+ if line1 == line2 and col1 == col2 then return false end
+ local selection = doc():get_text(line1, col1, line2, col2)
+ if text ~= nil and text ~= selection then return false end
+ text = selection
+ end
+ return text ~= nil
+end
+
+local function select_next(all)
+ local il1, ic1 = doc():get_selection(true)
+ for idx, l1, c1, l2, c2 in doc():get_selections(true, true) do
local text = doc():get_text(l1, c1, l2, c2)
- l1, c1, l2, c2 = search.find(doc(), l2, c2, text, { wrap = true })
- if l2 then doc():set_selection(l2, c2, l1, c1) end
+ repeat
+ l1, c1, l2, c2 = search.find(doc(), l2, c2, text, { wrap = true })
+ if l1 == il1 and c1 == ic1 then break end
+ if l2 then doc():add_selection(l2, c2, l1, c1) end
+ until not all or not l2
+ break
end
+end
+
+command.add(has_unique_selection, {
+ ["find-replace:select-next"] = function() select_next(false) end,
+ ["find-replace:select-all"] = function() select_next(true) end
})
command.add("core.docview", {
diff --git a/data/core/doc/init.lua b/data/core/doc/init.lua
index 4a231295..ea219a8a 100644
--- a/data/core/doc/init.lua
+++ b/data/core/doc/init.lua
@@ -322,6 +322,7 @@ end
function Doc:raw_insert(line, col, text, undo_stack, time)
-- split text into lines and merge with line at insertion point
local lines = split_lines(text)
+ local len = #lines[#lines]
local before = self.lines[line]:sub(1, col - 1)
local after = self.lines[line]:sub(col)
for i = 1, #lines - 1 do
@@ -332,6 +333,14 @@ function Doc:raw_insert(line, col, text, undo_stack, time)
-- splice lines into line array
common.splice(self.lines, line, 1, lines)
+
+ -- keep cursors where they should be
+ for idx, cline1, ccol1, cline2, ccol2 in self:get_selections(true, true) do
+ if cline1 < line then break end
+ local line_addition = (line < cline1 or col < ccol1) and #lines - 1 or 0
+ local column_addition = line == cline1 and ccol1 > col and len or 0
+ self:set_selections(idx, cline1 + line_addition, ccol1 + column_addition, cline2 + line_addition, ccol2 + column_addition)
+ end
-- push undo
local line2, col2 = self:position_offset(line, col, #text)
@@ -356,6 +365,14 @@ function Doc:raw_remove(line1, col1, line2, col2, undo_stack, time)
-- splice line into line array
common.splice(self.lines, line1, line2 - line1 + 1, { before .. after })
+
+ -- 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
+ if cline1 < line2 then break end
+ local line_removal = line2 - line1
+ local column_removal = line2 == cline2 and col2 < ccol1 and (line2 == line1 and col2 - col1 or col2) or 0
+ self:set_selections(idx, cline1 - line_removal, ccol1 - column_removal, cline2 - line_removal, ccol2 - column_removal)
+ end
-- update highlighter and assure selection is in bounds
self.highlighter:invalidate(line1)
@@ -392,7 +409,7 @@ end
function Doc:text_input(text, idx)
- for sidx, line1, col1, line2, col2 in self:get_selections(true, idx) do
+ for sidx, line1, col1, line2, col2 in self:get_selections(true, idx or true) do
if line1 ~= line2 or col1 ~= col2 then
self:delete_to_cursor(sidx)
end
diff --git a/data/core/docview.lua b/data/core/docview.lua
index 17fb534a..161eac47 100644
--- a/data/core/docview.lua
+++ b/data/core/docview.lua
@@ -367,16 +367,20 @@ function DocView:draw_line_body(idx, x, y)
local x1 = x + self:get_col_x_offset(idx, col1)
local x2 = x + self:get_col_x_offset(idx, col2)
local lh = self:get_line_height()
- renderer.draw_rect(x1, y, x2 - x1, lh, style.selection)
+ if x1 ~= x2 then
+ renderer.draw_rect(x1, y, x2 - x1, lh, style.selection)
+ end
end
end
+ local draw_highlight = nil
for lidx, line1, col1, line2, col2 in self.doc:get_selections(true) do
-- draw line highlight if caret is on this line
- if config.highlight_current_line and (line1 == line2 and col1 == col2)
+ if draw_highlight ~= false and config.highlight_current_line
and line1 == idx and core.active_view == self then
- self:draw_line_highlight(x + self.scroll.x, y)
+ draw_highlight = (line1 == line2 and col1 == col2)
end
end
+ if draw_highlight then self:draw_line_highlight(x + self.scroll.x, y) end
-- draw line's text
self:draw_line_text(idx, x, y)
diff --git a/data/core/keymap-macos.lua b/data/core/keymap-macos.lua
index 647cb132..89f68949 100644
--- a/data/core/keymap-macos.lua
+++ b/data/core/keymap-macos.lua
@@ -66,6 +66,7 @@ local function keymap_macos(keymap)
["cmd+a"] = "doc:select-all",
["cmd+d"] = { "find-replace:select-next", "doc:select-word" },
["cmd+l"] = "doc:select-lines",
+ ["cmd+shift+l"] = { "find-replace:select-all", "doc:select-word" },
["cmd+/"] = "doc:toggle-line-comments",
["cmd+up"] = "doc:move-lines-up",
["cmd+down"] = "doc:move-lines-down",
diff --git a/data/core/keymap.lua b/data/core/keymap.lua
index 0b08259d..2be0dfc7 100644
--- a/data/core/keymap.lua
+++ b/data/core/keymap.lua
@@ -170,6 +170,7 @@ keymap.add_direct {
["ctrl+a"] = "doc:select-all",
["ctrl+d"] = { "find-replace:select-next", "doc:select-word" },
["ctrl+l"] = "doc:select-lines",
+ ["ctrl+shift+l"] = { "find-replace:select-all", "doc:select-word" },
["ctrl+/"] = "doc:toggle-line-comments",
["ctrl+up"] = "doc:move-lines-up",
["ctrl+down"] = "doc:move-lines-down",