summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackson Moore <jacksonmoore@tuta.io>2026-09-04 11:44:04 +0200
committerJackson Moore <jacksonmoore@tuta.io>2026-09-04 11:44:04 +0200
commit573556d69a64d2b044996e1b7eac986027b9dfda (patch)
tree66eb63a0ac8de14fb6350e7409cef94c22ef95ff
parent6e9e352375031126902ca062464dd4c4414a6e46 (diff)
Count uppercase smart-case folds
-rw-r--r--lua/clever_f/direct_preview_planner.lua18
-rw-r--r--tests/run.lua18
2 files changed, 35 insertions, 1 deletions
diff --git a/lua/clever_f/direct_preview_planner.lua b/lua/clever_f/direct_preview_planner.lua
index a034c3c..16808af 100644
--- a/lua/clever_f/direct_preview_planner.lua
+++ b/lua/clever_f/direct_preview_planner.lua
@@ -102,10 +102,26 @@ local function increment_counter(counters, character)
return value
end
+local function is_upper_ascii(character)
+ if type(character) ~= "string" or #character ~= 1 then
+ return false
+ end
+ local code = character:byte(1)
+ return code >= string.byte("A") and code <= string.byte("Z")
+end
+
local function increment_smart_counters(counters, character)
- return increment_counter(counters, character)
+ local exact_count = increment_counter(counters, character)
+ local lowercase_count
+ if is_upper_ascii(character) then
+ local lowercase = string.char(character:byte(1) + 32)
+ lowercase_count = increment_counter(counters, lowercase)
+ end
+ return exact_count, lowercase_count
end
+M.is_upper_ascii = is_upper_ascii
+
local function require_case_setting(settings, name)
local value = settings[name]
if value == nil then
diff --git a/tests/run.lua b/tests/run.lua
index ba6757f..4984fb6 100644
--- a/tests/run.lua
+++ b/tests/run.lua
@@ -4692,6 +4692,24 @@ test("Smart-case previews increment every exact character counter", function()
same(domain.Position.new(1, 5), positions[2])
end)
+test("Smart-case previews add ASCII uppercase to lowercase counters", function()
+ local planner = direct_preview_planner.new({ lowercase = string.lower })
+ local view = text_topology.new({ "xAa" }, "utf-8")
+ local positions = planner:plan(
+ view,
+ domain.Position.new(1, 1),
+ "f",
+ 2,
+ { ignore_case = false, smart_case = true }
+ )
+
+ same(1, #positions)
+ same(domain.Position.new(1, 3), positions[1])
+ truthy(direct_preview_planner.is_upper_ascii("A"))
+ falsy(direct_preview_planner.is_upper_ascii("a"))
+ falsy(direct_preview_planner.is_upper_ascii("AA"))
+end)
+
for _, item in ipairs(tests) do
local ok, failure = xpcall(item.body, debug.traceback)
if not ok then