Isso é um pouco mais amplo do que o OP pediu, mas para as pessoas que não desejam usar plug-ins e possivelmente outros sistemas de controle de revisão, esse pequeno trecho tende a funcionar razoavelmente bem:
:new
:r! git show branch:file
:1d
Ele cria uma nova janela e mostra o arquivo lá, lendo a saída do comando fornecido no novo buffer. Obviamente, isso funciona com qualquer comando externo, não apenas com o git.
Exemplo para bzr (onde a sintaxe REV pode especificar uma ramificação):
:new
:r! bzr cat -r REV file
:1d
Exemplo para hg (não tenho certeza sobre ramificações em hg; não use o suficiente)
:new
:r! hg cat -r REV file
:1d
Exemplo para svn (
:new
:r! svn cat file@REV
:1d
Você provavelmente ainda deseja definir o tipo de arquivo para obter destaque de sintaxe, como nas postagens de SO, mas pelo menos não precisa mexer na tubulação.
Depois de aberto, você pode salvá-lo com um novo nome com :w filename
ou :saveas filename
, pois o Vim ainda não terá um nome de arquivo para ele. Se você não quiser editá-lo, também pode inserir um :setlocal readonly
e / ou :setlocal nomodifiable
.
-Editar: Tipo de arquivo automático-
É um pouco mais trabalhoso, mas você pode pedir ao Vim para adivinhar o tipo de arquivo com
:filetype detect
Mas, como o Vim ainda não tem um nome, isso nem sempre funciona bem (por exemplo, eu inseri um código C e ele adivinhou filtype=conf
.
Podemos dar um nome a ele salvando-o, mas não queremos sobrescrever um arquivo possivelmente existente. Também podemos definir o nome do arquivo (Obrigado @ PeterRincker!), Mas, novamente, não queremos arriscar colisões. Como é improvável que exista um arquivo com o nome da filial e o nome do arquivo juntos, concatená-los-emos com um separador arbitrário
:exe "silent file " . "branch" . "-" . "file"
:filetype detect
Onde "file"
é substituído pelo nome do arquivo real e "branch"
pelo nome da ramificação
Claro, neste momento estamos quase escrevendo um plugin ;-)
Jogando tudo junto, aqui está como uma função específica do git que você pode colocar no seu vimrc:
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
que você pode agrupar em um comando ou ligar diretamente, por exemplo call GitFile("whateverBranch","myfile.c")
. Você receberá uma nova janela com um buffer chamadowhateverBranch-myfile.c