Esto es un poco más amplio de lo que OP solicitó, pero para las personas que no desean usar complementos, y posiblemente otros sistemas de control de revisión, este pequeño fragmento tiende a funcionar bastante bien:
:new
:r! git show branch:file
:1d
Crea una nueva ventana y muestra el archivo allí leyendo la salida del comando dado en el nuevo búfer. Esto, por supuesto, funciona con cualquier comando externo, no solo con git.
Ejemplo para bzr (donde la sintaxis REV puede especificar una rama):
:new
:r! bzr cat -r REV file
:1d
Ejemplo para hg (no estoy seguro acerca de las ramas en hg; no lo use lo suficiente)
:new
:r! hg cat -r REV file
:1d
Ejemplo para svn (
:new
:r! svn cat file@REV
:1d
Probablemente aún desee configurar el tipo de archivo para obtener resaltado de sintaxis como en las publicaciones SO, pero al menos no tiene que meterse con las tuberías.
Una vez abierto, puede guardarlo con un nuevo nombre con :w filename
o :saveas filename
, ya que Vim todavía no tendrá un nombre de archivo. Si no desea poder editarlo, también puede agregar ay :setlocal readonly
/ o :setlocal nomodifiable
.
-Editar: tipo de archivo automático-
Es un poco más de trabajo, pero puedes pedirle a Vim que adivine el tipo de archivo con
:filetype detect
Pero, dado que Vim aún no tiene un nombre, esto no siempre funciona bien (por ejemplo, saqué un código C y lo adivinó filtype=conf
.
Podemos darle un nombre guardándolo, pero no queremos sobrescribir un archivo posiblemente existente. También podemos establecer el nombre del archivo (¡Gracias @PeterRincker!), Pero de nuevo, no queremos arriesgarnos a colisiones. Como es poco probable que exista un archivo que sea el nombre de la rama y el nombre del archivo juntos, los concatenaremos con un separador arbitrario
:exe "silent file " . "branch" . "-" . "file"
:filetype detect
Donde "file"
se reemplaza con el nombre de archivo real y "branch"
con el nombre de la sucursal
Por supuesto, en este punto casi estamos escribiendo un complemento ;-)
Al unirlo todo, aquí está como una función específica de git que podría colocar en su 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 podría envolver en un comando o llamar directamente, por ejemplo call GitFile("whateverBranch","myfile.c")
. Obtendrá una nueva ventana con un búfer llamadowhateverBranch-myfile.c