Dies ist ein wenig weiter gefasst als von OP gefordert, aber für Leute, die keine Plugins und möglicherweise andere Revisionskontrollsysteme verwenden möchten, funktioniert dieses kleine Snippet in der Regel recht gut:
:new
:r! git show branch:file
:1d
Es wird ein neues Fenster erstellt und die Datei dort angezeigt, indem die Ausgabe des angegebenen Befehls in den neuen Puffer eingelesen wird. Dies funktioniert natürlich mit jedem externen Befehl, nicht nur mit git.
Beispiel für bzr (wobei die REV-Syntax einen Zweig angeben kann):
:new
:r! bzr cat -r REV file
:1d
Beispiel für hg (nicht sicher über Zweige in hg; verwenden Sie es nicht genug)
:new
:r! hg cat -r REV file
:1d
Beispiel für svn (
:new
:r! svn cat file@REV
:1d
Sie möchten wahrscheinlich immer noch den Dateityp so einstellen, dass die Syntax hervorgehoben wird, wie in den SO-Posts, aber Sie müssen sich zumindest nicht mit Piping herumschlagen.
Einmal geöffnet können Sie es unter einem neuen Namen mit :w filename
oder speichern :saveas filename
, da Vim noch keinen Dateinamen dafür hat. Wenn Sie es nicht bearbeiten können möchten, können Sie auch ein :setlocal readonly
und / oder einwerfen :setlocal nomodifiable
.
-Bearbeiten: Automatischer Dateityp-
Es ist etwas mehr Arbeit, aber Sie können Vim bitten, den Dateityp mit zu erraten
:filetype detect
Aber da Vim noch keinen Namen hat, funktioniert dies nicht immer gut (zum Beispiel habe ich einen C-Code eingegeben und es wurde vermutet filtype=conf
.
Wir können ihm einen Namen geben, indem wir ihn speichern, aber wir möchten eine möglicherweise vorhandene Datei nicht überschreiben. Wir können auch nur den Dateinamen festlegen (Danke @PeterRincker!), Aber wir möchten auch hier keine Kollisionen riskieren. Da es unwahrscheinlich ist, dass eine Datei existiert, die sowohl den Zweignamen als auch den Dateinamen enthält, verknüpfen wir sie mit einem beliebigen Trennzeichen
:exe "silent file " . "branch" . "-" . "file"
:filetype detect
Wo "file"
wird durch den tatsächlichen Dateinamen und "branch"
durch den Zweignamen ersetzt
Natürlich schreiben wir an dieser Stelle fast ein Plugin ;-)
Wenn Sie alles zusammenfassen, ist dies eine git-spezifische Funktion, die Sie in Ihrem vimrc ablegen können:
function! GitFile(branch,file)
new
exe "silent r! git show " . a:branch . ":" . a:file
1d
exe "silent file " . a:branch . "-" . a:file
filetype detect
setlocal readonly "don't allow saving
setlocal nomodified "allow easy quitting without saving
setlocal nomodifiable "don't allow modification
endfunction
die Sie in einen Befehl einwickeln oder direkt aufrufen können, z call GitFile("whateverBranch","myfile.c")
. Sie erhalten ein neues Fenster mit einem Puffer namenswhateverBranch-myfile.c