Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9f1adf1

Browse files
fix: restore proper window layout after diff operations
Addresses window layout disruption after diff acceptance/rejection by:- Adding restore_window_layout() function in diff.lua- Detecting and properly sizing Claude terminal windows- Maintaining configured terminal width ratios- Adding get_config() method to terminal.lua for layout coordination- Applying restoration after diff resolve, cleanup, and deny operationsEnsures Claude terminal maintains its configured 30% width after diff operations.
1 parent91357d8 commit9f1adf1

File tree

2 files changed

+88
-3
lines changed

2 files changed

+88
-3
lines changed

‎lua/claudecode/diff.lua

Lines changed: 82 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,79 @@ local logger = require("claudecode.logger")
88
localactive_diffs= {}
99
localautocmd_group
1010

11+
--- Get terminal configuration to restore proper window layout
12+
-- @return table Terminal config with split_width_percentage and split_side
13+
localfunctionget_terminal_config()
14+
localok,terminal=pcall(require,"claudecode.terminal")
15+
ifokandterminal.get_configthen
16+
localterminal_config=terminal.get_config()
17+
return {
18+
split_width_percentage=terminal_config.split_width_percentage,
19+
split_side=terminal_config.split_side
20+
}
21+
end
22+
23+
-- Fallback to defaults if terminal module is not available
24+
return {
25+
split_width_percentage=0.30,-- Default terminal width (30%)
26+
split_side="right"-- Default terminal side
27+
}
28+
end
29+
30+
--- Restore window layout after closing diff windows
31+
-- This ensures that Claude's terminal maintains its configured size ratio
32+
-- @param target_window number|nil The remaining main editor window
33+
localfunctionrestore_window_layout(target_window)
34+
ifnottarget_windowornotvim.api.nvim_win_is_valid(target_window)then
35+
return
36+
end
37+
38+
localterm_config=get_terminal_config()
39+
40+
-- Find terminal window
41+
localterminal_win=nil
42+
localwindows=vim.api.nvim_list_wins()
43+
44+
for_,wininipairs(windows)do
45+
ifvim.api.nvim_win_is_valid(win)then
46+
localbuf=vim.api.nvim_win_get_buf(win)
47+
localfiletype=vim.api.nvim_buf_get_option(buf,"filetype")
48+
localbuftype=vim.api.nvim_buf_get_option(buf,"buftype")
49+
50+
-- Check if this is Claude's terminal window
51+
iffiletype=="ClaudeCode"orbuftype=="terminal"then
52+
localbuf_name=vim.api.nvim_buf_get_name(buf)
53+
ifbuf_name:match("claude")orfiletype=="ClaudeCode"then
54+
terminal_win=win
55+
break
56+
end
57+
end
58+
end
59+
end
60+
61+
ifterminal_winandvim.api.nvim_win_is_valid(terminal_win)then
62+
-- Calculate proper terminal width based on configuration
63+
localtotal_width=vim.o.columns
64+
localterminal_width=math.floor(total_width*term_config.split_width_percentage)
65+
66+
-- Set terminal window width
67+
vim.api.nvim_win_set_width(terminal_win,terminal_width)
68+
69+
-- Equalize other windows
70+
vim.cmd("wincmd =")
71+
72+
-- Re-apply terminal width to maintain proportion
73+
ifvim.api.nvim_win_is_valid(terminal_win)then
74+
vim.api.nvim_win_set_width(terminal_win,terminal_width)
75+
end
76+
77+
logger.debug("diff","Restored window layout with terminal width:",terminal_width)
78+
else
79+
-- No terminal found, just equalize
80+
vim.cmd("wincmd =")
81+
end
82+
end
83+
1184
--- Get or create the autocmd group
1285
localfunctionget_autocmd_group()
1386
ifnotautocmd_groupthen
@@ -316,13 +389,15 @@ function M._resolve_diff_as_saved(tab_name, buffer_id)
316389
final_content=final_content.."\n"
317390
end
318391

319-
-- Close diff windows (unified behavior)
392+
-- Close diff windows (unified behavior) and restore layout
320393
ifdiff_data.new_windowandvim.api.nvim_win_is_valid(diff_data.new_window)then
321394
vim.api.nvim_win_close(diff_data.new_window,true)
322395
end
323396
ifdiff_data.target_windowandvim.api.nvim_win_is_valid(diff_data.target_window)then
324397
vim.api.nvim_set_current_win(diff_data.target_window)
325398
vim.cmd("diffoff")
399+
-- Restore proper window layout after closing diff
400+
restore_window_layout(diff_data.target_window)
326401
end
327402

328403
-- Create MCP-compliant response
@@ -615,11 +690,13 @@ function M._cleanup_diff_state(tab_name, reason)
615690
pcall(vim.api.nvim_win_close,diff_data.new_window,true)
616691
end
617692

618-
-- Turn off diff mode in target window if it still exists
693+
-- Turn off diff mode in target window if it still exists and restore layout
619694
ifdiff_data.target_windowandvim.api.nvim_win_is_valid(diff_data.target_window)then
620695
vim.api.nvim_win_call(diff_data.target_window,function()
621696
vim.cmd("diffoff")
622697
end)
698+
-- Restore proper window layout after cleanup
699+
restore_window_layout(diff_data.target_window)
623700
end
624701

625702
-- Remove from active diffs
@@ -913,13 +990,15 @@ function M.deny_current_diff()
913990
return
914991
end
915992

916-
-- Close windows and clean up(same logic as the original keymap)
993+
-- Close windows and clean upwith layout restoration
917994
ifnew_winandvim.api.nvim_win_is_valid(new_win)then
918995
vim.api.nvim_win_close(new_win,true)
919996
end
920997
iftarget_windowandvim.api.nvim_win_is_valid(target_window)then
921998
vim.api.nvim_set_current_win(target_window)
922999
vim.cmd("diffoff")
1000+
-- Restore proper window layout after rejecting diff
1001+
restore_window_layout(target_window)
9231002
end
9241003

9251004
M._resolve_diff_as_rejected(tab_name)

‎lua/claudecode/terminal.lua

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,4 +298,10 @@ function M._get_managed_terminal_for_test()
298298
returnnil
299299
end
300300

301+
--- Gets the current terminal configuration
302+
-- @return table The current terminal configuration with split_side, split_width_percentage, etc.
303+
functionM.get_config()
304+
returnvim.deepcopy(config)
305+
end
306+
301307
returnM

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp