¿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 :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
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:
: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
tabnewy 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: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.