¿Se puede iniciar vimdiff para git diffs en la pestaña del proceso actual?
Digamos que tengo un búfer de archivo abierto y una :terminal
división abierta en una página de pestaña. Me gustaría crear una nueva pestaña donde ejecuto vimdiff
pero que se muestre mi git diff. Estoy tratando de git difftool HEAD~1
aparecer en mi proceso vim actual, solo en otra página de pestañas.
¿Es esto posible en Vim 8 sin complementos?
Tengo esta ilusión cuando lo hago :tab terminal
y luego corro git difftool HEAD~1
. Sin embargo, esto inicia un subproceso vim y me gustaría evitarlo.
Algo así como esta pregunta: ¿Cómo entro en el modo vimdiff dado que ya hay dos divisiones abiertas? pero para git diffs.
Respuestas
Si bien esto es ciertamente factible en vainilla vim
, le sugiero que eche un vistazo al excelente vim-fugitivecomplemento de tpope . Entonces, simplemente necesita hacer :tab Gdiff
para obtener lo que desea.
Si realmente no desea instalar ningún complemento, lo siguiente podría funcionar asumiendo que el archivo actual está en el búfer no. 1:
:tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
- En la pestaña recién abierta,
:vert sb 1 | windo diffthis
Explicación
- primero abre una nueva pestaña con
tabnew
y carga el contenido de laHEAD^
versión del archivo en el búfer 1. - abre una división vertical que contiene el búfer 1 con
vert sb 1
, luego emite:diffthis
a todos los búferes en la pestaña para ingresar al modo diff.
Editar
El OP solicitó una explicación más sobre el paso 1. git show
necesita una entrada del formulario <rev>:<path>
donde <path>
tiene que estar en relación con la raíz del árbol de trabajo. Por ejemplo, si la ruta absoluta del archivo en el búfer 1 es /a/b/foo.ext
tal que b
contiene su .git
carpeta ( b
es decir, es la raíz de su repositorio), para git show
que funcione correctamente, tendrá que invocarlo con HEAD^:b/foo.e
. Usar cualquiera de los dos /a/b/foo.ext
o foo.ext
no funcionará. Entonces solía git rev-parse --show-prefix
obtener la ruta de la carpeta actual en relación con la raíz de git (que sería b/
) en este ejemplo.
Luego, utilicé la vim
expansión de ruta para agregar el nombre del archivo (es decir foo.ext
). #1
dice vim
que busque la ruta de cualquier archivo que esté cargado en el búfer 1, y :t
extrae la "cola", que es todo lo que sigue al último /
en la ruta devuelta por #1
. En algunos casos #1
y #1:t
son iguales, pero no siempre es así. Por ejemplo, si se ejecutó vim b/foo.ext
luego #1
volvería b/foo.ext
en lugar de sólo foo.ext
. Consulte :help expand
para obtener más información.
Por supuesto, podría ingresar la ruta manualmente, como en :tabnew | r! git show HEAD^:b/foo.ext
, y funcionaría. Pero la versión anterior es programable o puede asignarla a un mapa.