【发布时间】:2011-06-02 05:51:48
【问题描述】:
我的输入速度非常快,有时会意外保存一个文件名包含一个 ; 或 :。 (有时在我输入 :wq 命令时会出现拼写错误。)
有没有办法编写一个宏来拒绝保存匹配某些名称的文件?
【问题讨论】:
-
我猜你可以使用带有
BufWritePre的自动命令来警告你而不是写入以;*开头的文件。但是我现在很困,每次醒来都会试一试……如果到那时还没有回答的话。
我的输入速度非常快,有时会意外保存一个文件名包含一个 ; 或 :。 (有时在我输入 :wq 命令时会出现拼写错误。)
有没有办法编写一个宏来拒绝保存匹配某些名称的文件?
【问题讨论】:
BufWritePre 的自动命令来警告你而不是写入以;* 开头的文件。但是我现在很困,每次醒来都会试一试……如果到那时还没有回答的话。
一个简单而有效的解决方案是定义一个自动命令 匹配可能输入错误的文件名,发出警告和 终止保存:
: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
【讨论】:
E605: Exception not caught。如果可以回显一条消息而不是丑陋的错误消息,那就太好了。
autocmd 事件的操作。但是,可以通过将throw 包装在try-catch 中来消除E605 错误——答案已更新。
:catch 中使用echoe。
source、normal、函数、命令或doautocmd 访问的映射来实现,则可以将其放入@987654347 @ 块,其中echoerr 是一个例外。所以没有“安全的一面”:你不知道用户在哪里以及为什么会在 :try 块内调用你的插件,因此应该完全避免。另一方面,如果echoerr 绝对是一个例外(就像这里),它是“安全的”:它的行为不再由你无法控制的上下文决定。但我更喜欢在这种情况下使用throw:它描述了所做的工作。