vim autocomandからの出力を抑制する


13

私のvimrcでオートコマンドが定義されています:

au BufWritePost * !./make.sh

スクリプトmake.sh.texファイルを3回コンパイルしますが、出力を表示したくありません。

出力を抑制する方法はありますか?

コマンドのsilent前に1行追加しようとしましたauが、機能しませんでした。私もこの方法で成功しませんでした。

回答:


20

サイレントは前!./make.shではなく前に行くべきauです。silent前に置くauことは、オートコマンドをサイレントに登録することを意味します。代わりに次のようになります。

au BufWritePost * silent! !./make.sh

コマンドでこのような外部コマンドを実行する際の問題の1つ:silentは、画面が再描画されず、空白の画面が残ることです。ただし、vimには画面を再描画するコマンドがあり、次のように使用できます。

au BufWritePost * silent! execute "!./make.sh >/dev/null 2>&1" | redraw!

executeコマンドを使用する必要がある理由は、:!コマンドがその後に見つかった文字を使用するsilent! !./make.sh | redraw!ためです。これは、bashがの後のすべての文字を解釈しようとするために実行できないことを意味し!ます。

ノート

:silent!エラーメッセージは無視しますが、無視:silentしないことに注意してください。また、>/dev/null 2>&1パートは!./make.shtoのすべての出力をリダイレクトします/dev/null。I / Oリダイレクトの詳細については、bashをご覧ください

関連するヘルプトピック

  • :help :execute
  • :help :silent
  • :help :!
  • :help :bar

2番目のコマンドは機能しましたが、まだ画面に出力を印刷します。さらに、スクリプトが終了したときにEnterキーを押す必要がなくなりました。しかし、出力を完全に抑制する方法はないのでしょうか。
アンドレハーマンベゼラ

1
交換execute "!./make.sh"execute "!./make.sh >/dev/null 2>&1"助けになりますか?これにより、コマンドのすべての出力がにリダイレクトされ/dev/nullます。bashでのリダイレクトの詳細については、tldp.org / LDP / abs / html / io-redirection.html参照してください。
エバーグリーン

私はそれを考えるべきだった!できます。ありがとう!
アンドレハーマンベゼラ

7

直接の質問に対する答えは、@ EvergreenTreeが投稿したとおりです。しかし、プロジェクトをビルド/コンパイル/リントするためのVimビルトインツールが不足しているように感じます。最も注目すべき:makeは、クイックフィックスのリストです。

使用:makeすると何が得られますか?

を使用:makeすると、クイックフィックスリストと呼ばれるリストにエラーを収集できます。クイックフィックスを使用すると、ファイル内のエラー間を移動できるので、コンパイラーがエラーが表示されている場所にすぐにジャンプできます(便利ですか?)。

:make

実行:makeするとmakeプログラムが実行され'makeprg'ます。次に、出力を解析し、'errorformat'各エントリをクイックフィックスリストに入れます。

通常は、'makeprg'デフォルトでmakeコマンドを実行しMakefileます。ただし'makeprg':compilerコマンドを使用して変更することも、直接設定することもできます。

に追加の引数を渡すこともできます:make。例えば:make clean

注:実行:makeすると、多くの場合、画面の下部にコマンドの出力が表示され、Enterキーを押すよう求めるプロンプトが表示されます。すべての出力がクイックフィックスリストで利用可能になるので、単にEnterを押してください。これは:silent、などで抑制でき:silent makeます。

サイレントメイクの一般的なカスタムコマンドは次のとおりです。

command -nargs=* -bar Smake silent make <args> <bar> cwindow

クイックフィックスリスト

:makeクイックフィックスリストを実行すると、コンパイラの出力が保持されます。

次のコマンドを使用して、クイックフィックスリストをナビゲートします。

  • :copen クイックフィックスウィンドウを開く
  • :cclose クイックフィックスウィンドウを閉じる
  • :cnext/ :cprev次/前のアイテムに移動する
  • :cc現在のエラーを下部に出力するか:cc 3、この例3で特定のエラーを表示する

個人的に私はティム教皇の使用健常 QuickFixリストをナビゲートするためのプラグインを。

:make自動で静かに実行するのはどうですか?

:autocmdどこでもあなたと同じようにこれを行うことができます。

augroup auto_make
    autocmd!
    autocmd BufWritePost * silent make
    autocmd QuickFixCmdPost *make* cwindow
augroup END

ボーナスとして、:cwindowエラーが存在する場合にクイックフィックスウィンドウを開く際に追加しました。

注:BufWritePost関連しないファイルがビルドされないように、autocmdのファイルパターンをより具体的にする必要があります。

もっとありますか?!

これは、Vimの組み込みコマンドのいくつかと、説得力のあるautocmdをいくつか使用しているだけです。もちろんあなたを助けるかもしれないプラグインとツールがあります

  • Dispatch.vimを使用して、:makeジョブを非同期に実行できます。
  • Syntasticプラグインの構文は、後にファイルをチェックします:write
  • Ale.vim(非同期リントエンジン)は、テキストファイルの編集中にNeoVimおよびVim 8でリンティングを提供するためのプラグインです。
  • Unimpaired.vimは、quickfixリストの管理を簡単にします。
  • プレーンな古いMakefile。./script.sh非常に複雑でない限り、makeの使用を検討することをお勧めします。後でより多くのタスクを行うことができ、一般的な構築ツールです。
  • Vim Awesomeを使用して、役立つ可能性のある他のプラグインを検索できます。

結論

個人的に:make、自分のワークフローにクイックフィックスを統合します。ビルドプロセスの出力をキャプチャし、エラーをキャプチャすると、投資に見合うだけの価値があると思います。追加のボーナスとして、quickfixリストをより快適に使用できるようになり、リストをなどの他のアプリケーションに使用できます:grep

詳細については、以下を参照してください。

:h :make
:h quickfix
:h 'makeprg'
:h 'errorformat'
:h :compiler
:h :copen
:h :cwindow
:h :cnext
:h :cc

:makeはこれに答えている間考えましたが、私はそれを含めませんでした。make foreをコンパイルすることをお勧めします。
EvergreenTree

特定のファイルでのみmakeprgを実行するようにautocmdを変更する方法。
イブンサイード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.