Supongamos que tengo un diseño arbitrario de divisiones en vim.
____________________
| one | two |
| | |
| |______|
| | three|
| | |
|___________|______|
¿Hay una manera de intercambiar one
y two
y mantener el mismo diseño? Es simple en este ejemplo, pero estoy buscando una solución que ayude a diseños más complejos.
ACTUALIZAR:
Creo que debería ser más claro. Mi ejemplo anterior fue una simplificación del caso de uso real. Con una instancia real:
¿Cómo podría cambiar cualquiera de esas divisiones, manteniendo el mismo diseño?
¡Actualizar! 3+ años después ...
¡Puse la solución de sgriffin en un complemento Vim que puede instalar con facilidad! Instálelo con su administrador de complementos favorito y pruébelo: WindowSwap.vim
Respuestas:
Un poco tarde a la publicación, pero me encontré con esto buscando otra cosa. Escribí dos funciones hace un tiempo para marcar una ventana y luego intercambiar buffers entre ventanas. Esto parece ser lo que estás pidiendo.
Simplemente déles una palmada en su .vimrc y asigne las funciones como mejor le parezca:
Para usar (suponiendo que su mapleader esté configurado en \), debería:
Voila! ¡Intercambió buffers sin arruinar el diseño de su ventana!
fuente
noremap
en las asignaciones para que funcione. No estoy seguro de por qué, pero espero que eso ayude a cualquiera que encuentre esto más tarde. : D0r!figlet one
[dos, tres, etc.], luego las probé. Antes de continuar, verifiqué github, encontré su plugin (wes), con intercambios animados de ventana de figlet, y un enlace a esta misma respuesta (que tenía como comentario en mi .vimrc). Sentí que ya lo había hecho y cargado, y luego lo olvidé. De todos modos, buen trabajo! Me ahorra algo de trabajo :)Comenzando con esto:
Convierta 'tres' en la ventana activa, luego emita el comando ctrl+ w J. Esto mueve la ventana actual para llenar la parte inferior de la pantalla, dejándote con:
Ahora haga 'uno' o 'dos' la ventana activa, luego emita el comando ctrl+ w r. Esto 'rota' las ventanas en la fila actual, dejándote con:
Ahora haga que 'dos' sea la ventana activa y emita el comando ctrl+ w H. Esto mueve la ventana actual para llenar la izquierda de la pantalla, dejándote con:
Como puede ver, la maniobra es un poco aleatoria. Con 3 ventanas, es un poco como uno de esos rompecabezas de 'juego de fichas'. No recomiendo probar esto si tiene 4 o más ventanas; sería mejor cerrarlas y luego volver a abrirlas en las posiciones deseadas.
Hice un screencast que demuestra cómo trabajar con ventanas divididas en Vim .
fuente
ctrl-w r
funciona de maravilla. Gracias a ti por el consejo! Aquí está mi +1.\mw
/\pw
como este e intenté usar ambos durante una semana cada uno. Descubrí que usar esta solución "nativa" funciona mejor, ya que no tengo que seguir instalando complementos en las más de doce docenas de instalaciones vim que tengo en servidores y máquinas remotas y computadoras de escritorio, computadoras portátiles, tabletas y todos los demás dispositivos. IOW, aprender estos comandos nativos (por ejemploctrl-w r
) es realmente todo lo que necesita para comprometerse con el músculo de la memoria y listo.Echa un vistazo a
:h ctrl-w_ctrl-x
y / o:h ctrl-w_ctrl-r
. Estos comandos le permiten intercambiar o rotar ventanas en el diseño actual.Editar: en realidad, esto no funcionará en esta situación porque solo se intercambiará en la columna o fila actual. En su lugar, puede ir a cada una de las ventanas y seleccionar el búfer de destino, pero eso es bastante detallado.
fuente
Randy tiene razón en que
CTRL-W x
no quiere intercambiar ventanas que no están en la misma columna / fila.He descubierto que las
CTRL-W HJKL
teclas son más útiles al manipular ventanas. Forzarán su ventana actual fuera de su ubicación actual y le dirán que ocupe todo el borde indicado por la dirección de la tecla que presiona. Ver:help window-moving
para más detalles.Para su ejemplo anterior, si comienza en la ventana "uno", esto hace lo que desea:
Para mayor comodidad, puede asignar las secuencias que necesita a las asignaciones de teclas (consulte
:help mapping
).fuente
Tengo una versión ligeramente mejorada de la solución de sgriffin, puede intercambiar ventanas sin usar dos comandos, pero con comandos intuitivos HJKL.
Así que así es como va:
Intenta mover tu ventana usando HJKL mayúscula en el nodo normal, es realmente genial :)
fuente
La construcción en gran medida sobre la respuesta de @ sgriffin, aquí hay algo aún más cerca de lo que estás pidiendo:
Avíseme si el comportamiento no coincide con sus expectativas.
fuente
También basado en la solución de sgriffin, vaya a la ventana que desea intercambiar, presione
CTRL-w m
, vaya a la ventana con la que desea intercambiar y presioneCTRL-w m
nuevamente.CTRL-w m
es una mala elección mnemotécnica, por lo que si a alguien se le ocurre una mejor, edítela.Además, me gustaría recibir un comentario del script, también conocido como "Ventana marcada. Repita en el objetivo", sin embargo, siendo un novato vimscript, no sé cómo hacerlo.
Todo lo dicho, el guión funciona bien como está
fuente
El siguiente enfoque puede ser conveniente si las funciones no están disponibles por alguna razón (por ejemplo, no es su vim).
Use el
:buffers
comando para encontrar las identificaciones de los buffers abiertos, navegue a la ventana deseada y use comandos como:b 5
abrir un buffer (número de buffer 5 en este caso). Repita dos veces y los contenidos de las ventanas se intercambian."Inventé" este método después de varios intentos de memorizar
ctrl-w-something
secuencias incluso para diseños muy simples como uno-dos-tres en la pregunta original.fuente
Realmente genial, pero mi propuesta para la asignación es utilizar ^ W ^ J en lugar de J (porque todos HJKL ya tienen significados), además también me tiraría en la nueva memoria intermedia, porque en el momento que desea intercambiar tu alrededor probablemente no quiera continuar editando el búfer en el que ya está. Aquí va:
fuente
Todas las respuestas anteriores son geniales, desafortunadamente estas soluciones no funcionan bien en combinación con las ventanas QuickFix o LocationList (encontré este problema al intentar que el búfer de mensaje de error Ale funcionara con esto).
Solución
Por lo tanto, agregué una línea de código adicional para cerrar todas estas ventanas antes de hacer el intercambio.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
El código total que parece;
Créditos para la función de intercambio a Brandon Orther
Por qué es necesario
La razón por la que las funciones de intercambio no funcionan correctamente sin eliminar primero todas las ventanas QuickFix (QF) y LocationList (LL) es porque si el padre del buffer QF / LL se oculta (y no se muestra en ninguna parte de una ventana), el QF La ventana / LL acoplada a ella se elimina. Esto no es un problema en sí mismo, pero cuando la ventana se oculta, todos los números de ventana se reasignan y el intercambio está en mal estado, ya que el número guardado de la primera ventana marcada ya no existe (potencialmente).
Para poner esto en perspectiva:
Primera marca de ventana
Segunda marca de ventana
Primer interruptor de búfer, la ventana uno se llena con el búfer de la ventana tres. Por lo tanto, la ventana QF se elimina ya que ya no tiene ventana principal. Esto reorganiza los números de Windows. Tenga en cuenta que curNum (el número de la segunda ventana seleccionada) apunta a una ventana que ya no existe.
Entonces, al cambiar el segundo búfer, intenta seleccionar la ventana curNum, que ya no existe. Por lo tanto, lo crea y cambia el búfer, lo que da como resultado que una ventana no deseada se abra todavía.
fuente
Enfoque similar a mark-window-then-swap-buffer, pero también le permite reutilizar el último intercambio.
fuente
set hidden
en .vimrc, no es necesario ocultar manualmente los búferes.También podría usar un administrador de ventanas de mosaico como X-monad
fuente