Unterdrückt die Ausgabe eines VIM-Autocomand

13

Ich habe ein Autocommand in meinem vimrc definiert:

au BufWritePost * !./make.sh

Das Skript make.shkompiliert eine .texDatei dreimal und ich möchte nicht, dass die Ausgabe angezeigt wird.

Gibt es eine Möglichkeit, die Ausgabe zu unterdrücken?

Ich habe versucht, silentvor dem auBefehl eine Zeile einzufügen, aber es hat nicht funktioniert. Ich habe auch versucht , auf diese Weise ohne Erfolg.

Andre Herman Bezerra
quelle

Antworten:

20

Schweigen sollte vorher gehen !./make.sh, nicht vorher au. Das Setzen silentvor aubedeutet nur, dass der automatische Befehl unbemerkt registriert wird. Es sollte stattdessen so aussehen:

au BufWritePost * silent! !./make.sh

Ein Problem beim Ausführen eines solchen externen Befehls mit dem :silentBefehl ist, dass der Bildschirm nicht neu gezeichnet wird und Sie einen leeren Bildschirm haben. Vim hat jedoch einen Befehl, der den Bildschirm neu zeichnet. Dieser kann folgendermaßen verwendet werden:

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

Der Grund, warum ich den :!Befehl execute verwenden muss, liegt darin, dass der Befehl alle danach gefundenen Zeichen verwendet. Dies bedeutet, dass ich dies nicht einfach tun konnte, silent! !./make.sh | redraw!weil bash versucht hätte, alle Zeichen danach zu interpretieren !.

Anmerkungen

Beachten Sie, dass :silent!Fehlermeldungen ignoriert werden, während :silentdies nicht der Fall ist. Außerdem >/dev/null 2>&1leitet der Teil alle Ausgaben von !./make.shan um /dev/null. Weitere Informationen zur E / A-Umleitung finden Sie in Bash hier .

Relevante Hilfethemen

  • :help :execute
  • :help :silent
  • :help :!
  • :help :bar
Immergrüner Baum
quelle
Der zweite Befehl hat funktioniert, druckt jedoch immer noch die Ausgabe auf dem Bildschirm. Außerdem muss ich die Eingabetaste nicht mehr drücken, wenn das Skript beendet ist, was gut ist. Aber ich frage mich, ob es eine Möglichkeit gibt, die Ausgabe vollständig zu unterdrücken.
Andre Herman Bezerra
1
Ersetzt execute "!./make.sh"mit execute "!./make.sh >/dev/null 2>&1"Hilfe? Hiermit werden alle Ausgaben des Befehls an umgeleitet /dev/null. Weitere Informationen zur Weiterleitung in bash finden Sie unter tldp.org/LDP/abs/html/io-redirection.html .
EvergreenTree
Daran hätte ich denken sollen! Es klappt. Vielen Dank!
Andre Herman Bezerra
7

Die Antwort auf Ihre direkte Frage lautet genauso wie bei @EvergreenTree. Ich habe jedoch das Gefühl, dass Ihnen einige der in Vim integrierten Tools zum Erstellen / Kompilieren / Flusen von Projekten fehlen. Vor allem :makeund die Quickfix-Liste.

Was bringt :makeuns die Nutzung ?

Mithilfe von :makekönnen Sie Ihre Fehler in einer Liste sammeln, die als Quickfix-Liste bezeichnet wird. Mit dem Quickfix können Sie zwischen den Fehlern in Ihren Dateien navigieren, sodass Sie direkt zu der Stelle springen, an der der Compiler den Fehler meldet (praktisch, oder?).

:machen

Läuft, :makewird das make-Programm ausgeführt 'makeprg'. 'errorformat'Analysieren Sie dann die Ausgabe mit und fügen Sie jeden Eintrag in die Quickfix-Liste ein.

Der Standardwert ist 'makeprg'normalerweise der makeBefehl, der a ausführt Makefile. Sie können dies jedoch 'makeprg'über den :compilerBefehl ändern oder direkt einstellen.

