fix(keymap): C-Space toggle fires across all terminal byte spellings
CI / cargo fmt --check (push) Successful in 25s
CI / cargo clippy (push) Successful in 1m5s
CI / cargo test (push) Successful in 1m12s

User reported Ctrl+Space didn't toggle list items. Three things
contributed:

1. **Terminal byte ambiguity.** Different terminals encode Ctrl+Space
   differently — GUI / kitty protocol sends `<C-Space>`, xterm and
   most legacy terms send NUL which Vim sees as `<C-@>` (or, in some
   Neovim builds, `<Nul>` in keymap.lhs). The previous keymap
   registered only `<C-Space>` + `<C-@>`. Added the `<Nul>` alias too
   (both Lua and VimL paths) so the binding fires regardless of what
   byte the user's terminal produces.

2. **Deprecated `vim.lsp.util.make_position_params`.** Neovim 0.12
   requires `position_encoding` explicitly. The old no-arg call now
   prints a deprecation warning, and in stricter setups returns nil
   — which made the command's `arguments` malformed and the
   `executeCommand` request silently fail. `position_params()` now
   pulls `offset_encoding` from the resolved client and passes both
   args, with a `pcall`-guarded fallback to the no-arg form for
   Neovim < 0.10.

3. **Deprecated `client.request(...)` dot-call.** Same Neovim 0.12
   change — `Client:request()` is the method form. Use the colon
   call now; both arities are preserved for back-compat.

Verified end-to-end: feeding all three of `<C-Space>` / `<C-@>` /
`<Nul>` via `nvim_feedkeys` toggles the checkbox; `:messages` no
longer carries the deprecation warnings. 381 tests still pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-12 01:28:23 +00:00
parent 047c9a3cf3
commit 9d86218b13
3 changed files with 49 additions and 23 deletions
+39 -22
View File
@@ -13,10 +13,6 @@ local function buf_uri(bufnr)
return vim.uri_from_bufnr(bufnr or 0)
end
local function position_params()
return vim.lsp.util.make_position_params()
end
local function find_client()
local fn = vim.lsp.get_clients or vim.lsp.get_active_clients
local clients = fn({ name = 'nuwiki', bufnr = 0 })
@@ -27,29 +23,49 @@ local function find_client()
return clients[1]
end
local function position_params(client)
-- Neovim 0.12+ requires `position_encoding` explicitly; older
-- versions accept the no-arg form.
local encoding = client and client.offset_encoding or 'utf-16'
local ok, params = pcall(vim.lsp.util.make_position_params, 0, encoding)
if ok then return params end
-- Fallback for Neovim < 0.10 where the second arg wasn't a thing.
return vim.lsp.util.make_position_params()
end
local function exec(command, arguments, on_result)
local client = find_client()
if not client then
vim.notify('nuwiki: language server not attached', vim.log.levels.ERROR)
return
end
client.request(
'workspace/executeCommand',
{ command = command, arguments = arguments or {} },
function(err, result)
if err then
vim.notify(
'nuwiki: ' .. command .. '' .. (err.message or vim.inspect(err)),
vim.log.levels.ERROR
)
return
end
if on_result then
on_result(result)
end
end,
vim.api.nvim_get_current_buf()
)
local handler = function(err, result)
if err then
vim.notify(
'nuwiki: ' .. command .. '' .. (err.message or vim.inspect(err)),
vim.log.levels.ERROR
)
return
end
if on_result then on_result(result) end
end
local bufnr = vim.api.nvim_get_current_buf()
local payload = { command = command, arguments = arguments or {} }
-- Neovim 0.12 deprecates `client.request(...)` in favour of the
-- method form `client:request(...)`. Prefer the method, fall back
-- on older Neovim where it isn't defined yet.
local req = client.request
if type(req) ~= 'function' then
return
end
if rawget(getmetatable(client) or {}, '__index') and client.request ~= nil then
-- Method-style works for both colon and dot calls on Neovim's
-- Client metatable, but pass `self` explicitly for the older
-- function-style signature compatibility.
client:request('workspace/executeCommand', payload, handler, bufnr)
else
client.request('workspace/executeCommand', payload, handler, bufnr)
end
end
local function open_uri(uri, tab)
@@ -71,7 +87,8 @@ local function open_uri(uri, tab)
end
local function pos_args()
return { vim.tbl_extend('force', { uri = buf_uri() }, position_params()) }
local client = find_client()
return { vim.tbl_extend('force', { uri = buf_uri() }, position_params(client)) }
end
local function uri_args()