-6

背景场景:我在调试一个 VimScript 时,有些代码没有执行。原因是 unmap 引发了一个错误,并且 VimScript 在这个错误上退出。因为在代码周围放置了一个空的 try-catch,所以问题所在并不是很明显。最终定位到问题后,我开始觉得这个默认行为可能不是很直观。

这是一些简单的代码来说明 vim 在删除不存在的映射时报告错误,实验性的。它会在最后一行失败,说“E31:没有这样的映射”。

map <F10> :echo 'hello'
unmap <F10>
unmap <F10>

不幸的是,我找不到任何关于这种行为的文档。有人能指出我在哪里可以对删除不存在的映射进行一些解释吗?这种设计背后的原因是什么?就个人而言,我认为删除不存在的映射是一种正常的陈述,并照常继续。

编辑:这个问题可能有一些误解。我不是在问如何抑制错误。我想知道为什么 vim 认为删除一个不存在的映射是一个错误。有这么严重吗?

正如答案和评论中所指出的,当它可以执行所要求的操作时引发一个错误是 unix 哲学。我完全同意它,但在 shell 中,脚本默认会继续出错,因此不应应用相同的推理。

PS:按照建议,此问题已移至vim-dev

4

3 回答 3

5

它失败是因为do_map为未知映射返回 2,并且此代码在这种情况下会引发错误。不是很有帮助,我猜。Annotate 说,这段代码与 mercurial 存储库 (7.0001) 中的第一个 vim 版本相比没有变化。

可能有不同的答案:我可以猜到三个:

  1. vi 兼容性:vi确实抛出,vim 也应该这样做
  2. 这是正确的做法:如果命令没有按照要求执行,则应该报告失败
  3. 它提供了更多选项:如果必须取消现有:try映射的映射,则可以使用..捕获错误:catch(或保持原样向用户指示错误),如果不是,则始终存在silent!. EAFP原则专家和使用小型 vim 的用户的论据:在 VimL 中使用maparg()来检查是否存在更为常见,但它需要+eval(如果我没记错的话也这样做:定义此命令:try的整个有意义的文件内容被保护)。ex_eval.c#if defined(FEAT_EVAL) || defined(PROTO)

但是 Stackoverflow 不是问这些问题的正确地方。对于这样的旧代码,只有 Bram 可能知道答案,因此应该在vim-dev上提出问题。如果我是他,我会问一个解释为什么你需要答案。

于 2013-07-12T19:06:23.490 回答
3

您可以通过前置来抑制任何错误:silent!,即

:silent! unmap <F10>

还有其他方法(例如,有条件地检查是否maparg('<F10>', 'n')为空),但这是执行命令并忽略任何错误的规范方法。

于 2013-07-12T15:48:58.500 回答
0

看起来您可以编辑存储映射的文件,并在必要时手动删除它。这是一个包含更多信息的链接:

删除键盘映射

于 2013-07-12T15:45:23.657 回答