vim删除不存在的映射

时间:2013-07-12 15:40:02

标签: vim mapping

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

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

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

不幸的是,我找不到任何有关此行为的文档。有人能指出我在哪里可以解释删除不存在的映射吗?这个设计背后的理性是什么?就个人而言,我会认为删除不存在的映射是一个正常的声明,并照常继续。

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

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

PS:根据建议,此问题已移至vim-dev

3 个答案:

答案 0 :(得分:5)

失败是因为do_map返回2表示未知映射而this code因此情况引发错误。我想,不是很有帮助。 Annotate说这个代码没有改变在mercurial存储库(7.0001)中找到的第一个vim版本。

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

  1. vi兼容性:vi确实扔了,所以vim应该
  2. 这是正确的做法:如果命令没有按照要求执行它应该报告失败
  3. 它提供了更多选项:如果取消映射现有映射是必不可少的,您可以使用:try .. :catch捕获错误(或保持原样指示错误到用户),如果不是,则总是silent!。虽然EAFP使用maparg()来检查是否存在,但使用+eval的VimL中的vim-dev原则和用户的参数更为常见,但它需要:try(如果我没有误认为ex_eval.c这样做:定义此命令的整个有意义的#if defined(FEAT_EVAL) || defined(PROTO)文件内容由{{1}}保护。
  4. 但Stackoverflow不适合提出这样的问题。对于这样的旧代码,只有Bram可以知道答案,因此问题应该在{{3}}上提出。如果我是他,我会问一个解释为什么你需要答案。

答案 1 :(得分:2)

您可以通过添加:silent!,即

来抑制任何错误
:silent! unmap <F10>

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

答案 2 :(得分:0)

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

Removing a keymap