Vim配置问题:解决文件名替换时无法同时结合\U大写转换与expand函数的问题
解决Vim中.hpp模板替换时无法同时实现大写转换与文件名展开的问题
我之前也碰到过类似的Vim替换小坑,你的配置思路完全没问题,只是在处理大写转换和表达式展开的结合时,踩了Vim语法的特殊规则。先把你的配置贴出来方便参考:
function! HPPFile() silent! 0r $HOME/.vim/templates/skeleton.hpp %s/FileName/\=expand("%:t:r")/g %s/FILENAME/\U\=expand("%:t:r")\E/g endfunction autocmd BufNewFile *.hpp call HPPFile()
问题出在第二条替换语句里:\U是Vim替换模式中的特殊标记,但当你用\=引入表达式(比如expand())时,表达式上下文和替换模式的特殊序列不能直接这样混用,Vim会无法正确解析\U的位置。
给你两种简单有效的解决办法:
方法一:用Vim内置函数直接转换大写
这是最简洁的方案,直接在表达式里用toupper()函数把expand()得到的文件名转成大写,完全不需要依赖\U标记:
%s/FILENAME/\=toupper(expand("%:t:r"))/g
方法二:先把文件名存到变量再使用\U
如果你更习惯用\U的写法,可以先把展开后的文件名存到局部变量里,再在替换中引用变量,这样\U就能正常工作了:
function! HPPFile() silent! 0r $HOME/.vim/templates/skeleton.hpp let l:base_name = expand("%:t:r") %s/FileName/\=l:base_name/g %s/FILENAME/\U\=l:base_name\E/g endfunction
两种方法都能完美解决你的问题,个人更推荐第一种,代码更紧凑直观。
内容的提问来源于stack exchange,提问作者hugogogo
相关产品推荐
相关产品推荐

