You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Neovim中用Lua实现带条件的可视化块移动按键映射问题

可视化块上下移动的Vimscript转Lua后报错问题

原Vimscript实现(.vimrc)

vnoremap ^[[1;5A  :m '<-2<CR>gv=gv
vnoremap ^[[1;5B  :m '>+1<CR>gv=gv

初始Lua转换代码(init.lua)

-- Global Variable 
local opts = { noremap = true, silent = true }
-- Key Mappings
vim.api.nvim_set_keymap('v', '<C-Up>', ':m \'<-2<CR>gv=gv', opts)
vim.api.nvim_set_keymap('v', '<C-Down>', ':m \'>+1<CR>gv=gv', opts)

此版本存在问题:移动到文件首尾时会触发E16: Invalid range error,同时可视化选区被取消。

带条件判断的Vimscript修复版本

为解决上述问题,在Vimscript中添加条件判断:

vnoremap <expr> ^[[1;5A (line("'<") == 1 ? "" : ":m '<-2<CR>gv=gv")
vnoremap <expr> ^[[1;5B (line("'>") == line("$") ? "" : ":m '>+1<CR>gv=gv")

尝试转换的带条件Lua代码

将上述条件逻辑转换为Lua后,代码如下:

-- Global Variable 
local opts = { noremap = true, silent = true }

-- Custom function to move visual block up
function _G.move_visual_block_up()
  if vim.fn.line("'<") > 1 then
    vim.cmd(":m '<-2<CR>gv=gv")
  end
end

-- Custom function to move visual block down
function _G.move_visual_block_down()
  if vim.fn.line("'>") < vim.fn.line("$") then
    vim.cmd(":m '>+1<CR>gv=gv")
  end
end

-- Key Mappings
vim.api.nvim_set_keymap('v', '<C-Up>',   '<Cmd>lua _G.move_visual_block_up()<CR>', opts)
vim.api.nvim_set_keymap('v', '<C-Down>', '<Cmd>lua _G.move_visual_block_down()<CR>', opts)

新的报错情况

转换后出现新问题:

  • 按下Ctrl+Up无任何效果
  • 按下Ctrl+Down触发错误:
E5108: Error executing lua vim/_editor.lua:0: nvim_exec2(): Vim(move):E20: Mark not set
stack traceback:
        [C]: in function 'nvim_exec2'
        vim/_editor.lua: in function 'cmd'
        /etc/nvim/init.lua:206: in function 'move_visual_block_down'
        [string ":lua"]:1: in main chunk

不清楚错误中提到的「标记未设置」具体指什么,查找相关资料也未找到有效解决办法。


内容的提问来源于stack exchange,提问作者N00B_141

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:04:51