sindrets/winshift.nvim

Swapping split windows gives "Unknown option" error

Closed this issue · 4 comments

Have tried this plugin today. Moving splits works fine but swapping two of three or more split windows gives an error.

I'm using Lunarvim with a bunch of plugins but also managed to reproduce this issue with this minimal config:

Minimal config
--[[
-- Usage: `nvim --clean -u winshift_mini.lua`
--]]
vim.cmd([[set runtimepath=$VIMRUNTIME]])
vim.cmd([[set packpath=/tmp/nvim/site]])
local package_root = "/tmp/nvim/site/pack"
local install_path = package_root .. "/packer/start/packer.nvim"
local function load_plugins()
  require("packer").startup({
      {
          "wbthomason/packer.nvim",
          "sindrets/winshift.nvim",
          "nvim-lualine/lualine.nvim",
          -- ADD PLUGINS THAT ARE _NECESSARY_ FOR REPRODUCING THE ISSUE
      },
      config = {
          package_root = package_root,
          compile_path = install_path .. "/plugin/packer_compiled.lua",
          display = { non_interactive = true },
      },
  })
  require("lualine").setup()
end
_G.load_config = function()
  -- ADD INIT.LUA SETTINGS THAT ARE _NECESSARY_ FOR REPRODUCING THE ISSUE
  vim.opt.nu = true
end
if vim.fn.isdirectory(install_path) == 0 then
  print("Installing dependencies...")
  vim.fn.system({ "git", "clone", "--depth=1", "https://github.com/wbthomason/packer.nvim", install_path })
end
load_plugins()
require("packer").sync()
vim.cmd([[autocmd User PackerComplete ++once echo "Ready!" | lua load_config()]])

Apparently there's a conflict with lualine.

Using

NVIM v0.7.2
Build type: Release

Run nvim <somefile> then <C-w>+s twice. Having two split windows is not enough since they're swapping just fine. But with three and more I'm getting this error:

...e/pack/packer/start/winshift.nvim/lua/winshift/utils.lua:286: Error executing lua: ...e/pack/packer/start/winshift.nvim/lua/winshift/utils.lua:304: Vim(setlocal):E518: Unknown option: main.go 
stack traceback:
^I[C]: in function 'cmd'
^I...e/pack/packer/start/winshift.nvim/lua/winshift/utils.lua:304: in function <...e/pack/packer/start/winshift.nvim/lua/winshift/utils.lua:286>
^I[C]: in function 'nvim_win_call'
^I...e/pack/packer/start/winshift.nvim/lua/winshift/utils.lua:286: in function 'set_local'
^I...ite/pack/packer/start/winshift.nvim/lua/winshift/lib.lua:377: in function 'window_picker'
^I...ite/pack/packer/start/winshift.nvim/lua/winshift/lib.lua:583: in function <...ite/pack/packer/start/winshift.nvim/lua/winshift/lib.lua:582>
^I[C]: in function 'pcall'
^I...ite/pack/packer/start/winshift.nvim/lua/winshift/lib.lua:582: in function 'start_swap_mode'
^I...im/site/pack/packer/start/winshift.nvim/lua/winshift.lua:48: in function 'cmd_winshift'
^I[string ":lua"]:1: in main chunk

Took a look at


in set_local function.

Changed to:

print(vim.inspect(cmd))
vim.cmd(cmd)

Got this:

"setl nowrap"
"setl nocursorline"
"setl colorcolumn="
"setl nocursorcolumn"
"setl statusline=%=A%="
"exe 'setl winhl=' . (&winhl == \"\" ? \"\" : &winhl . \",\") . 'StatusLine:WinShiftWindowPicker,StatusLineNC:WinShiftWindowPicker'"
"setl statusline=%=B%="
"exe 'setl winhl=' . (&winhl == \"\" ? \"\" : &winhl . \",\") . 'StatusLine:WinShiftWindowPicker,StatusLineNC:WinShiftWindowPicker'"
"setl statusline=%<%#lualine_c_inactive# main.go %#lualine_c_inactive#%=%#lualine_c_inactive#   1:1  "
"setl wrap"
<error message>

Problem is here:

"setl statusline=%<%#lualine_c_inactive# main.go %#lualine_c_inactive#%=%#lualine_c_inactive#   1:1  "

Changed code on line 300 from

{ option = option, value = tostring(value):gsub("'", "''") }

To

{ option = option, value = tostring(value):gsub("'", "''"):gsub(" ", "\\ ") }

Solution is to escape spaces or quote option's value setl statusline="..."

That was a quickfix from my side. I don't even know if it's the right fix or if it even WinShift's fault or lualine's. Could you please take a look?

Thanks for doing the debugging. Should be fixed in the latest commit, but let me know if you have any more problems.

The previous implementation of the set_local() function was a workaround for a bug upstream. But that bug has been fixed since 0.7.0.

I'm actually getting a new error now:

...e/pack/packer/start/winshift.nvim/lua/winshift/utils.lua:291: Error executing lua: vim/_meta.lua:0: E474: Invalid argument
stack traceback:
^I[C]: in function 'nvim_set_option_value'
^Ivim/_meta.lua: in function '_set'
^Ivim/_meta.lua: in function '__newindex'
^I...e/pack/packer/start/winshift.nvim/lua/winshift/utils.lua:321: in function <...e/pack/packer/start/winshift.nvim/lua/winshift/utils.lua:291>
^I[C]: in function 'nvim_win_call'
^I...e/pack/packer/start/winshift.nvim/lua/winshift/utils.lua:291: in function 'set_local'
^I...ite/pack/packer/start/winshift.nvim/lua/winshift/lib.lua:356: in function 'window_picker'
^I...ite/pack/packer/start/winshift.nvim/lua/winshift/lib.lua:586: in function <...ite/pack/packer/start/winshift.nvim/lua/winshift/lib.lua:585>
^I[C]: in function 'pcall'
^I...ite/pack/packer/start/winshift.nvim/lua/winshift/lib.lua:585: in function 'start_swap_mode'
^I...im/site/pack/packer/start/winshift.nvim/lua/winshift.lua:48: in function 'cmd_winshift'
^I[string ":lua"]:1: in main chunk

@stratumforce There was a bug in the previous fix. Sorry about that.

Works now! Thank you for this great plugin!