Ich bin neu in der Welt von Vim und möchte es so gestalten, dass jedes Mal, wenn ich eine Datei speichere, diese zur Versionskontrolle verpflichtet wird. Ist das möglich?
Ich bin neu in der Welt von Vim und möchte es so gestalten, dass jedes Mal, wenn ich eine Datei speichere, diese zur Versionskontrolle verpflichtet wird. Ist das möglich?
Antworten:
Sie können die automatischen Befehle von Vim verwenden:
:autocmd BufWritePost * execute '!git add % && git commit -m %'
Das ist nicht getestet, aber es sollte die Datei hinzufügen und mit dem Dateinamen als Festschreibungsnachricht festschreiben.
Sie möchten BufWritePost, da dies nach dem Schreiben der Datei ausgelöst wird. Ich würde mir vorstellen, dass es viele lästige oder unsichere Randfälle gibt.
Ich verwende einen vim-Autobefehl, den ich in meine .vimrc einfüge. Der Befehl führt zunächst eine grobe Überprüfung durch, ob wir in einem Git-Verzeichnis arbeiten (indem er das Vorhandensein eines Git-Verzeichnisses entweder im aktuellen Verzeichnis oder mithilfe von überprüft git rev-parse
), und verwendet dann git -a -m %
, dass nur zuvor hinzugefügte Dateien bereitgestellt und festgeschrieben werden .
autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
, aus einer SO-Antwort
Vielleicht möchten Sie sich das flüchtige Plugin ansehen , es ist ein sehr leistungsfähiges Git-Plugin für vim. Sie können auch ein autocmd
wie vorgeschlagen donothingsuccessfully
einrichten, aber es wird angezeigt :Gcommit
oder :Gstatus
(aus dem Sie Änderungen auswählen können, um sie dem Git-Index hinzuzufügen)
Aufbauend auf den Antworten, die andere gegeben haben:
autocmd BufWritePost * execute ':silent ! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m "Auto-commit: saved %"; fi > /dev/null 2>&1'
Dies ist völlig transparent. Sie erhalten nicht die Meldung "Drücken Sie die Eingabetaste, um fortzufahren" (aber wenn das Festschreiben nicht funktioniert hat, wissen Sie nicht, dass es fehlgeschlagen ist).
Sie könnten dies sicherlich mit einem Makro oder mit Befehl neu zuordnen.
(Überprüfen Sie /programming/117150/can-i-re-map-commands-in-vim )
Ich bin mir nicht sicher, ob es eine gute Option ist. Ich beherrsche Git momentan nicht und ich weiß, dass es manchmal anders ist als SVN. Aber ich würde dieses Auto-Commit nicht mit svn machen. Commit muss sinnvoll sein und darf nicht regelmäßig gespeichert werden.
Normalerweise schreiben Sie fest, weil Sie eine Funktion hinzugefügt, einen Fehler behoben haben, ... nicht nur, weil Sie an einer Datei gearbeitet haben. Sie werden nicht mit einem nicht kompilierten Projekt oder einer nicht abgeschlossenen Funktion enden.
Ich weiß, dass diese Frage alt ist und dies eine offensichtliche Eigenwerbung ist, aber ich habe ein Vim-Plugin geschrieben, das bestimmte Shell-Skripte auslöst, die nach bestimmten Vim- autocmd
Ereignissen ausgeführt werden. Beispielsweise wird ein Skript mit dem Namen .bufwritepost.vimhook.sh
jedes Mal (synchron) ausgeführt, wenn der BufWritePost
Befehl ausgelöst wird. Sie können dann problemlos die gewünschte Logik für die Ausführung des Git-Commits in dieses Skript aufnehmen. Das Plugin setzt bestimmte Namenskonventionen dieser Skripte voraus und unterstützt auch "Hook" -Skripte, die nur für Dateien ausgelöst werden, die bestimmten Namen entsprechen oder bestimmte Erweiterungen haben.
Ausführliche Informationen: https://github.com/ahw/vim-hooks
Ich möchte meine Meinung zu diesem Problem melden.
Ich habe das vimrc.vim
in einem Git-Repository ( $VIMCONF
mit einem Bootstrap .vimrc) und zugeordnet <Leader>ve
("vim edit"), um das vimrc in einem neuen Tab zu öffnen. Dies hat keine Auswirkungen auf das aktuelle Arbeitsverzeichnis.
Wenn ich also vimrc.vim
von einem vim bearbeite, das in einem anderen Verzeichnis außerhalb meines vim git-Repositorys gestartet wurde, schlägt der von Nick Edwards diskutierte Ansatz fehl. Mein Hack ist der folgende (für Windows und Linux)
if has('win32')
" The git command has to be passed to git. So we need to call bash.exe.
autocmd BufEnter *vimrc.vim silent! lcd %:p:h
autocmd BufWritePost *vimrc.vim if expand('<amatch>') =~ substitute(expand('$VIMCONF\vimrc.vim'), '\', '/', "g") | execute '! git add % & git commit -m %' | endif
else " Linux
autocmd BufWritePost *vimrc.vim
\ if expand('<amatch>') =~ expand($VIMCONF)."/vimrc.vim" |
\ let tempdir = getcwd() | execute 'cd' fnameescape(expand('<amatch>:h')) |
\ execute '! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m % ; fi' |
\ execute 'cd' fnameescape(tempdir) |
\ endif
endif
Erläuterung:
git
hat auf dem Weg sein (dh sollten Sie in der Lage sein , geben git <ENTER>
in cmd.exe
)tempdir
Anmerkungen:
|
. Die Kette wird abgebrochen, wenn einer der Befehle fehlschlägt. Um mehrere Zeilen zu durchbrechen, beginnen Sie die nächste Zeile mit \
.*.vim
und seinexpand($VIMCONF)."/ftplugin/"