背景场景:当我调试一个VimScript时,某些代码不会被执行.原因是unmap引发了一个错误,VimScript退出此错误.因为代码周围有一个空的try-catch,所以问题不是很明显.在最终找到问题之后,我开始认为这个默认行为可能不是很直观.
这是一些简单的代码,用于说明vim报告在实验上删除不存在的映射时出错.它会在最后一行失败,说是"E31:没有这样的映射".
map <F10> :echo 'hello'
unmap <F10>
unmap <F10>
Run Code Online (Sandbox Code Playgroud)
不幸的是,我找不到关于这种行为的任何文档.有人能指出我在哪里可以解释删除不存在的映射吗?这个设计背后的理性是什么?就个人而言,我会认为删除不存在的映射是一个正常的声明,并像往常一样继续.
编辑:这个问题可能存在一些误解.我不是问如何抑制错误.我想知道为什么vim认为删除一个不存在的映射是一个错误.这么严重吗?
正如答案和评论中所指出的那样,当它可以执行操作时,引发一个错误是unix哲学.我完全同意它,但在shell中,脚本默认继续出错,因此不应该应用相同的推理.
PS:正如推荐的那样,这个问题已经转移到了vim-dev.
它失败,因为do_map返回2表示未知映射,此代码在这种情况下抛出错误.我想,不是很有帮助.Annotate说这个代码没有改变在mercurial存储库(7.0001)中找到的第一个vim版本.
可能有不同的答案:我可以猜到三个:
vi确实扔了,所以vim应该这样做:try.. :catch(或保持原样向用户指示错误),如果不是总是存在错误silent!.EAFP原则的论点是使用微小vim的用户和用户:在VimL中使用maparg()检查是否存在更常见,但它需要+eval(如果我没有误会:try也这样做:ex_eval.c定义此命令的整个有意义的文件内容受到保护#if defined(FEAT_EVAL) || defined(PROTO)).但Stackoverflow不是提出这些问题的正确位置.对于这样的旧代码,只有Bram可以知道答案,因此应该在vim-dev上询问问题.如果我是他,我会问一个解释为什么你需要答案.