Permuter la position de deux fenêtres

29

Disons que la structure actuelle de ma fenêtre est la suivante:

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

L'ordre de A et B n'est pas tout à fait naturel. Ce serait mieux si B était au sommet.

Cependant, si j'y vais <C-w>K, B sera tout en haut de toutes les fenêtres, ce qui n'est pas ce que je veux. Comment puis-je mettre B au-dessus de A, mais pas au-dessus d'une autre fenêtre qui est déjà au-dessus de A?

Et si deux fenêtres sont divisées verticalement, comment puis-je les changer en fractionnement horizontal?

Jason Hu
la source
7
Ce message explique comment faire pivoter les fenêtres. Il s'agit de basculer les séparations de vertical à horizontal.
lcd047
@ lcd047 Ce sont des questions en dehors de ce site. Vaut-il la peine d'écrire une petite réponse ici et d'inclure les liens (qui sont précieux)?
Bernhard
1
@Bernhard Je suppose que c'est une bonne question pour meta .
lcd047
1
@Bernhard Oui . Assurez-vous d'écrire une réponse complète, pas seulement des liens.
Gilles 'SO- arrête d'être méchant'
1
Veuillez ensuite expliquer ce que vous essayez de faire et pourquoi les deux réponses que je vous ai indiquées ne résolvent pas le problème.
lcd047

Réponses:

33

Pour échanger les deux parties d'une fenêtre fractionnée, procédez simplement comme suit: <C-w> <C-r>

modesto
la source
Je peux me tromper, mais votre solution fait tourner les fenêtres, donc avec plus de 2 divisions, le résultat ne sera pas ce que OP recherchait.
statox
Tu as tout à fait raison. L'OP recherchait le s.th. plus compliqué que "permuter les deux parties d'une fenêtre partagée".
modesto
En fait, OP recherche une commande pour permuter deux fenêtres divisées, mais votre solution fait pivoter toutes les fenêtres divisées actuelles. Comme indiqué dans :h CTRL-W_CTRL-R: The second window becomes the first one, the third one becomes the second one, etc.Ainsi, si vous avez 3 divisions, le curseur sur la partie inférieure et appuyez sur <c-w><c-r>la 3e fenêtre sera au-dessus des 2 autres, ce qui n'est pas ce que OP demandait:How can I put B above A, but not above any other window that is already above A?
statox
6

Afin d'échanger des windowpositions, l'effet est équivalent à l'échange de tampons que ces deux fenêtres affichent.
Par exemple, si la fenêtre A a le tampon 2 et la fenêtre B a le tampon 8, vous voudrez aller à la fenêtre A, sélectionnez le tampon 8, puis à la fenêtre B, sélectionnez le tampon 2.

Cette idée m'a inspiré pour l'écrire - et elle est déjà dans ma propre boîte à outils

Code de fonction:

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. Sélectionnez la fenêtre A
  2. Sélectionnez la fenêtre B
  3. :call WinBufSwap()
    Cela échange les tampons dans les deux fenêtres présélectionnées, laissant le curseur dans la fenêtre d'origine.

La sélection des deux fenêtres à échanger à l'avance est le détail clé, car cela est nécessaire pour spécifier pour Vim celles avec lesquelles travailler.

Cometsong
la source
Juste une précision, lorsque vous dites "sélectionnez la fenêtre A, puis B", voulez-vous dire "Mettez l'accent sur A, puis sur B, pour marquer l'ordre des dernières mémoires tampons et fenêtres vues, pour permuter correctement? Ou est-ce que" sélectionner "signifie autre chose que" mettre l'accent sur "?
padawin
Oui exactement: j'utilise «sélectionner» comme «se concentrer sur».
Cometsong
6
CTRL-W x échange la fenêtre courante avec la fenêtre N
                   (par défaut: fenêtre suivante)

( index.txtsection 2.2, "Commandes de fenêtre")

Si A est la fenêtre courante, alors la suivante sera B, vous n'avez donc besoin que <C-w> x

Si B est la fenêtre actuelle (et il y a plus de fenêtres ci-dessous), vous devrez d'abord aller à A, puis échanger: <C-w> k <C-w> x

JigglyNaga
la source
4

Une autre alternative à l'échange de fenêtres ou à l'échange de tampons consiste à marquer des positions (en utilisant des marques majuscules ) dans vos fichiers et à ouvrir ces marques dans les fenêtres de votre choix.

Par exemple, si j'ai deux fichiers, file_A et file_B :

  • Je voudrais aller dans la fenêtre avec file_A et le marquer:mA
  • allez dans la fenêtre avec file_B et marquez-le:mB
  • Ensuite, récupérez la marque de file_A dans cette fenêtre:'A
  • puis revenir à la première fenêtre et aller chercher la marque de file_B là - dedans: 'B.

L'avantage de cette méthode est que, pour une raison quelconque, vous divisez votre volet plus d'une fois et qu'il n'y a pas de logique claire pour les permuter, comme si vous souhaitez permuter les volets à 12 heures et à 7 heures, vous pouvez ' il suffit de faire pivoter les fenêtres, mais vous pouvez facilement échanger les tampons.

Chan Youn
la source
0

Vous pouvez échanger les tampons entre deux fenêtres avec la fonction suivante:

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>

Maintenant, le plus souvent, l'échange de tampons agira techniquement comme l'échange de fenêtres. Parce que vous ne conservez pas manuellement les fenêtres, vous gardez une trace de quelle fenêtre contient quel tampon. Ainsi, la fonction ci-dessus vous aidera dans la plupart des situations.

Klaus
la source