Wie führe ich "ctags -R" beim Speichern von * .h- und * .cpp-Dateien ohne Bestätigungsaufforderung aus?

8

Dies ist eine Noob-Frage, daher möchte ich in vim ausgeführt werden, ctags -Rwenn ich in meine Quell- oder Header-Dateien ( *.hoder *.cpp) schreibe, also habe ich Folgendes versucht:

autocmd BufWritePost *.cpp :!ctags -R
autocmd BufWritePost *.h :!ctags -R

Es scheint zu funktionieren, aber jedes Mal, wenn ich speichere, möchte es eine Bestätigung, also muss ich die Eingabetaste wie folgt drücken:

"coap/coap_pdu_ll.h" 30L, 793C written
:!ctags R

Press ENTER or type command to continue

Gibt es eine Möglichkeit, die Bestätigung loszuwerden?

user1135541
quelle

Antworten:

10

Wenn Sie einen externen Befehl mit ausführen :!, weiß Vim nicht, was der externe Befehl möglicherweise in das Terminal geschrieben hat, und wartet daher darauf, dass Sie bestätigen, dass Sie bereit sind, fortzufahren.

Um dies zu vermeiden, können Sie die folgende system()Funktion verwenden:

autocmd BufWritePost *.cpp call system("ctags -R")
autocmd BufWritePost *.h   call system("ctags -R")

Sie können dies auch auf einen Befehl vereinfachen:

autocmd BufWritePost *.cpp,*.h call system("ctags -R")

Ein Problem beim Aufrufen system()besteht darin, dass Sie alle Fehlermeldungen verlieren, die möglicherweise auftreten. Das kann gelöst werden, indem man echostatt callwie folgt verwendet:

autocmd BufWritePost *.cpp,*.h echo system("ctags -R")

Dies führt jedoch zu einer leeren Zeile in der Anzeige, wenn der Befehl erfolgreich ist, und führt zu einer weiteren Eingabeaufforderung "Drücken Sie die EINGABETASTE oder geben Sie den Befehl ein, um fortzufahren". Die einfachste Lösung besteht darin, die Höhe der Befehlszeile zu erhöhen:

:set cmdheight=2

Eine andere, kompliziertere Lösung wäre, eine Nachricht nur dann wiederzugeben, wenn es eine gibt. Dann vermeiden Sie die Eingabeaufforderung, ohne Platz auf dem Bildschirm zu verlieren.

autocmd BufWritePost *.cpp,*.h let msg=system('ctags -R') | if msg!="" | echo msg | endif
Garyjohn
quelle
2

Da es so aussieht, als würden Sie C ++ verwenden, warum nicht einfach Ihre Tags beim Kompilieren neu erstellen? Fügen Sie Ihrem Makefile einfach eine Regel hinzu.

Andere Optionen:

Peter Rincker
quelle
Wirklich gute Vorschläge. Tatsächlich versuche ich gerade Gutentags. Aber ich bin meistens ein Minimalist. Für mich ist eine Zeile in der .vimrc-Datei besser als ein Plugin, es sei denn, das Plugin bietet mir etwas, was eine Zeile nicht kann. Ich denke, dass Plugin für größere Codebasen erforderlich ist.
user1135541