vim删除不存在的映射

vim删除不存在的映射,vim,mapping,Vim,Mapping,背景场景:当我调试一个VimScript时,一些代码没有执行。原因是取消映射会引发一个错误,并且VimScript会在该错误时退出。因为代码中有一个空的try-catch,所以问题不太明显。在最终找到问题之后,我开始认为这种默认行为可能不是很直观 这是一些简单的代码,用于说明vim在实验上报告删除不存在映射的错误。它会在最后一行失败,比如说“E31:没有这样的映射” map:echo'hello' 取消映射 取消映射 不幸的是,我找不到任何关于这种行为的文件。有人能告诉我在哪里可以删除不存在的

背景场景:当我调试一个VimScript时,一些代码没有执行。原因是取消映射会引发一个错误,并且VimScript会在该错误时退出。因为代码中有一个空的try-catch,所以问题不太明显。在最终找到问题之后,我开始认为这种默认行为可能不是很直观

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

map:echo'hello'
取消映射
取消映射
不幸的是,我找不到任何关于这种行为的文件。有人能告诉我在哪里可以删除不存在的映射吗?这种设计背后的理性是什么?就我个人而言,我会将删除不存在的映射视为一个正常的语句,并照常继续

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

正如回答和评论中指出的那样,unix的原则是在能够执行所要求的操作时只出现一个错误。我完全同意这一点,但在shell中,默认情况下脚本会继续出错,因此不应该应用相同的推理


PS:根据建议,此问题已移至。

看起来您可以编辑存储映射的文件,并在必要时手动删除它。这里有一个链接,其中包含一些详细信息:


您可以通过预加
:silent来抑制任何错误,即

:silent! unmap <F10>
:安静!取消映射

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

它失败,因为
do\u map
对于未知映射返回2,对于这种情况则抛出错误。我想不是很有帮助。Annotate说,这段代码与mercurial存储库(7.0001)中发现的第一个vim版本相比没有变化

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

  • vi兼容性:
    vi
    确实抛出了,vim也应该抛出
  • 这样做是正确的:若命令并没有按要求执行,它应该报告失败
  • 它提供了更多选项:如果必须取消映射现有映射,则可以使用
    :try
    捕获错误。
    :catch
    (或按原样将错误指示给用户),如果没有,则始终保持
    静默。不过,在VimL中,使用
    maparg()
    检查存在性更为常见,但它需要
    +eval
    (如果我没有弄错
    :试一下
    也会这样做:定义此命令的整个有意义的
    ex_eval.c
    文件内容都由
    #if defined(FEAT_eval)| defined(PROTO)
    保护)

  • 但是Stackoverflow不是问这些问题的合适地方。对于这样的旧代码,只有Bram可能知道答案,因此应该继续问这个问题。如果我是他,我会问你为什么需要答案。

    查看
    :帮助E31
    ,了解文档reference@FDinoff它只记录何时出现此错误,而不记录为什么出现此错误im抛出此错误。@AlbertNetymk这就是为什么我认为此问题不适合Stackoverflow的原因。一个可能的原因是,大多数unix工具如果不能按照您的要求执行操作,就会出现错误。例如,如果您执行
    rm somefile\u而该文件不存在
    ,则会出现错误,因为它无法执行命令。(即没有此类文件或目录).同样的逻辑也适用于unmap@FDinoffshell的默认行为是在出错时继续,因此shell中的错误不像VimScript中的错误那么严重。在VimScript中,当前脚本将在出错时中止。这是一个很好的技巧。我抑制错误的想法是将其包装在一个try catch中。您的错误要优雅得多。但是,这不是t我最初想问的问题。有关问题的澄清,请参见编辑的问题。@AlbertNetymk One
    try..catch
    是一种更好的方法,除非您完全确定vim可能会向您显示的唯一错误是“无此类映射”。注:One
    try..catch/\C\V\^vim(取消映射):E31://
    ,没有模式就不能捕获。感谢您的详细解释。已损坏。Re:1.我通过
    无可兼容的方式获得此行为。Re:2.它已达到要求的最终结果,映射现在不存在。Re:3.肯定会有
    静默!
    ,但我质疑的是默认行为。它是不是很直观。PS:我为什么问这个问题的解释被添加到这个问题中。按照建议,它被移动到vim-dev。谢谢。@AlbertNetymk链接已修复(推送相关更改集,实际上没有更改链接)@AlbertNetymk Re1:如果你认为所有vi兼容性都以设置
    不兼容
    结束,那你就大错特错了。Re2:你要求做一些工作:取消映射,你没有问最终结果。工作没有完成。Re3:有
    :静默
    来抑制错误。没有
    :unsilent
    来让它抛出(现有的
    :非静默的
    只会取消
    静默的效果
    )。我的意思是,既然我们没有可兼容的
    ,与vi兼容不应该是一个令人信服的论据。Re2:足够公平,但是作业是否(删除一些映射)完成与否并不重要。Re3:删除不存在的映射时会出现什么错误?@AlbertNetymk Re1:如果vi就是这样删除此行为的,那么您需要比您更具说服力。任何去掉兼容性的选项都会引入复杂性,这是一个参数。Vim已经有太多的选项。Re3:这可能是我的问题指示您在错误的环境中操作:例如,您创建了缓冲区本地映射、交换缓冲区和
    
    :silent! unmap <F10>