¿Se puede iniciar vimdiff para git diffs en la pestaña del proceso actual?

Jan 20 2021

Digamos que tengo un búfer de archivo abierto y una :terminaldivisión abierta en una página de pestaña. Me gustaría crear una nueva pestaña donde ejecuto vimdiffpero que se muestre mi git diff. Estoy tratando de git difftool HEAD~1aparecer 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 terminaly 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

2 NikolasTapia Jan 20 2021 at 17:03

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 Gdiffpara 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:

  1. :tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
  2. En la pestaña recién abierta, :vert sb 1 | windo diffthis

Explicación

  1. primero abre una nueva pestaña con tabnewy carga el contenido de la HEAD^versión del archivo en el búfer 1.
  2. abre una división vertical que contiene el búfer 1 con vert sb 1, luego emite :diffthisa 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 shownecesita 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.exttal que bcontiene su .gitcarpeta ( bes decir, es la raíz de su repositorio), para git showque funcione correctamente, tendrá que invocarlo con HEAD^:b/foo.e. Usar cualquiera de los dos /a/b/foo.exto foo.extno funcionará. Entonces solía git rev-parse --show-prefixobtener 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 vimexpansión de ruta para agregar el nombre del archivo (es decir foo.ext). #1dice vimque busque la ruta de cualquier archivo que esté cargado en el búfer 1, y :textrae la "cola", que es todo lo que sigue al último /en la ruta devuelta por #1. En algunos casos #1y #1:tson iguales, pero no siempre es así. Por ejemplo, si se ejecutó vim b/foo.extluego #1volvería b/foo.exten lugar de sólo foo.ext. Consulte :help expandpara 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.