能否实现Vim映射:用寄存器0替换任意符号包裹内容?
Vim 实现可变包裹符号的内容替换映射
完全可行,以下是具体实现方案,满足你所有需求:
实现步骤
1. 暂存选中内容到独立寄存器
先给可视模式添加 Yank 映射,把选中内容存到自定义寄存器z(选一个未被默认占用的寄存器即可),这样不会改动寄存器0:
vnoremap <silent> y "zy
如果不想修改默认的y键,可以改成其他组合,比如:
vnoremap <silent> <leader>y "zy
之后用v选中文本,按对应的按键(y或<leader>y)暂存内容。
2. 定义可变符号的替换映射与函数
在配置文件中添加以下映射和函数,实现按<leader>r加符号触发替换:
nnoremap <leader>r :call ReplaceWrappedContent(v:char)<CR> function! ReplaceWrappedContent(char) abort " 执行 ci{符号} 操作,删除包裹内容并进入插入模式 execute "normal! ci" . a:char " 粘贴暂存的内容,退出插入模式 execute "normal! \"zp\<Esc>" endfunction
3. 使用方式
- 用
v模式选中文本,按暂存按键(比如y)保存内容到z寄存器 - 移动到目标包裹符号(如
"、()所在位置,按下<leader>r",即可替换双引号内的内容为之前选中的文本 - 按下
<leader>r(则替换括号内的内容 - 操作完成后,按
.键可以重复最近一次的替换操作(比如之前用的是<leader>r",.就会再次执行双引号内的内容替换)
关键说明
- 自定义寄存器
z专门用来暂存替换内容,完全不会影响寄存器0的原有内容 - 函数通过
v:char获取后续输入的符号,动态执行ci{符号}操作,适配所有Vim支持的配对符号 - 整个操作符合Vim的重复机制,
.可以正确重复之前的替换动作
内容的提问来源于stack exchange,提问作者Luponius
相关产品推荐
相关产品推荐

