Vim可视化行模式下灵活调用寄存器宏的映射实现需求
哈哈,这个需求我太有共鸣了!之前每次在可视化行模式下要跑宏,都得费劲切到命令行敲:<,'>norm @x,简直反人类。刚好可以用Vim的表达式映射完美解决,而且完全不用为每个寄存器单独写映射,灵活得很!
实现方案
直接把这段映射加到你的~/.vimrc(Neovim用户就是init.vim)里:
xnoremap <expr> @ '"<,'>norm @' . nr2char(getchar())
为啥这段代码能work?
我给你拆解一下每部分的作用:
xnoremap:限定这个映射只在**可视化行模式(Visual Line)**生效,而且用非递归映射(避免触发循环调用的坑)<expr>:告诉Vim这个映射的最终执行内容是动态计算出来的表达式,而不是固定命令'"<,'>norm @':这就是你平时手动输入的命令核心——<,'>代表当前选中的行范围,norm让Vim在普通模式下执行后续的宏调用. nr2char(getchar()):这是实现“灵活指定寄存器”的关键!getchar()会暂停等待你按下一个字符(比如你要调用的寄存器a、x或者默认寄存器"),nr2char()把这个字符的ASCII码转成实际字符,拼接到前面的命令后面,最终就生成了:<,'>norm @x这样的完整命令
怎么用?
操作超简单:
- 用
V进入可视化行模式,选中你要执行宏的行 - 按下
@,这时候Vim会等待你输入寄存器 - 按下你要调用的寄存器(比如
a),搞定!Vim会自动在选中的每一行执行寄存器a里的宏
小细节补充
- 如果中途反悔不想执行了,按
Ctrl-C取消输入就行,这时候getchar()会拿到^C的ASCII码,拼接出来的无效命令会被Vim直接忽略,不会搞出问题 - 这个映射完全不影响普通模式下
@的原有功能——普通模式下按@x还是照常执行寄存器x的宏,互不干扰
内容的提问来源于stack exchange,提问作者weilbith
相关产品推荐
相关产品推荐

