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

Vim移动文件时触发E93: More than one match错误的原因排查

问题根源与修复方案

为什么会触发E93错误?

  1. 路径未转义导致解析错误
    你执行execute 'bwipeout '.expand(s:oldFileName)时,直接拼接了原始文件路径。如果路径里包含空格、#、%这类特殊字符,Vim会把它们当成命令参数的分隔符或特殊标记,拆分你的路径,导致bwipeout实际接收到的不是完整的文件名,而是一段片段。这时候很容易匹配到多个包含该片段的缓冲区,触发E93错误。

  2. 文件名匹配的天然不确定性
    即便路径没有特殊字符,用文件名做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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:45:24