From 8f5d690d756733ab1a8f607de7dba80702476ba7 Mon Sep 17 00:00:00 2001 From: Jelle Spreeuwenberg Date: Wed, 9 Sep 2026 17:31:25 +0200 Subject: [PATCH] feat: improve wrapped-line editing and completion cancellation Use word-boundary wrapping and count-aware displayed-line movement in ordinary buffers. Escape cancels Blink completion before falling back. Preserve the existing ergonomics check; it was not rerun during Git cleanup. --- .../neovim/lua-config/lua/keymaps.lua | 6 ++++++ .../neovim/lua-config/lua/options.lua | 1 + .../lua-config/lua/plugins/completion.lua | 1 + tests/neovim-ergonomics.lua | 18 ++++++++++++++++++ 4 files changed, 26 insertions(+) create mode 100644 tests/neovim-ergonomics.lua diff --git a/modules/capabilities/neovim/lua-config/lua/keymaps.lua b/modules/capabilities/neovim/lua-config/lua/keymaps.lua index 0d01565..e4ddbe0 100644 --- a/modules/capabilities/neovim/lua-config/lua/keymaps.lua +++ b/modules/capabilities/neovim/lua-config/lua/keymaps.lua @@ -7,6 +7,12 @@ end vim.keymap.del("x", "gra") vim.keymap.del({ "i", "s" }, "") +for _, key in ipairs({ "j", "k" }) do + vim.keymap.set({ "n", "x" }, key, function() + return vim.bo.buftype == "" and vim.v.count == 0 and "g" .. key or key + end, { expr = true, desc = "Move by displayed line, or logical line with a count" }) +end + vim.keymap.set("n", "", "", { desc = "Focus left window" }) vim.keymap.set("n", "", "", { desc = "Focus lower window" }) vim.keymap.set("n", "", "", { desc = "Focus upper window" }) diff --git a/modules/capabilities/neovim/lua-config/lua/options.lua b/modules/capabilities/neovim/lua-config/lua/options.lua index 08ad92c..b375dcd 100644 --- a/modules/capabilities/neovim/lua-config/lua/options.lua +++ b/modules/capabilities/neovim/lua-config/lua/options.lua @@ -17,6 +17,7 @@ vim.o.timeoutlen = 300 vim.o.updatetime = 250 vim.o.breakindent = true +vim.o.linebreak = true vim.o.undofile = true vim.o.ignorecase = true vim.o.smartcase = true diff --git a/modules/capabilities/neovim/lua-config/lua/plugins/completion.lua b/modules/capabilities/neovim/lua-config/lua/plugins/completion.lua index cc71a2e..c40bf8d 100644 --- a/modules/capabilities/neovim/lua-config/lua/plugins/completion.lua +++ b/modules/capabilities/neovim/lua-config/lua/plugins/completion.lua @@ -15,6 +15,7 @@ require("lz.n").load({ after = function() require("blink.cmp").setup({ keymap = { + [""] = { "cancel", "fallback" }, [""] = { "select_next", "fallback" }, [""] = { "select_prev", "fallback" }, [""] = { "select_and_accept", "fallback" }, diff --git a/tests/neovim-ergonomics.lua b/tests/neovim-ergonomics.lua new file mode 100644 index 0000000..aa4b0d9 --- /dev/null +++ b/tests/neovim-ergonomics.lua @@ -0,0 +1,18 @@ +-- Configured startup: nvim --headless -i NONE '+lua local ok,e=pcall(dofile,"tests/neovim-ergonomics.lua"); if not ok then print(e); vim.cmd.cquit() end' '+qa!' +assert(vim.o.linebreak) +vim.api.nvim_buf_set_lines(0, 0, -1, false, { string.rep("word ", 80), "two", "three", "four" }) +vim.cmd("normal gg0j") +assert(vim.fn.line(".") == 1 and vim.fn.col(".") > 1) +vim.cmd("normal k") +assert(vim.fn.line(".") == 1 and vim.fn.col(".") == 1) +vim.cmd("normal 3j") +assert(vim.fn.line(".") == 4) +vim.cmd("normal 3k") +assert(vim.fn.line(".") == 1) +assert(vim.fn.maparg("j", "o") == "") +vim.bo.buftype = "nofile" +vim.cmd("normal j") +assert(vim.fn.line(".") == 2) +vim.cmd("doautocmd InsertEnter") +assert(vim.deep_equal(require("blink.cmp.config").keymap[""], { "cancel", "fallback" })) +print("Neovim motion and completion configuration smoke check passed")