You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 12:37:46