背景场景:当我调试一个VimScript时,某些代码没有被执行。原因是unmap引发了一个错误,VimScript退出此错误。因为代码周围有一个空的try-catch,所以问题不是很明显。在最终找到问题后,我开始认为这种默认行为可能不是很直观。
这是一些简单的代码,用于说明vim报告在实验上删除不存在的映射时出错。它会在最后一行失败,说“E31:没有这样的映射”。
map <F10> :echo 'hello'
unmap <F10>
unmap <F10>
不幸的是,我找不到任何有关此行为的文档。有人能指出我在哪里可以解释删除不存在的映射吗?这个设计背后的理性是什么?就个人而言,我会认为删除不存在的映射是一个正常的声明,并照常继续。
编辑:这个问题可能存在一些误解。我不是问如何抑制错误。我想知道为什么vim认为删除一个不存在的映射是一个错误。它是如此严重吗?正如答案和评论中指出的那样,当它可以执行操作时,引发一个错误是unix哲学。我完全同意它,但在shell中,脚本默认继续出错,因此不应该应用相同的推理。
PS:根据建议,此问题已移至vim-dev。
答案 0 :(得分:5)
失败是因为do_map
返回2表示未知映射而this code因此情况引发错误。我想,不是很有帮助。 Annotate说这个代码没有改变在mercurial存储库(7.0001)中找到的第一个vim版本。
可能有不同的答案:我可以猜到三个:
vi
确实扔了,所以vim应该:try
.. :catch
捕获错误(或保持原样指示错误到用户),如果不是,则总是silent!
。虽然EAFP使用maparg()
来检查是否存在,但使用+eval
的VimL中的vim-dev原则和用户的参数更为常见,但它需要:try
(如果我没有误认为ex_eval.c
这样做:定义此命令的整个有意义的#if defined(FEAT_EVAL) || defined(PROTO)
文件内容由{{1}}保护。但Stackoverflow不适合提出这样的问题。对于这样的旧代码,只有Bram可以知道答案,因此问题应该在{{3}}上提出。如果我是他,我会问一个解释为什么你需要答案。
答案 1 :(得分:2)
您可以通过添加:silent!
,即
:silent! unmap <F10>
还有其他方法(例如,条件检查maparg('<F10>', 'n')
是否为空),但这是执行命令并忽略任何错误的规范方法。
答案 2 :(得分:0)
看起来您可以编辑存储映射的文件,并在必要时手动删除它。这是一个包含更多信息的链接: