¿Es posible saber si una ventana está en la parte inferior o superior, izquierda o derecha?

13

No sé si hay alguna función para verificar la posición de una ventana, quiero decir, ¿se encuentra actualmente en la parte inferior o superior, izquierda o derecha?

__________________________
|           |            |
|           |            |
|  left     |   right    |
|           |            |
|           |            |
|___________|____________|

__________________________
|                        |
|          top           |
|________________________|
|                        |
|         bottom         |
|_______________________ |
Aaron Shen
fuente
¿Que estás tratando de hacer? (Problema XY)
mMontu
Estoy tratando de escribir una función para rotar las divisiones de ventanas a vertical si el diseño actual es horizontal y viceversa cuando solo hay dos ventanas. Así que necesito saber cuál es el diseño actual de las divisiones y dónde está mi ventana actual
Aaron Shen
3
¿Por qué no simplemente usar ctrl-W_L? (o ctrl-W_R)
Vitor
Quiero que sea una función de alternar conveniente, detectará automáticamente el diseño actual y hará la rotación correcta para mí, en lugar de tener que pensarlo en mi cerebro y elegir el comando correcto para usar. Todo lo que necesito hacer es presionar siempre la misma asignación de teclas.
Aaron Shen
@AaronShen Echa un vistazo a los comandos de restauración de la ventana .
muru

Respuestas:

4

Resumiendo los comentarios de la pregunta:

- Estoy tratando de escribir una función para rotar las divisiones de ventana a vertical si el diseño actual es horizontal y viceversa cuando solo hay dos ventanas.

- ¿Por qué no simplemente usar ctrl-W_L? (o ctrl-W_R)

- Quiero que sea una función de alternar conveniente, detectará automáticamente el diseño actual y realizará la rotación correcta para mí, en lugar de tener que pensarlo en mi cerebro y elegir el comando correcto para usar. Todo lo que necesito hacer es siempre presionar la misma asignación de teclas.

Para los diseños que contienen solo dos ventanas, la siguiente función debería funcionar:

function! Rotate()
   " save the original position, jump to the first window
   let initial = winnr()
   exe 1 . "wincmd w"

   wincmd l
   if winnr() != 1
      " succeeded moving to the right window
      wincmd J " make it the bot window
   else
      " cannot move to the right, so we are at the top
      wincmd H " make it the left window
   endif

   " restore cursor to the initial window
   exe initial . "wincmd w"
endfunction

nnoremap <F3> :call Rotate()<CR>
mMontu
fuente
función impresionante, aunque no conozco todos los scripts vim, pero gracias, ¡funciona perfectamente! por cierto, agrego solo una verificación adicional, ya que solo funciona cuando solo hay dos ventanas.
Aaron Shen
6

No creo que haya ninguna forma de verificar esto, desafortunadamente.

Puede haber una manera de hacer una función personalizada que verifique esto: los números de las ventanas siempre están numerados del 1 en la parte superior izquierda a n en la parte inferior derecha. Quizás uno puede utilizar esto combinado con los datos de la geometría a partir de winwidth(), winheight()y los valores de &linesy &columnspara crear el mapa deseado?

Tenga en cuenta que, para ser general, esto debería admitir diseños más complejos. ¿Cuál debería ser la salida si, por ejemplo, el lado izquierdo se divide en dos? Quizás esta es la razón por la cual la función no existe en primer lugar ...

Karl Yngve Lervåg
fuente