2011-04-24 8 views
19

Digamos que estoy en el estado A en mi documento. Luego hago los cambios B, C y D (en orden).Omita el paso de deshacer en Vim

¿Hay alguna forma de que pueda mantener los cambios B y D, pero omita C?

O, digamos que estoy en el estado A en mi documento. Hago el cambio B, lo deshago, y luego hago los cambios C y D (así que Vim tiene un árbol de deshacer con dos ramas). Luego cambio de opinión y decido que quiero usar B y D pero no C.

¿Cómo puedo hacer esto en Vim? Tengo el complemento gundo.vim instalado, pero no lo he usado tanto.

+0

modo de pregunta interesante. Suelo jugar con g- y g + y un montón de yank/put. Sería muy curioso lo que la gente viene con – sehe

+1

No estoy seguro de que esto sea posible en Vim. El cambio C puede basarse en B. Lo que básicamente quiere es una forma de almacenar estados específicos del documento con ediciones, y la capacidad de fusionar diferentes estados. Suena como los sistemas de revisiones de núcleo de origen que pueden hacer las operaciones de "fusión". Creo que tendrá que ponerse en práctica el uso de búferes nombrados y/o guardar versiones alternativas del archivo si necesita saltar rápidamente entre las revisiones. – ewh

+0

Solo puedo imaginar una forma de hacerlo automáticamente: importar todo el árbol de deshacer en algunos VCS y luego usarlo para omitir los cambios (por ejemplo, 'git rebase -i' proporciona una manera de eliminar algún compromiso, incluso si tiene hijos) . Pero nunca he visto tales complementos, por lo que tendrá que escribirlos solo. – ZyX

Respuesta

2

Bueno, voy a echar un vistazo a esto y decir: No, no creo que haya una manera de hacer exactamente lo que quieras con vim.

gundo.vim agrega una buena interfaz para deshacer de vim, pero no cambia sus capacidades básicas. Así que tomó un vistazo a los documentos oficiales vim para ver si hay alguna pista acerca de si es capaz de esto:

Nada acerca de la fusión de dos ramas juntos. Creo ewh y ZYX tienen razón: para obtener una solución general para la fusión de B con D, vim necesitaría ya sea para

  1. Bram para agregarlo como una función separada en una versión futura
  2. alguien para ponerlo en práctica en un plug-in mediante la integración con algo que ya se pueden hacer fusiones (como git/hg)

por supuesto, puede tratar de hacerlo de forma manual por tener archivos con versiones B, C y D, así como algunas diferenciaciones abiertas.


Nota: Si no he entendido bien y no se preguntan sobre una solución general y está buscando ayuda con una instancia específica de esto, hágamelo saber y voy a ver qué puedo hacer :)

1

¿Hay alguna forma de que pueda mantener los cambios B y D, pero omita C?

Estás en estado D.: w file.ext_D

Backtrack para indicar C: w file_ext_C

Backtrack al Estado B.: w file.ext_B

:!kdiff3 file.ext_B file.ext_C file.ext_D 

Esto ofrece una combinación de 3 maneras de las diferencias, pero aún así tendría que ingresar manualmente y elegir cada línea roja en D para cada conflicto de fusión. No es exactamente una solución fácil.

Si por el contrario lo hace

:!kdiff3 file.ext_C file.ext_B file.ext_D 

Luego de la fusión ocurre de forma automática (a excepción de líneas individuales con múltiples cambios)

Para los escenarios más complicados se hace más dura.

Nota: No estoy seguro de cómo una herramienta de control de revisión es de mucha ayuda. Básicamente estás haciendo algo como crear un parche entre B y D, y luego restar el parche de C a D de él. Me parece que los sistemas de control de revisiones generalmente están diseñados para administrar fusiones entre diferentes fuentes de cambios, no cambios a lo largo de una sola rama.

kdiff3 está disponible en: http://kdiff3.sourceforge.net/

+1

¿POR QUÉ kdiff3? Este _is_ vim, entonces tiene diff. Si desea simplemente fusionar, use meld o cualquier programa cli que se integre fácilmente. Re: '... cómo una herramienta de revisión es de mucha ayuda [...] no una [...] sola rama': ¿Trabaja mucho con microcompromisos? Se aplica todo el git: concepto interactivo, posiblemente incluso su característica de índice esté orientada hacia esta misma necesidad – sehe