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