¿Hay alguna manera de enganchar el ahorro en Vim hasta comprometerse en git?

11

Soy nuevo en el mundo de Vim, y quiero hacerlo para que cada vez que guarde un archivo esté comprometido con el control de versiones. es posible?

gonzo.floyd
fuente

Respuestas:

4

Podrías usar los comandos automáticos de Vim:

:autocmd BufWritePost * execute '!git add % && git commit -m %'

Eso no se ha probado, pero debe agregar el archivo y confirmarlo con el nombre del archivo como mensaje de confirmación.
Desea BufWritePost ya que esto se activa después de que se escribe el archivo. Sin embargo, me imagino que hay muchos casos extremos molestos o inseguros.

donothings exitosamente
fuente
4

Uso un comando automático vim que coloco en mi .vimrc. El comando primero hace una verificación cruda de que estamos trabajando en un directorio git (verificando la existencia de un directorio .git, ya sea en el directorio actual o usando git rev-parse), luego lo usa git -a -m %para que solo los archivos que se hayan agregado previamente se preparen y confirmen .

autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
Nick Edwards
fuente
1
Falta una comilla simple al final del cmd, justo después de fi.
Andrew-Dufresne
2
Esta versión solo funciona si está en el directorio raíz de su repositorio. Una mejor solución es autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi', a partir de una respuesta SO
Andrew-Dufresne
Esto funciona para mí en Linux. ¿Alguna idea de cómo hacer que funcione en Windows?
user334287
2

Es posible que desee ver el complemento fugitivo , es un complemento git muy poderoso para vim. También puede configurar un autocmdcomo donothingsuccessfullysugiere, pero hacer que aparezca :Gcommito :Gstatus(desde el cual puede elegir los cambios para agregar al índice git)

mkomitee
fuente
1

Sobre la base de las respuestas que otros han proporcionado:

autocmd BufWritePost * execute ':silent ! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m "Auto-commit: saved %"; fi > /dev/null 2>&1'

Esto es completamente transparente. No recibirá el mensaje "Presione enter para continuar" (pero si el commit no funcionó, no sabrá que falló).

sargon
fuente
0

Seguramente podría hacerlo con una macro o con la reasignación de comandos.

(Consulte /programming/117150/can-i-re-map-commands-in-vim )

Sin embargo, no estoy seguro de que sea una buena opción. No soy competente en git por ahora y sé que a veces es diferente de svn. Pero no haría este auto-commit con svn. Comprometerse debe ser significativo y no ahorrar en el tiempo regular.

Normalmente se compromete porque agregó una función, corrigió un error, ... no solo porque trabajó en un archivo. No terminará con un proyecto sin compilar o una función sin terminar.

M'vy
fuente
Eso es cierto, pero también quiero tener un script de la noche a la mañana que mueva los archivos que se compilan con éxito del repositorio "save-on-commit" a un repositorio "cambio significativo".
gonzo.floyd
Bueno, no es del todo una mala idea con Git. "Comprometerse frecuentemente" es una especie de lema. También funciona mejor de esta manera, porque puede trabajar simultáneamente en el mismo archivo con múltiples desarrolladores y problemas mínimos. Sería bastante útil conectar el mecanismo de guardado de vim.
Metagrapher
Los flujos de trabajo en Git pueden ser radicalmente diferentes de Subversion. Es posible que nunca haga esto en svn porque sería abusivo, pero tiene usos perfectamente válidos en git. Por ejemplo, un servidor de integración de prueba de algún tipo podría conectarse a una rama de prueba. La confirmación automática al guardar se vuelve bastante útil. Cuando llegue al punto en que algo funciona, usaría git rebase para aplastar toda la actividad en una sola confirmación con un mensaje significativo, luego se fusionaría en su rama de desarrollo. Si esto suena aterrador o complejo es solo porque está adaptado a las limitaciones de una fuente vcs no distribuida.
Caleb
0

Sé que esta pregunta es antigua y esta es una autopromoción descarada, pero escribí un complemento de Vim que activará ciertos scripts de shell que se ejecutarán después de autocmdeventos específicos de Vim . Por ejemplo, una secuencia de comandos llamada .bufwritepost.vimhook.shse ejecutará (sincrónicamente) cada vez que BufWritePostse active el comando. Luego, podría incluir fácilmente cualquier lógica que desee para realizar el git commit dentro de ese script. El complemento asume convenciones de nomenclatura específicas de estos scripts y también admite scripts "enganchados" que se activan solo en archivos que coinciden con ciertos nombres o que tienen ciertas extensiones.

Detalles completos: https://github.com/ahw/vim-hooks

Andrés
fuente
0

Quiero informar mi opinión sobre este problema.

Tengo el vimrc.vimrepositorio en un git ( $VIMCONF, con un bootstrap .vimrc) y mapeado <Leader>ve("vim edit") para abrir el vimrc en una nueva pestaña. Esto no afecta el directorio de trabajo actual.

Entonces, si edito vimrc.vimdesde un vim iniciado en un directorio diferente fuera de mi repositorio vim git, el enfoque que fue discutido por Nick Edwards fallará. Mi truco es el siguiente (para Windows y Linux)

if has('win32')
    " The git command has to be passed to git. So we need to call bash.exe.
    autocmd BufEnter *vimrc.vim silent! lcd %:p:h
    autocmd BufWritePost *vimrc.vim if expand('<amatch>') =~ substitute(expand('$VIMCONF\vimrc.vim'), '\', '/', "g") | execute '! git add % & git commit -m %' | endif
else " Linux
    autocmd BufWritePost *vimrc.vim
        \ if expand('<amatch>') =~ expand($VIMCONF)."/vimrc.vim" |
        \ let tempdir = getcwd() | execute 'cd' fnameescape(expand('<amatch>:h')) | 
        \ execute '! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m % ; fi' |
        \ execute 'cd' fnameescape(tempdir) |
        \ endif
endif

Explicación:

  1. Para Windows, cambio el directorio a la ubicación del archivo vimrc. Este no es el mejor, y podría cambiar más tarde para ser similar a Linux. No lo tome demasiado en serio, pero es posible que desee utilizarlo como guía. gittiene que estar en el camino (es decir, usted debería ser capaz de escribir git <ENTER>en cmd.exe)
  2. Para Linux, primero verifico que estoy editando el vimrc.vim correcto
  3. Guarde el directorio de trabajo actual en tempdir
  4. Cambiar el directorio al archivo vimrc.vim
  5. ¿El git commit
  6. Regresar al directorio de trabajo anterior.
  7. Empujo manualmente los cambios de git

Notas:

  1. Los comandos se pueden "encadenar" en vim con |. La cadena abortará si alguno de los comandos falla. Para dividir varias líneas, comience la siguiente línea con \.
  2. Esto se puede extender a los archivos ftplugin. Tus filtros serán *.vimyexpand($VIMCONF)."/ftplugin/"
usuario334287
fuente