342 votes

Comment puis-je échanger les positions des deux fichiers ouverts (en grand écart) dans vim ?

Supposons que j'ai un peu arbitraire de la disposition des fentes dans vim.

____________________
| one       | two  |
|           |      |
|           |______|
|           | three|
|           |      |
|___________|______|

Est-il un moyen de swap one et two et de maintenir la même mise en page? C'est simple dans cet exemple, mais je suis à la recherche d'une solution qui contribuera pour plus de modèles complexes.

Mise à JOUR:

Je suppose que je devrais être plus clair. Mon dernier exemple est une simplification du réel de cas d'utilisation. Avec un exemple: alt text

Comment pourrais-je échanger toutes les deux de ceux-ci se divise, en conservant la même mise en page?

Mise à jour! 3 ans plus tard...

J'ai mis sgriffin de la solution dans un plugin Vim, vous pouvez l'installer avec la facilité! L'installer avec votre favori gestionnaire de plugin et de faire un essai: WindowSwap.vim

a little demo

319voto

nelstrom Points 5996

En commençant par ceci:

____________________
| one       | two  |
|           |      |
|           |______|
|           | three|
|           |      |
|___________|______|

Faire des "trois" de la fenêtre active, puis lancer la commande ctrl-w J. Cela déplace la fenêtre active pour remplir le bas de l'écran, vous laissant avec:

____________________
| one       | two  |
|           |      |
|___________|______|
| three            |
|                  |
|__________________|

Maintenant, faire " un " ou "deux" de la fenêtre active, puis lancer la commande ctrl-w r. Cette "tourne" les fenêtres de la ligne actuelle, vous laissant avec:

____________________
| two       | one  |
|           |      |
|___________|______|
| three            |
|                  |
|__________________|

Maintenant, faire "deux" de la fenêtre active, et la commande ctrl-w H. Cela déplace la fenêtre active pour remplir la gauche de l'écran, vous laissant avec:

____________________
| two       | one  |
|           |      |
|           |______|
|           | three|
|           |      |
|___________|______|

Comme vous pouvez le voir, les manoeuvres est un peu aléatoire. Avec 3 fenêtres, c'est un peu comme un de ces " jeu de tuiles de puzzles. Je n'ai pas recommander d'essayer cette option si vous avez 4 ou plus windows - tu ferais mieux de fermer, puis de les ouvrir à nouveau dans la position souhaitée.

J'ai fait une capture d'écran vidéo démontrant comment travailler avec split windows dans Vim.

235voto

sgriffin Points 1096

Un peu en retard pour le post, mais il est venu à travers cette recherche de quelque chose d'autre. J'ai écrit deux fonctions un certain temps en arrière pour marquer une fenêtre et le remplacement des tampons entre les fenêtres. Cela semble être ce que vous demandez.

Juste mettre ces derniers dans votre .vimrc et cartographier les fonctions de comment vous voyez l'ajustement:

function! MarkWindowSwap()
    let g:markedWinNum = winnr()
endfunction

function! DoWindowSwap()
    "Mark destination
    let curNum = winnr()
    let curBuf = bufnr( "%" )
    exe g:markedWinNum . "wincmd w"
    "Switch to source and shuffle dest->source
    let markedBuf = bufnr( "%" )
    "Hide and open so that we aren't prompted and keep history
    exe 'hide buf' curBuf
    "Switch to dest and shuffle source->dest
    exe curNum . "wincmd w"
    "Hide and open so that we aren't prompted and keep history
    exe 'hide buf' markedBuf 
endfunction

nmap <silent> <leader>mw :call MarkWindowSwap()<CR>
nmap <silent> <leader>pw :call DoWindowSwap()<CR>

À utiliser (en supposant que votre mapleader est définie sur \):

  1. Passer à la fenêtre de marque pour le swap via ctrl-w mouvement
  2. Type \mw
  3. Déplacer vers la fenêtre que vous souhaitez échanger
  4. Type \pw

Voila! Échangé des tampons sans vissage jusqu'à la fenêtre de votre mise en page!

106voto

Randy Morris Points 16975

Jetez un oeil à et/ou . Ces commandes vous permettent d’échanger ou de faire tourner windows dans la disposition actuelle.

Edit : En fait, cela ne fonctionnera pas dans cette situation car il permutera seulement dans la ligne ou la colonne actuelle. Vous pourriez plutôt aller à chacune des fenêtres et sélectionnez le tampon cible, mais c’est assez clair.

37voto

MikeSep Points 3013

Randy est correct en ce que CTRL-W x ne veulent pas de swap de windows qui ne sont pas dans la même colonne/rangée.

J'ai trouvé que l' CTRL-W HJKL clés sont les plus utiles lors de la manipulation de windows. Ils auront la force de votre fenêtre actuelle hors de son emplacement actuel et de dire ce qu'il occupe la totalité de l'arête indiquée par la direction de la touche sur laquelle vous appuyez. Voir :help window-moving pour plus de détails.

Pour ton exemple ci-dessus, si vous commencez dans la fenêtre "on", ce n'est ce que vous voulez:

CTRL-W K   # moves window "one" to be topmost,
           #   stacking "one", "two", "three" top to bottom
CTRL-W j   # moves cursor to window "two"
CTRL-W H   # moves window "two" to be leftmost,
           #   leaving "one" and "three" split at right

Pour plus de commodité, vous pouvez affecter les séquences que vous devez mappages de touches (voir :help mapping).

11voto

Pencilcheck Points 434

J’ai une version légèrement améliorée de la solution de sgriffin, vous pouvez remplacer windows sans utiliser les deux commandes, mais avec des commandes intuitives HANDOU.

Voici donc comment ça se passe :

Essayez de déplacer votre fenêtre à l’aide de capital HANDOU en nœud normal, c’est vraiment cool  :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X