From 17185075c61efa2431a5336d3ecf142b4c2a8d22 Mon Sep 17 00:00:00 2001 From: Guldoman Date: Wed, 8 Sep 2021 22:47:37 +0200 Subject: [PATCH 1/2] Allow `find-replace:select-next` to select more occurrences after wrap The initial position for the search is defined by the last selection towards the end of the file. After reaching the end of the file, it would always select the same selection to start the search from. Now, we start the search from each selection, until a new occurrence is found. --- data/core/commands/findreplace.lua | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/data/core/commands/findreplace.lua b/data/core/commands/findreplace.lua index 48cbecaf..4236b2ea 100644 --- a/data/core/commands/findreplace.lua +++ b/data/core/commands/findreplace.lua @@ -108,6 +108,20 @@ local function has_unique_selection() return text ~= nil end +local function is_in_selection(line, col, l1, c1, l2, c2) + if line < l1 or line > l2 then return false end + if line == l1 and col <= c1 then return false end + if line == l2 and col > c2 then return false end + return true +end + +local function is_in_any_selection(line, col) + for idx, l1, c1, l2, c2 in doc():get_selections(true, false) do + if is_in_selection(line, col, l1, c1, l2, c2) then return true end + end + return false +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 @@ -115,9 +129,15 @@ local function select_next(all) 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 + if l2 and (all or not is_in_any_selection(l2, c2)) then + doc():add_selection(l2, c2, l1, c1) + if not all then + core.active_view:scroll_to_make_visible(l2, c2) + return + end + end until not all or not l2 - break + if all then break end end end From 4964c30e1271a4a5734e722c012d787fbe652e8e Mon Sep 17 00:00:00 2001 From: Francesco Abbate Date: Thu, 9 Sep 2021 19:12:56 +0200 Subject: [PATCH 2/2] Bring back command find-replace:select-next Bring back the command like before to keep single selection but with ctrl+f3 keybindings. Change the name of the new multi-cursor command but keep the ctrl+d keybinding. --- changelog.md | 5 +++++ data/core/commands/findreplace.lua | 10 ++++++++-- data/core/keymap-macos.lua | 5 +++-- data/core/keymap.lua | 5 +++-- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/changelog.md b/changelog.md index d6e30519..71170dda 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,10 @@ This files document the changes done in Lite XL for each release. +### 2.0.2 + +Change behavior of `ctrl+d` to add a multi-cursor selection to the next occurrence. +The old behavior to move the selection to the next occurrence is now done using the shortcut `ctrl+F3`. + ### 2.0 The 2.0 version of lite contains *breaking changes* to lite, in terms of how plugin settings are structured; diff --git a/data/core/commands/findreplace.lua b/data/core/commands/findreplace.lua index 4236b2ea..8ef97365 100644 --- a/data/core/commands/findreplace.lua +++ b/data/core/commands/findreplace.lua @@ -142,8 +142,14 @@ local function select_next(all) end command.add(has_unique_selection, { - ["find-replace:select-next"] = function() select_next(false) end, - ["find-replace:select-all"] = function() select_next(true) end + ["find-replace:select-next"] = function() + local l1, c1, l2, c2 = doc():get_selection(true) + 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 + end, + ["find-replace:select-add-next"] = function() select_next(false) end, + ["find-replace:select-add-all"] = function() select_next(true) end }) command.add("core.docview", { diff --git a/data/core/keymap-macos.lua b/data/core/keymap-macos.lua index 7f54ddbb..53a20468 100644 --- a/data/core/keymap-macos.lua +++ b/data/core/keymap-macos.lua @@ -66,9 +66,10 @@ local function keymap_macos(keymap) ["cmd+shift+return"] = "doc:newline-above", ["cmd+j"] = "doc:join-lines", ["cmd+a"] = "doc:select-all", - ["cmd+d"] = { "find-replace:select-next", "doc:select-word" }, + ["cmd+d"] = { "find-replace:select-add-next", "doc:select-word" }, + ["cmd+f3"] = "find-replace:select-next", ["cmd+l"] = "doc:select-lines", - ["cmd+shift+l"] = { "find-replace:select-all", "doc:select-word" }, + ["cmd+shift+l"] = { "find-replace:select-add-all", "doc:select-word" }, ["cmd+/"] = "doc:toggle-line-comments", ["option+up"] = "doc:move-lines-up", ["option+down"] = "doc:move-lines-down", diff --git a/data/core/keymap.lua b/data/core/keymap.lua index 2be0dfc7..50eadec6 100644 --- a/data/core/keymap.lua +++ b/data/core/keymap.lua @@ -168,9 +168,10 @@ keymap.add_direct { ["ctrl+shift+return"] = "doc:newline-above", ["ctrl+j"] = "doc:join-lines", ["ctrl+a"] = "doc:select-all", - ["ctrl+d"] = { "find-replace:select-next", "doc:select-word" }, + ["ctrl+d"] = { "find-replace:select-add-next", "doc:select-word" }, + ["ctrl+f3"] = "find-replace:select-next", ["ctrl+l"] = "doc:select-lines", - ["ctrl+shift+l"] = { "find-replace:select-all", "doc:select-word" }, + ["ctrl+shift+l"] = { "find-replace:select-add-all", "doc:select-word" }, ["ctrl+/"] = "doc:toggle-line-comments", ["ctrl+up"] = "doc:move-lines-up", ["ctrl+down"] = "doc:move-lines-down",