2011-06-02 17 views
15

私は本当に速く入力し、ときどき誤って;または:という名前のファイルを保存することがあることを認識しています(私は:wqと入力します。特定の名前のファイルをVimに保存しないようにする

特定の名前に一致するファイルの保存を拒否するマクロを作成する方法はありますか?

+3

私は 'BufWritePre'でオートコマンドを使用して、あなたに警告し、'; * 'で始まるファイルは書き込めないと思います。しかし、私は今眠っていて、目を覚ますたびにそれを撃ちます。 – abcd

答えて

17

シンプルで効果的な解決策は、自動コマンド一致を定義することです。 は、ファイル名を誤って入力し、警告を出して保存を終了する可能性があります。

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

:throwコマンドは、Vimはバッファの 内容の書き込みを停止させる必要があることに注意してください。

ために捕捉されない例外のE605エラーを避けるために、1 はtryブロックに:echoerrコマンドの実行を使用して、エラーを発行することができます。 (try構造 内部から呼び出されたときに:echoerrは例外として、そのエラーメッセージを発生させます。:help :echoerrを参照してください。)

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

今まで 上記で使用したパターンと一致する名前のファイルを保存するために必要とされる場合自動コマンドの場合は、:noautocmdまたは の書き込みコマンドの前に、eventignoreオプションを設定してください(詳細は:help :noautocmdおよび:help eventignoreを参照してください)。

:noa w :ok.txt 
+0

これは素晴らしいです(と私は非常に似たようなことをする事前保存機能を持っている)が、BufWritePreの間に保存を防止するより微妙な方法がありますか?このようにエラーを投げると、 'E605:Exception not caught'が発生します。醜いエラーメッセージではなくメッセージをエコーすることができればいいです。 –

+0

@Prince:残念ながら、私が知る限り、例外をスローするよりも、 'autocmd'イベントをトリガーするアクションを終了する他の方法はありません。しかし、 'try'-' catch'に 'throw 'をラップすることで' E605'エラーを取り除くことは可能です。答えは更新されます。 –

+0

私はあなたが 'echohl ErrorMsg | echom '疑わしいファイル名:' .v:例外| 'echoerr'の代わりに' echohl NONE'を使用してください:echoerrは、ここでエラーコンテキストに関する必要な情報を提供しないため、使用しないでください。2.コンテキストによっては、例外に変換される場合もあります。なぜなら、 'try ... catch 'が見つかるまでスタック内の全ての関数に隠れた出口ポイントを追加するので、自分自身の例外は良くないのですが、' echoerr'が悪いです。出口点は文脈に依存する。私はかつて 'echoerr 'の問題をデバッグするのに「良い」時間を持っていました。 – ZyX

関連する問題