【问题标题】:How to prevent saving files with certain names in Vim?如何防止在 Vim 中保存具有特定名称的文件?
【发布时间】:2011-06-02 05:51:48
【问题描述】:

我的输入速度非常快,有时会意外保存一个文件名包含一个 ;:。 (有时在我输入 :wq 命令时会出现拼写错误。)

有没有办法编写一个宏来拒绝保存匹配某些名称的文件?

【问题讨论】:

  • 我猜你可以使用带有BufWritePre 的自动命令来警告你而不是写入以;* 开头的文件。但是我现在很困,每次醒来都会试一试……如果到那时还没有回答的话。

标签: vim autocmd


【解决方案1】:

一个简单而有效的解决方案是定义一个自动命令 匹配可能输入错误的文件名,发出警告和 终止保存:

:autocmd BufWritePre [:;]* throw 'Forbidden file name: ' . expand('<afile>')

注意:throw 命令是使 Vim 停止写入所必需的 缓冲区的内容。

为了避免因为未捕获而得到E605 错误 异常,可以使用:echoerr 命令运行发出错误 在try 块中—:echoerr 将其错误消息作为异常引发 当从 try 构造内部调用时(参见 :help :echoerr)。

:autocmd BufWritePre [:;]*
\   try | echoerr 'Forbidden file name: ' . expand('<afile>') | endtry

如果需要保存名称与模式匹配的文件 在上述自动命令中使用,可以在前面添加一个写入命令 使用:noautocmd 或相应地设置eventignore 选项(请参阅 :help :noautocmd:help eventignore 了解详情),例如:

:noa w :ok.txt

【讨论】:

  • 这很棒(而且我有一个非常相似的预保存功能),但是在 BufWritePre 期间是否有更微妙的方法来防止保存?以这种方式抛出错误会导致E605: Exception not caught。如果可以回显一条消息而不是丑陋的错误消息,那就太好了。
  • @Prince:不幸的是,据我所知,除了抛出异常之外,没有其他方法可以终止触发autocmd 事件的操作。但是,可以通过将throw 包装在try-catch 中来消除E605 错误——答案已更新。
  • @ib:哇,7 票赞成!我想我应该睡一会儿,自己写答案;)无论如何,非常好的解释。 +1
  • @ib:这是response from Bram:«这确实看起来不对。»。所以停止在:catch 中使用echoe
  • @ib: 如果您的插件功能可以通过使用sourcenormal、函数、命令或doautocmd 访问的映射来实现,则可以将其放入@987654347 @ 块,其中echoerr 是一个例外。所以没有“安全的一面”:你不知道用户在哪里以及为什么会在 :try 块内调用你的插件,因此应该完全避免。另一方面,如果echoerr 绝对是一个例外(就像这里),它是“安全的”:它的行为不再由你无法控制的上下文决定。但我更喜欢在这种情况下使用throw:它描述了所做的工作。
猜你喜欢
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多