如何使用bufdo执行替换命令,批量为缓冲区添加修改后的文件名?
解决Vim批量在缓冲区末尾插入修改后文件名的问题
你的问题出在:bufdo normal命令里的<C-R>=不会被Vim解析为表达式求值,而是直接作为普通字符输出。以下是两种更直接的解决方案:
方法1:结合execute与normal
用execute先计算出表达式结果,再传递给normal执行:
:bufdo execute "normal Go" . substitute(expand("%:t"), "txt", "csv", "")
expand("%:t")获取当前缓冲区的文件名(不带路径,你之前的%t是%:t的笔误)substitute(...)将文件名的txt扩展名替换为csvexecute把"Go"(跳转到行尾并插入新行)和替换后的文件名拼接,让normal执行完整的插入动作
方法2:用put命令更简洁
$put可以直接在缓冲区末尾插入内容,配合表达式求值更高效:
:bufdo $put =substitute(expand("%:t"), "txt", "csv", "")
$定位到缓冲区最后一行=...表示插入表达式的计算结果,省去了切换到插入模式的步骤
扩展:添加包裹文本
如果需要给文件名加上自定义包裹(比如--- filename.csv ---),只需修改表达式部分:
:bufdo $put ='--- ' . substitute(expand("%:t"), "txt", "csv", "") . ' ---'
内容的提问来源于stack exchange,提问作者Audiochemie
相关产品推荐
相关产品推荐