Sie können auch zusätzliche Argumente an übergeben :make. z.B:make clean

Hinweis: Beim Ausführen :makewird häufig die Ausgabe des Befehls am unteren Bildschirmrand mit der Aufforderung angezeigt, die Eingabetaste zu drücken. Drücken Sie einfach die Eingabetaste, da alle Ausgaben in der Quickfix-Liste verfügbar sind. Sie können dies unterdrücken, indem Sie :silentz :silent make.

Ein gebräuchlicher benutzerdefinierter Befehl für ein stilles Make lautet:

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

Quickfix-Liste

Nachdem Sie ausgeführt haben, enthält :makeIhre Quickfix-Liste die Ausgabe des Compilers.

Verwenden Sie den folgenden Befehl, um in der Quickfix-Liste zu navigieren.

  • :copen um das Quickfix-Fenster zu öffnen
  • :cclose um das Quickfix-Fenster zu schließen
  • :cnext/ :cprev, um zum nächsten / vorherigen Element zu wechseln
  • :ccum den aktuellen Fehler unten auszudrucken oder :cc 3einen bestimmten Fehler in diesem Beispiel anzuzeigen 3

Persönlich benutze ich Tim Popes unbeeinträchtigtes Plugin, um in der Quickfix-Liste zu navigieren.

Was ist mit :makeautomatischem und leisem Laufen ?

Sie können dies mit einem :autocmdwie Sie tun , wo.

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

Als Bonus habe ich beim Öffnen des Quickfix-Fensters hinzugefügt, :cwindowob Fehler vorliegen.

Hinweis: Sollte mit diesem BufWritePostDateimuster auf der AutocMD genauer sein, damit nicht verwandte Dateien nicht erstellt werden.

Gibt es noch mehr ?!

Hierfür werden nur einige der in Vim integrierten Befehle sowie einige automatische Befehle zum Überzeugen verwendet. Es gibt natürlich Plugins und Tools, die Ihnen helfen könnten

  • Mit Dispatch.vim können :makeJobs asynchron ausgeführt werden.
  • Syntastic Plugin Syntax prüft Datei nach :write.
  • Ale.vim (Asynchronous Lint Engine) ist ein Plugin, mit dem Sie in NeoVim und Vim 8 Flusen erstellen können, während Sie Ihre Textdateien bearbeiten.
  • Unimpaired.vim vereinfacht die Verwaltung der Quickfix-Liste.
  • Einfache alte Makefiles. Es ./script.shsei denn, Ihr ist sehr kompliziert, möchten Sie vielleicht make verwenden. Es kann später skaliert werden, um mehr Aufgaben zu erledigen, und ist ein gängiges Erstellungswerkzeug.
  • Sie können Vim Awesome verwenden , um nach weiteren Plugins zu suchen, die möglicherweise hilfreich sind.

Fazit

Persönlich integriere ich :makeund den Quickfix in meinen eigenen Workflow. Ich glaube, dass es sich lohnt, die Ergebnisse Ihres Build-Prozesses und die Fehler zu erfassen. Als zusätzlichen Bonus werden Sie möglicherweise mit der Quickfix-Liste vertraut und können die Liste für andere Anwendungen wie verwenden :grep.

Weitere Hilfe finden Sie unter:

:h :make
:h quickfix
:h 'makeprg'
:h 'errorformat'
:h :compiler
:h :copen
:h :cwindow
:h :cnext
:h :cc
Peter Rincker
quelle
Ich habe darüber nachgedacht, :makeals ich darauf geantwortet habe, aber ich habe es nicht aufgenommen. Es ist eine bessere Idee, make fore zu verwenden, um Dinge zu kompilieren.
EvergreenTree
wie man das autocmd ändert, um makeprg nur auf einer bestimmten Akte laufen zu lassen.
Ibn Saeed