2011-04-04 93 views
2

我有一个函数可以对当前文件执行有效性检查(以符合我的雇主的编码标准)。我想在保存之前调用这个函数,即使用BufWritePre。但是,如果我的检查功能失败,我会防止保存文件。在BufWritePre期间防止文件保存

那么,是否有可能突破BufWritePre自动命令?

我意识到我可以通过重新映射:write命令来完成此操作,如图所示here,但是我想尽可能避免这种情况,因为它感觉有点不太巧妙。

在此先感谢您的建议。

+0

又见问题“[防止保存文件与Vim中的某些名称](http://stackoverflow.com/q/6210946/254635)“。 – 2012-07-29 04:11:24

回答

4

你可以“简单”强制错误:

:autocmd BufWritePre *.txt throw "you may not" 

如果您希望能够保存.txt文件再次

:autocmd! 
:source $MYVIMRC 
+0

这比我炮制的要简单得多。我猜测使用':w!'会强制通过这个错误? – intuited 2011-04-04 20:12:56

+0

不,不管怎么写'w!' – sehe 2011-04-04 20:33:18

+0

谢谢!这看起来很有希望。但是,“检测到错误”消息看起来相当丑陋......错误是否可以被处理,以便回应一个有意义的消息,但是仍然保留该功能而不保存?我在try/catch/endtry方面经验不足,不知道这是否可行。 – 2011-04-04 20:52:03

1

:help BufWriteCmd

      *BufWriteCmd* 
BufWriteCmd   Before writing the whole buffer to a file. 
       Should do the writing of the file and reset 
       'modified' if successful, unless '+' is in 
       'cpo' and writing to another file |cpo-+|. 
       The buffer contents should not be changed. 
       |Cmd-event| 

所以,它听起来就像你可以实现自动命令,只有做了保存,如果保存被允许重新'modified'

我猜你必须使用类似writefile(getline('^', '$'))这样的东西才能真正写作。

在另一方面,你也许可以做到像

  • 禁用BufWriteCmd再次自动命令
  • :write文件。我不确定它是否会让你在BufWriteCmd处理程序中执行此操作。
  • 重新启用您的BufWriteCmd自动命令。您应该将其放在:finally子句中,以确保它即使在写入出现问题时也能执行。