opencode.nvim 窗口调整

opencode.nvim 窗口宽度修复

问题

opencode.nvim 配置了 window_width = 0.40(右边窗口占页面 40%),但实际打开后右边窗口始终占据 50% 宽度。

根因分析

根因 1:split 模式下未应用 window_width

opencode.nvimwindow_width 配置只在 float 模式下生效。当 position = 'right'(split 模式)时,创建窗口的 create_split_windows 函数只执行了 botright vsplit,没有设置宽度,导致 Neovim 默认将窗口均分为 50%。

相关文件: lazy/opencode.nvim/lua/opencode/ui/ui.luacreate_split_windows 函数

根因 2:filetype 设置时序导致 windows.nvim 冲突

windows.nvimautowidth 功能在 BufWinEnter 事件触发时会检查窗口 buffer 的 filetype 是否在 ignore 列表中。但 opencode 的 output buffer 的 filetype(opencode_output)是在 buffer 挂到窗口之后才设置的:

  1. create_split_windows 调用 nvim_win_set_buf → 触发 BufWinEnter
  2. windows.nvim 检查 filetype → 此时还是空的 → 不匹配 ignore 列表
  3. windows.nvim 执行 autowidth 把窗口均分回 50%
  4. opencode 之后才设置 filetype(太晚了)

相关文件: lazy/opencode.nvim/lua/opencode/ui/output_window.luacreate_buf 函数

修复方法

修改 1:lazy/opencode.nvim/lua/opencode/ui/ui.lua

create_split_windows 函数中,创建垂直 split 后,根据 config.ui.window_width 计算并设置输出窗口宽度。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
  vim.api.nvim_win_set_buf(input_win, windows.input_buf)
  vim.api.nvim_win_set_buf(output_win, windows.output_buf)
+
+ -- Apply configured window_width for vertical splits (default vsplit is 50/50)
+ if windows.position == 'right' or windows.position == 'left' then
+   local target_cols = math.floor(vim.o.columns * (config.ui.window_width or 0.40))
+   pcall(vim.api.nvim_win_set_width, output_win, target_cols)
+ end
+
  return { input_win = input_win, output_win = output_win }

修改 2:lazy/opencode.nvim/lua/opencode/ui/output_window.lua

create_buf 函数中,buffer 创建后立即设置 filetype,确保在 buffer 挂到窗口之前 filetype 已就位。

1
2
3
4
5
 function M.create_buf()
   local output_buf = vim.api.nvim_create_buf(false, true)

+  vim.api.nvim_set_option_value('filetype', config.ui.output.filetype or 'opencode_output', { buf = output_buf })
   vim.api.nvim_buf_set_var(output_buf, 'opencode_folds', build_fold_state({}))

相关插件版本

  • opencode.nvim:sudo-tee/opencode.nvim
  • windows.nvim:anuvyklack/windows.nvimautowidth.enable = true

注意

这些修改位于 lazy 安装的插件源码中(lazy/opencode.nvim/),如果重新安装或更新 opencode.nvim,需要重新应用这些 patch。

william 支付宝支付宝
william 微信微信
0%