Skip to content

Commit 8c9e598

Browse files
committed
Respect user tabline and listchars settings. Closes #3
1 parent 153c070 commit 8c9e598

5 files changed

Lines changed: 170 additions & 3 deletions

File tree

lua/diffbandit/commit_panel.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ function CommitPanel:show_commit_panel()
113113
set_window_options(win, {
114114
number = false,
115115
relativenumber = false,
116+
list = false,
116117
cursorline = true,
117118
wrap = false,
118119
signcolumn = "no",

lua/diffbandit/merge.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,7 @@ function Merge:configure_windows()
542542
set_win_options(win, {
543543
number = false,
544544
relativenumber = false,
545+
list = false,
545546
signcolumn = "no",
546547
foldcolumn = "0",
547548
wrap = false,
@@ -556,6 +557,7 @@ function Merge:configure_windows()
556557
set_win_options(win, {
557558
number = false,
558559
relativenumber = false,
560+
list = false,
559561
signcolumn = "no",
560562
foldcolumn = "0",
561563
wrap = false,
@@ -599,6 +601,7 @@ function Merge:configure_windows()
599601
set_win_options(win, {
600602
number = false,
601603
relativenumber = false,
604+
list = false,
602605
signcolumn = "no",
603606
foldcolumn = "0",
604607
wrap = false,

lua/diffbandit/session.lua

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,7 @@ function Session:open_layout()
648648
set_window_options(win, {
649649
number = false,
650650
relativenumber = false,
651+
list = false,
651652
cursorline = false,
652653
wrap = false,
653654
signcolumn = "no",
@@ -662,6 +663,7 @@ function Session:open_layout()
662663
set_window_options(left_num_win, {
663664
number = false,
664665
relativenumber = false,
666+
list = false,
665667
cursorline = false,
666668
wrap = false,
667669
signcolumn = "no",
@@ -673,6 +675,7 @@ function Session:open_layout()
673675
set_window_options(connector_win, {
674676
number = false,
675677
relativenumber = false,
678+
list = false,
676679
cursorline = false,
677680
wrap = false,
678681
signcolumn = "no",
@@ -684,6 +687,7 @@ function Session:open_layout()
684687
set_window_options(right_num_win, {
685688
number = false,
686689
relativenumber = false,
690+
list = false,
687691
cursorline = false,
688692
wrap = false,
689693
signcolumn = "no",
@@ -706,6 +710,7 @@ function Session:open_layout()
706710
set_window_options(win, {
707711
number = false,
708712
relativenumber = false,
713+
list = false,
709714
cursorline = false,
710715
wrap = false,
711716
signcolumn = "no",
@@ -726,6 +731,7 @@ function Session:open_layout()
726731
set_window_options(win, {
727732
number = false,
728733
relativenumber = false,
734+
list = false,
729735
cursorline = true,
730736
wrap = false,
731737
signcolumn = "no",
@@ -782,7 +788,6 @@ function Session:open_layout()
782788
local right_name = self.right.label or self.right.path or ""
783789
self.title = string.format("DiffBandit: %s ↔ %s", left_name, right_name)
784790
vim.api.nvim_tabpage_set_var(self.tabpage, "diffbandit_title", self.title)
785-
vim.api.nvim_set_option_value("showtabline", 2, { scope = "global" })
786791
end
787792

788793
function Session:resize_layout()
@@ -3654,6 +3659,7 @@ function Session:show_commit_panel(opts)
36543659
set_window_options(win, {
36553660
number = false,
36563661
relativenumber = false,
3662+
list = false,
36573663
cursorline = true,
36583664
wrap = false,
36593665
signcolumn = "no",

tests/integration/run.sh

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Integration tests for diffbandit.nvim using tmux
33
# Usage: ./run.sh [test_name]
44
# test_name: 'extreme', 'pure', 'deletions', 'mixed', 'dense-mixed',
5-
# 'theme-default', 'comprehensive',
5+
# 'theme-default', 'comprehensive', 'listchars',
66
# 'navigation', 'git', 'git-merge', 'git-scroll-perf',
77
# 'scroll-additions', 'scroll-deletions', 'scroll-mixed', 'scroll-dense-mixed',
88
# 'scroll-changes', or 'all' (default: stable non-scroll suite)
@@ -268,6 +268,45 @@ run_scroll_test() {
268268
echo " Captures: $case_dir"
269269
}
270270

271+
run_listchars_test() {
272+
local test_name="listchars"
273+
local case_dir="$CAPTURE_ROOT/$test_name"
274+
local left_file="$case_dir/left.txt"
275+
local right_file="$case_dir/right.txt"
276+
local plain_capture="$case_dir/capture.txt"
277+
278+
echo "Running integration test: $test_name"
279+
rm -rf "$case_dir"
280+
mkdir -p "$case_dir"
281+
printf "same \nleft\n" > "$left_file"
282+
printf "same \nright\n" > "$right_file"
283+
284+
tmux kill-session -t "$TMUX_SESSION" 2>/dev/null || true
285+
tmux new-session -d -s "$TMUX_SESSION" -x 120 -y 24
286+
start_test_nvim "nvim -u '$SCRIPT_DIR/init.lua'"
287+
sleep 1
288+
tmux send-keys -t "$TMUX_SESSION" ":set list listchars=trail:·" C-m
289+
sleep 0.2
290+
tmux send-keys -t "$TMUX_SESSION" ":DiffBandit $left_file $right_file" C-m
291+
sleep 2
292+
tmux capture-pane -t "$TMUX_SESSION" -p > "$plain_capture"
293+
tmux kill-session -t "$TMUX_SESSION" 2>/dev/null || true
294+
295+
if ! grep -q "same··" "$plain_capture"; then
296+
echo "Listchars test failed: source panes did not retain trailing-space markers"
297+
cat "$plain_capture"
298+
exit 1
299+
fi
300+
if grep -q "····" "$plain_capture"; then
301+
echo "Listchars test failed: connector or gutter panes rendered trailing-space markers"
302+
cat "$plain_capture"
303+
exit 1
304+
fi
305+
306+
echo " PASSED: $test_name"
307+
echo " Captures: $case_dir"
308+
}
309+
271310
run_navigation_test() {
272311
local test_name="navigation"
273312
local left_file="$PROJECT_ROOT/tests/files/left_navigation.txt"
@@ -1482,6 +1521,9 @@ case "$TEST_TO_RUN" in
14821521
"$PROJECT_ROOT/tests/files/left_comprehensive.txt" \
14831522
"$PROJECT_ROOT/tests/files/right_comprehensive.txt"
14841523
;;
1524+
listchars)
1525+
run_listchars_test
1526+
;;
14851527
navigation)
14861528
run_navigation_test
14871529
;;
@@ -1548,6 +1590,8 @@ case "$TEST_TO_RUN" in
15481590
"$PROJECT_ROOT/tests/files/left_comprehensive.txt" \
15491591
"$PROJECT_ROOT/tests/files/right_comprehensive.txt"
15501592

1593+
run_listchars_test
1594+
15511595
run_navigation_test
15521596

15531597
run_git_test
@@ -1559,7 +1603,7 @@ case "$TEST_TO_RUN" in
15591603
;;
15601604
*)
15611605
echo "Unknown test: $TEST_TO_RUN"
1562-
echo "Usage: $0 [extreme|pure|deletions|mixed|dense-mixed|theme-default|comprehensive|navigation|git|git-merge|git-scroll-perf|scroll-additions|scroll-deletions|scroll-mixed|scroll-dense-mixed|scroll-changes|all]"
1606+
echo "Usage: $0 [extreme|pure|deletions|mixed|dense-mixed|theme-default|comprehensive|listchars|navigation|git|git-merge|git-scroll-perf|scroll-additions|scroll-deletions|scroll-mixed|scroll-dense-mixed|scroll-changes|all]"
15631607
exit 1
15641608
;;
15651609
esac

tests/run.lua

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,16 @@ local function to_text(lines)
4040
return table.concat(lines, "\n") .. "\n"
4141
end
4242

43+
local function test_source(label, lines)
44+
return {
45+
label = label,
46+
path = label,
47+
lines = lines,
48+
text = to_text(lines),
49+
filetype = "",
50+
}
51+
end
52+
4353
local function assert_eq(a, b, msg)
4454
if a ~= b then
4555
error((msg or "assertion failed") .. string.format("\nExpected: %s\nActual: %s", tostring(b), tostring(a)))
@@ -63,6 +73,109 @@ assert_eq(config.ui.scroll_debounce_ms, 16, "Viewport scroll rerenders should de
6373
assert_eq(config.merge.result_initial_content, "base", "Merge result should initialize from the base by default")
6474
assert_eq(config.merge.keys.accept_local, ">>", "Merge accept-local key should default to >>")
6575

76+
do
77+
local original_showtabline = vim.o.showtabline
78+
for _, value in ipairs({ 0, 1, 2 }) do
79+
vim.o.showtabline = value
80+
local session = assert((Session.start({
81+
left = test_source("tabline-left.txt", { "one" }),
82+
right = test_source("tabline-right.txt", { "two" }),
83+
}, config, {})))
84+
assert_eq(vim.o.showtabline, value,
85+
"Starting a diff session should not mutate global showtabline=" .. tostring(value))
86+
session:close()
87+
assert_eq(vim.o.showtabline, value,
88+
"Closing a diff session should preserve global showtabline=" .. tostring(value))
89+
end
90+
vim.o.showtabline = original_showtabline
91+
end
92+
93+
do
94+
local original_list = vim.o.list
95+
local original_listchars = vim.o.listchars
96+
vim.o.list = true
97+
vim.o.listchars = "trail:·"
98+
99+
local function win_list(win)
100+
return vim.api.nvim_get_option_value("list", { scope = "local", win = win })
101+
end
102+
103+
local session = assert((Session.start({
104+
left = test_source("list-left.txt", { "one " }),
105+
right = test_source("list-right.txt", { "two " }),
106+
}, config, {
107+
panel = true,
108+
queue = { entries = {} },
109+
})))
110+
assert_eq(win_list(session.left_win), true,
111+
"Diff source panes should retain user list rendering")
112+
assert_eq(win_list(session.right_win), true,
113+
"Diff target panes should retain user list rendering")
114+
for _, win in ipairs({
115+
session.left_overview_win,
116+
session.left_num_win,
117+
session.connector_win,
118+
session.right_num_win,
119+
session.right_overview_win,
120+
session.left_header_win,
121+
session.center_header_win,
122+
session.right_header_win,
123+
session.panel and session.panel.nav_win,
124+
session.panel and session.panel.commit_win,
125+
}) do
126+
if win then
127+
assert_eq(win_list(win), false,
128+
"Diff visual chrome panes should suppress listchars")
129+
end
130+
end
131+
session:close()
132+
133+
local merge_session = assert((merge_mod.start({
134+
root = root,
135+
path = "merge-list.txt",
136+
base_lines = { "base " },
137+
local_lines = { "local " },
138+
remote_lines = { "remote " },
139+
result_lines = { "base " },
140+
conflicts = {},
141+
non_conflicting = {},
142+
local_hunks = {},
143+
remote_hunks = {},
144+
}, config, {
145+
panel = true,
146+
queue = { entries = {} },
147+
})))
148+
assert_eq(win_list(merge_session.local_win), true,
149+
"Merge local pane should retain user list rendering")
150+
assert_eq(win_list(merge_session.result_win), true,
151+
"Merge result pane should retain user list rendering")
152+
assert_eq(win_list(merge_session.remote_win), true,
153+
"Merge remote pane should retain user list rendering")
154+
for _, win in ipairs({
155+
merge_session.local_num_win,
156+
merge_session.local_result_connector_win,
157+
merge_session.result_left_num_win,
158+
merge_session.result_right_num_win,
159+
merge_session.result_remote_connector_win,
160+
merge_session.remote_num_win,
161+
merge_session.local_header_win,
162+
merge_session.result_header_win,
163+
merge_session.remote_header_win,
164+
merge_session.panel and merge_session.panel.nav_win,
165+
merge_session.panel and merge_session.panel.commit_win,
166+
}) do
167+
if win then
168+
assert_eq(win_list(win), false,
169+
"Merge visual chrome panes should suppress listchars")
170+
end
171+
end
172+
pcall(vim.api.nvim_set_option_value, "modified", false, { buf = merge_session.result_buf })
173+
merge_session:close()
174+
175+
vim.o.list = original_list
176+
vim.o.listchars = original_listchars
177+
end
178+
66179
local function get_hl(name)
67180
return vim.api.nvim_get_hl(0, { name = name, link = false })
68181
end

0 commit comments

Comments
 (0)