Cambiar la posición de dos ventanas

29

Digamos que la siguiente es la estructura actual de mi ventana:

+ ----- + ----------------------------
El | El |
El | A |
El | El |
+ ----- +
El | El |
El | B |

El orden de A y B no es del todo natural. Sería mejor si B estuviera arriba.

Sin embargo, si voy <C-w>K, B será la parte superior de todas las ventanas, que no es lo que quiero. ¿Cómo puedo poner B sobre A, pero no sobre cualquier otra ventana que ya esté sobre A?

Y si dos ventanas están divididas verticalmente, ¿cómo puedo cambiarlas para dividirlas horizontalmente?

Jason Hu
fuente
77
Esta publicación explica cómo rotar ventanas. Se trata de cambiar las divisiones de vertical a horizontal.
lcd047
@ lcd047 Estas son preguntas fuera de este sitio. ¿Vale la pena escribir una pequeña respuesta aquí e incluir los enlaces (que son valiosos)?
Bernhard
1
@Bernhard Supongo que esta es una buena pregunta para meta .
lcd047
1
@Bernhard . Asegúrese de escribir una respuesta completa, no solo enlaces.
Gilles 'SO- deja de ser malvado'
1
Luego, explique qué está tratando de hacer y por qué las dos respuestas que le indiqué no abordan el problema.
lcd047

Respuestas:

33

Para intercambiar las dos partes de una ventana dividida simplemente haga: <C-w> <C-r>

Modesto
fuente
Puedo estar equivocado, pero su solución gira las ventanas, por lo que con más de 2 divisiones, el resultado no será lo que OP estaba buscando.
statox
Tienes toda la razón. El OP estaba buscando algo. más complicado que "intercambiar las dos partes de una ventana dividida".
modos al
En realidad, OP está buscando un comando para intercambiar dos ventanas divididas, pero su solución gira todas las ventanas divididas actuales. Como se indica en :h CTRL-W_CTRL-R: The second window becomes the first one, the third one becomes the second one, etc.Por lo tanto, si tiene 3 divisiones, el cursor en la parte inferior y presione <c-w><c-r>la tercera ventana estará encima de las otras 2, que no es lo que OP estaba pidiendo:How can I put B above A, but not above any other window that is already above A?
statox
6

Para intercambiar windowposiciones, el efecto es equivalente a intercambiar buffers que muestran esas dos ventanas.
Por ejemplo, si la ventana A tiene el buffer 2 y la ventana B tiene el buffer 8, querrá ir a la Ventana A, seleccionar el buffer 8, luego a la Ventana B, seleccionar el buffer 2.

Esta idea me inspiró a escribirlo, y también está en mi propia caja de herramientas.

Código de función:

function! WinBufSwap()
  let thiswin = winnr()
  let thisbuf = bufnr("%")
  let lastwin = winnr("#")
  let lastbuf = winbufnr(lastwin)

  exec  lastwin . " wincmd w" ."|".
      \ "buffer ". thisbuf ."|".
      \ thiswin ." wincmd w" ."|".
      \ "buffer ". lastbuf
endfunction

command! Wswap :call WinBufSwap()
map <Leader>bs <C-c>:call WinBufSwap()<CR>
  1. Seleccionar ventana A
  2. Seleccionar ventana B
  3. :call WinBufSwap()
    Esto intercambia los búferes en las dos ventanas preseleccionadas, dejando el cursor en la ventana original.

La selección de las dos ventanas deseadas para intercambiar con anticipación es el detalle clave, ya que es necesario para especificar para Vim con cuáles trabajar.

Cometsong
fuente
Solo una precisión, cuando dice "seleccione la ventana A, luego B", ¿quiere decir "Tener el foco en A, luego en B, para marcar el orden de los últimos buffers y ventanas vistos, para intercambiar correctamente? ¿O" seleccione "significar algo más que" tener el foco "
padawin
Sí exactamente: estoy usando "select" como "focus on".
Cometsong
6
CTRL-W x intercambiar ventana actual con ventana N
                   (predeterminado: siguiente ventana)

( index.txtsección 2.2, "Comandos de la ventana")

Si A es la ventana actual, la siguiente será B, por lo que solo necesita <C-w> x

Si B es la ventana actual (y hay más ventanas a continuación), primero tendrá que ir a A, luego intercambiar: <C-w> k <C-w> x

JigglyNaga
fuente
4

Otra alternativa para intercambiar ventanas o intercambiar los buffers es marcar posiciones (usando mayúsculas ) en sus archivos y abrir esas marcas en las ventanas que elija.

Por ejemplo, si tengo dos archivos, archivo_A y archivo_B :

  • Iría a la ventana con file_A y lo marcaría:mA
  • vaya a la ventana con file_B y márquelo :mB
  • Luego busque la marca del archivo_A en esa ventana:'A
  • a continuación, volver a la primera ventana y buscar la marca de file_B allí: 'B.

La ventaja de este método es si, por alguna razón, divide su panel más de una vez y no hay una lógica clara para intercambiarlos, como si desea intercambiar los paneles a las 12 en punto y a las 7 en punto, puede ' No solo gire las ventanas, pero puede cambiar fácilmente los búferes.

Chan Youn
fuente
0

Puede intercambiar las memorias intermedias entre dos ventanas con la siguiente función:

function! SwitchWindow(count) abort
    let l:current_buf = winbufnr(0)
    exe "buffer" . winbufnr(a:count)
    exe a:count . "wincmd w"
    exe "buffer" . l:current_buf
    wincmd p
endfunction
nnoremap <C-w>x :<C-u>call SwitchWindow(v:count1)<CR>

Ahora, con mayor frecuencia, el intercambio de las memorias intermedias técnicamente actuará como el intercambio de ventanas. Como no realiza un seguimiento manual de las ventanas, realiza un seguimiento de qué ventana contiene qué búfer. Por lo tanto, la función anterior lo ayudará en la mayoría de las situaciones.

Klaus
fuente