Vim移动文件时触发E93: More than one match错误的原因排查
问题根源与修复方案
为什么会触发E93错误?
路径未转义导致解析错误
你执行execute 'bwipeout '.expand(s:oldFileName)时,直接拼接了原始文件路径。如果路径里包含空格、#、%这类特殊字符,Vim会把它们当成命令参数的分隔符或特殊标记,拆分你的路径,导致bwipeout实际接收到的不是完整的文件名,而是一段片段。这时候很容易匹配到多个包含该片段的缓冲区,触发E93错误。文件名匹配的天然不确定性
即便路径没有特殊字符,用文件名做bwipeout的匹配条件也不稳——比如存在不同目录下的同名文件,或者Dirvish创建的目录缓冲区名称和旧文件名有重叠,都可能让Vim找到多个匹配项。
靠谱的修复方法
方法一:给路径加转义
把第11行的代码改成对旧文件路径做转义处理,确保Vim能识别完整路径:
execute 'bwipeout '.fnameescape(s:oldFileName)
fnameescape会自动处理路径里的特殊字符,让命令参数保持完整。
方法二:用缓冲区编号精确操作
文件名可能重复,但缓冲区编号是唯一的。修改函数,先记录原文件的缓冲区编号,再用编号关闭缓冲区:
command! -nargs=0 -bar MoveFile call s:functionMoveFile() function s:functionMoveFile() abort call dirvish#open("edit", 0) let s:oldBufNr = bufnr('%') " 新增:记录原缓冲区编号 let s:oldFileName = expand("%:p") call inputsave() let s:newFileName = input("Move file here: ",expand(s:oldFileName),"file") call inputrestore() if s:newFileName != '' && s:newFileName != s:oldFileName execute 'sav '.fnameescape(s:newFileName) let s:newFileDirectory = expand("%:p:h") call delete(s:oldFileName) execute 'Dirvish '.expand(s:newFileDirectory) execute 'bwipeout '.s:oldBufNr " 改为用编号关闭缓冲区 endif endfunction
这种方法从根源上避免了匹配冲突,是最稳妥的方案。
内容的提问来源于stack exchange,提问作者iMagUdspEllr
相关产品推荐
相关产品推荐

