如何串联需用户输入的Vim命令?附Go插件实操示例
解决Vim中合并交互式命令与后续命令的映射问题
我明白你遇到的问题了——直接用<bar>连接:GoRename和:GoBuildTags是行不通的,因为:GoRename是交互式命令,它会等待你输入新名称,这时候Vim会把<bar>后面的:GoBuildTags当成你输入的重命名内容,而不是执行完重命名后再运行的命令。
下面给你两种可行的解决方案:
方案一:自定义函数(可读性更高)
把两个操作封装成一个Vim函数,再映射快捷键:
nnoremap <leader>rr :call RenameAndBuild()<CR> function! RenameAndBuild() " 弹出输入框让用户输入新名称 let new_name = input('Enter the new name: ') " 执行GoRename命令,传入用户输入的名称 execute 'GoRename ' . new_name " 执行GoBuildTags命令 execute 'GoBuildTags ''''' endfunction
这个方案逻辑清晰,后续如果要调整操作,直接修改函数即可。
方案二:单行表达式映射(更简洁)
如果不想写函数,可以用命令行表达式直接拼接:
nnoremap <leader>rr :let new_name=input('New name: ')<CR>:GoRename <C-R>=new_name<CR><CR>:GoBuildTags ''<CR>
这里的关键部分是<C-R>=new_name<CR>——它会把之前用input()获取的变量内容插入到:GoRename的命令行中,然后第一个<CR>执行重命名,第二个<CR>执行后续的:GoBuildTags。
为什么原来的写法失效?
Vim的<bar>(|)是用来连接非交互式命令的,当遇到需要用户输入的命令时,Vim会暂停等待输入,这时候<bar>和后面的内容会被当作当前命令的输入参数,而不是下一个要执行的命令,所以你的原映射会把:GoBuildTags ''当成重命名的目标名称,自然达不到预期效果。
内容的提问来源于stack exchange,提问作者err0r500
相关产品推荐
相关产品推荐

