Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ https://github.com/user-attachments/assets/64c41f01-dffe-4318-bce4-16eec8de356e
diff = {
disable_inlay_hints = true, -- Disable inlay hints in diff windows for cleaner view
max_computation_time_ms = 5000, -- Maximum time for diff computation (VSCode default)
ignore_trim_whitespace = false, -- Ignore leading/trailing whitespace changes (like diffopt+=iwhite)
hide_merge_artifacts = false, -- Hide merge tool temp files (*.orig, *.BACKUP.*, *.BASE.*, *.LOCAL.*, *.REMOTE.*)
original_position = "left", -- Position of original (old) content: "left" or "right"
conflict_ours_position = "right", -- Position of ours (:2) in conflict view: "left" or "right"
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.19.0
2.20.0
1 change: 1 addition & 0 deletions lua/codediff/config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ M.defaults = {
diff = {
disable_inlay_hints = true, -- Disable inlay hints in diff windows for cleaner view
max_computation_time_ms = 5000, -- Maximum time for diff computation (5 seconds, VSCode default)
ignore_trim_whitespace = false, -- Ignore leading/trailing whitespace changes (like diffopt+=iwhite)
hide_merge_artifacts = false, -- Hide merge tool temp files (*.orig, *.BACKUP.*, *.BASE.*, *.LOCAL.*, *.REMOTE.*)
original_position = "left", -- Position of original (old) content: "left" or "right"
conflict_ours_position = "right", -- Position of ours (:2) in conflict view: "left" or "right" (independent of original_position)
Expand Down
2 changes: 2 additions & 0 deletions lua/codediff/ui/auto_refresh.lua
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ local function do_diff_update(bufnr, skip_watcher_check)
local config = require("codediff.config")
local diff_options = {
max_computation_time_ms = config.options.diff.max_computation_time_ms,
ignore_trim_whitespace = config.options.diff.ignore_trim_whitespace,
}
local lines_diff = diff.compute_diff(original_lines, modified_lines, diff_options)
if not lines_diff then
Expand Down Expand Up @@ -270,6 +271,7 @@ local function do_result_diff_update(bufnr)
local config = require("codediff.config")
local diff_options = {
max_computation_time_ms = config.options.diff.max_computation_time_ms,
ignore_trim_whitespace = config.options.diff.ignore_trim_whitespace,
}
local lines_diff = diff.compute_diff(base_lines, result_lines, diff_options)
if not lines_diff then
Expand Down
6 changes: 5 additions & 1 deletion lua/codediff/ui/lifecycle/state.lua
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,11 @@ local function resume_diff(tabpage)
if need_recompute or not diff.stored_diff_result then
-- Buffer or file changed, recompute diff
local diff_module = require("codediff.core.diff")
lines_diff = diff_module.compute_diff(original_lines, modified_lines)
local config = require("codediff.config")
lines_diff = diff_module.compute_diff(original_lines, modified_lines, {
max_computation_time_ms = config.options.diff.max_computation_time_ms,
ignore_trim_whitespace = config.options.diff.ignore_trim_whitespace,
})
diff_was_recomputed = true

if lines_diff then
Expand Down
2 changes: 2 additions & 0 deletions lua/codediff/ui/view/render.lua
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ function M.compute_and_render(
-- Compute diff
local diff_options = {
max_computation_time_ms = config.options.diff.max_computation_time_ms,
ignore_trim_whitespace = config.options.diff.ignore_trim_whitespace,
}
local lines_diff = diff_module.compute_diff(original_lines, modified_lines, diff_options)
if not lines_diff then
Expand Down Expand Up @@ -102,6 +103,7 @@ end
function M.compute_and_render_conflict(original_buf, modified_buf, base_lines, original_lines, modified_lines, original_win, modified_win, auto_scroll_to_first_hunk)
local diff_options = {
max_computation_time_ms = config.options.diff.max_computation_time_ms,
ignore_trim_whitespace = config.options.diff.ignore_trim_whitespace,
}

-- Compute base -> original (incoming) diff
Expand Down
65 changes: 65 additions & 0 deletions tests/ignore_whitespace_spec.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
-- Test: ignore_trim_whitespace option
-- Validates that the ignore_trim_whitespace DiffOption works correctly via FFI

local diff = require('codediff.core.diff')

describe("ignore_trim_whitespace", function()
it("detects whitespace-only changes when disabled", function()
local result = diff.compute_diff(
{" hello", "world"},
{" hello", "world"},
{ ignore_trim_whitespace = false }
)
assert.is_true(#result.changes > 0, "Should detect leading whitespace change")
end)

it("ignores leading whitespace changes when enabled", function()
local result = diff.compute_diff(
{" hello", "world"},
{" hello", "world"},
{ ignore_trim_whitespace = true }
)
assert.equal(0, #result.changes, "Should ignore leading whitespace difference")
end)

it("ignores trailing whitespace changes when enabled", function()
local result = diff.compute_diff(
{"hello ", "world"},
{"hello ", "world"},
{ ignore_trim_whitespace = true }
)
assert.equal(0, #result.changes, "Should ignore trailing whitespace difference")
end)

it("still detects content changes when whitespace is ignored", function()
local result = diff.compute_diff(
{" hello", "world"},
{" goodbye", "world"},
{ ignore_trim_whitespace = true }
)
assert.is_true(#result.changes > 0, "Should still detect non-whitespace changes")
end)

it("ignores indentation-only changes across multiple lines", function()
local result = diff.compute_diff(
{"function foo()", " return 1", "end"},
{"function foo()", " return 1", "end"},
{ ignore_trim_whitespace = true }
)
assert.equal(0, #result.changes, "Should ignore indentation-only differences")
end)

it("defaults to false when not specified", function()
local with_default = diff.compute_diff(
{" hello"},
{" hello"}
)
local with_false = diff.compute_diff(
{" hello"},
{" hello"},
{ ignore_trim_whitespace = false }
)
assert.equal(#with_default.changes, #with_false.changes,
"Default behavior should match ignore_trim_whitespace=false")
end)
end)