Vim跳转/变更列表覆盖问题:同内行内跳转的稳定实现方法
Vim光标历史跳转与交换括号宏问题解答
一、实现全光标位置历史跳转
Vim默认的跳转列表(jumplist)和变更列表(change list)会合并同一行内的连续操作记录,导致无法在同内行的多个操作点间跳转。要实现类似VSCode、Sublime的Alt-/Alt+全光标历史跳转效果,只需调整两个选项:
- 跳转列表优化:设置
set jumpoptions+=stack,此配置会让同一行内的每一次跳转都单独存入跳转列表,之后用<C-O>(回退)和<C-I>(前进)即可遍历所有光标位置,包括同内行的多次操作点。 - 变更列表优化:设置
set changelistoptions+=stack,让同一行内的多次修改都被记录到变更列表中,g;(回退修改点)和g,(前进修改点)就能在同一行的多个修改位置间切换。
将上述配置添加到~/.vimrc或init.vim中,即可持久生效。
二、交换任意两对括号的宏修复
你之前的宏依赖跳转列表(<C-O>)导致上下文出错,换用标记+文本操作的方式可以避免这个问题,以下是可靠的宏实现步骤:
- 标记第一对括号:光标定位到第一对括号的任意一个括号上,执行
mm标记起始位置,再用%跳转到配对括号,执行mM标记结束位置(m和M对应第一对括号的两个端点)。 - 录制交换宏:光标移到第二对括号的任意一个括号上,按下
qq开始录制宏,输入以下内容:mc " 标记当前括号位置为c % " 跳转到配对括号 mC " 标记配对括号位置为C `mv`Md " 选中第一对括号的所有内容(含括号)并剪切 `cP " 将剪切内容粘贴到第二对括号的起始位置 `cv`Cd " 选中第二对括号的原内容并剪切 `mP " 将原第二对内容粘贴到第一对括号的起始位置 :delmarks c C<CR> " 清理临时标记(可选) - 执行宏:按下
q结束录制,执行@q即可完成两对括号的交换。
此宏不依赖跳转列表,避免了上下文跳转的冲突问题,无论哪对括号作为初始标记,都能稳定执行。
内容的提问来源于stack exchange,提问作者Alexander Moiseev
相关产品推荐
相关产品推荐

