Supposons que j'ai une disposition arbitraire des divisions dans vim.
____________________
| one | two |
| | |
| |______|
| | three|
| | |
|___________|______|
Est - il un moyen d'échanger one
et two
et maintenir la même mise en page? C'est simple dans cet exemple, mais je cherche une solution qui aidera pour des mises en page plus complexes.
METTRE À JOUR:
Je suppose que je devrais être plus clair. Mon exemple précédent était une simplification du cas d'utilisation réel. Avec une instance réelle:
Comment pourrais-je échanger deux de ces divisions, en conservant la même disposition?
Mettre à jour! Plus de 3 ans plus tard ...
J'ai mis la solution de sgriffin dans un plugin Vim que vous pouvez installer facilement! Installez-le avec votre gestionnaire de plugins préféré et essayez-le: WindowSwap.vim
Réponses:
Un peu tard pour le poste, mais je suis tombé sur cette recherche d'autre chose. J'ai écrit deux fonctions depuis un certain temps pour marquer une fenêtre, puis permuter les tampons entre les fenêtres. Cela semble être ce que vous demandez.
Il suffit de les gifler dans votre .vimrc et de cartographier les fonctions comme bon vous semble:
Pour utiliser (en supposant que votre mapleader est défini sur \), vous devez:
Voila! Tampons échangés sans visser la disposition de vos fenêtres!
la source
noremap
dans les mappages pour le faire fonctionner. Je ne sais pas pourquoi, mais j'espère que cela aidera toute personne qui trouvera cela plus tard. : D0r!figlet one
[deux, trois, etc.], puis je l'ai testée. Avant d'aller plus loin, j'ai vérifié github, trouvé votre plugin (wes), avec des échanges de fenêtres de figlet animés, et un lien vers cette même réponse (que j'avais en commentaire dans mon .vimrc). J'avais l'impression de l'avoir déjà fait et téléchargé, puis je l'ai oublié. Bref, beau travail! Me fait économiser du travail :)En commençant par ceci:
Faites «trois» la fenêtre active, puis lancez la commande ctrl+ w J. Cela déplace la fenêtre actuelle pour remplir le bas de l'écran, vous laissant avec:
Faites maintenant «un» ou «deux» la fenêtre active, puis lancez la commande ctrl+ w r. Cela `` fait pivoter '' les fenêtres de la ligne actuelle, vous laissant avec:
Maintenant, faites «deux» la fenêtre active et lancez la commande ctrl+ w H. Cela déplace la fenêtre actuelle pour remplir la gauche de l'écran, vous laissant avec:
Comme vous pouvez le voir, la manouevre est un peu aléatoire. Avec 3 fenêtres, c'est un peu comme un de ces puzzles de «jeu de tuiles». Je ne recommande pas d'essayer ceci si vous avez 4 fenêtres ou plus - vous feriez mieux de les fermer puis de les rouvrir dans les positions souhaitées.
J'ai fait une capture d'écran montrant comment travailler avec des fenêtres fractionnées dans Vim .
la source
ctrl-w r
ça fonctionne comme un charme. Merci à vous pour l'astuce! Voici mon +1.\mw
/\pw
et celui-ci et essayé d'utiliser les deux pendant une semaine chacun. J'ai trouvé que l'utilisation de cette solution «native» fonctionnait mieux, car je n'ai pas à continuer d'installer des plugins sur les douze douzaines d'installations vim que j'ai sur les serveurs et les machines et ordinateurs distants, les ordinateurs de bureau, les ordinateurs portables, les tablettes et tous les autres appareils. IOW, l'apprentissage de ces commandes natives (par exemplectrl-w r
) est vraiment tout ce dont vous avez besoin pour vous engager dans la mémoire musculaire et terminer.Jetez un oeil à
:h ctrl-w_ctrl-x
et / ou:h ctrl-w_ctrl-r
. Ces commandes vous permettent d'échanger ou de faire pivoter des fenêtres dans la disposition actuelle.Modifier: En fait, cela ne fonctionnera pas dans cette situation, car il ne fera qu'échanger dans la colonne ou la ligne actuelle. Vous pouvez à la place aller dans chacune des fenêtres et sélectionner le tampon cible, mais c'est assez détaillé.
la source
Randy a raison de
CTRL-W x
ne pas vouloir échanger les fenêtres qui ne sont pas dans la même colonne / ligne.J'ai trouvé que les
CTRL-W HJKL
touches sont les plus utiles lors de la manipulation de fenêtres. Ils forceront votre fenêtre actuelle hors de son emplacement actuel et lui diront d'occuper tout le bord indiqué par la direction de la touche sur laquelle vous appuyez. Voir:help window-moving
pour plus de détails.Pour votre exemple ci-dessus, si vous démarrez dans la fenêtre "un", cela fait ce que vous voulez:
Pour plus de commodité, vous pouvez affecter les séquences dont vous avez besoin aux mappages de touches (voir
:help mapping
).la source
J'ai une version légèrement améliorée de la solution de sgriffin, vous pouvez échanger des fenêtres sans utiliser deux commandes, mais avec des commandes HJKL intuitives.
Voici donc comment ça se passe:
Essayez de déplacer votre fenêtre en utilisant HJKL majuscule dans le noeud normal, c'est vraiment cool :)
la source
S'appuyant fortement sur la réponse de @ sgriffin, voici quelque chose d'encore plus proche de ce que vous demandez:
Veuillez me faire savoir si le comportement ne correspond pas à vos attentes.
la source
Également basé sur la solution de sgriffin, accédez à la fenêtre que vous souhaitez permuter, appuyez sur
CTRL-w m
, accédez à la fenêtre avec laquelle vous souhaitez permuter et appuyez àCTRL-w m
nouveau.CTRL-w m
est un mauvais choix mnémotechnique, donc si quelqu'un en trouve un meilleur, veuillez le modifier.De plus, j'aimerais recevoir un retour du script alias "Fenêtre marquée. Veuillez répéter sur la cible", mais étant un noob vimscript, je ne sais pas comment faire.
Cela dit, le script fonctionne bien tel quel
la source
L'approche suivante peut être pratique si les fonctions ne sont pas disponibles pour une raison quelconque (par exemple, ce n'est pas votre vim).
Utilisez la
:buffers
commande pour trouver les identifiants des tampons ouverts, accédez à la fenêtre souhaitée et utilisez la commande comme:b 5
pour ouvrir un tampon (tampon numéro 5 dans ce cas). Répétez deux fois et le contenu des fenêtres est échangé.J'ai "inventé" cette méthode après plusieurs tentatives de mémorisation de
ctrl-w-something
séquences même pour des mises en page très simples comme un-deux-trois en question originale.la source
Vraiment cool, mais ma proposition de cartographie est d'utiliser ^ W ^ J au lieu de J (parce que tous ont déjà HJKL significations), plus aussi je aimerais tirer dans le nouveau tampon, parce que le temps que vous voulez échanger autour de vous vous ne voulez probablement pas continuer à éditer le tampon sur lequel vous êtes déjà. Voici:
la source
Toutes les réponses ci-dessus sont excellentes, malheureusement ces solutions ne fonctionnent pas bien en combinaison avec les fenêtres QuickFix ou LocationList (j'ai rencontré ce problème en essayant d'obtenir le tampon de message d'erreur Ale pour fonctionner avec cela).
Solution
J'ai donc ajouté une ligne de code supplémentaire pour fermer toutes ces fenêtres avant de faire le swap.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
Le code total ressemble à;
Crédits pour la fonction swap à Brandon Orther
Pourquoi est-il nécessaire
La raison pour laquelle les fonctions d'échange ne fonctionnent pas correctement sans supprimer toutes les fenêtres QuickFix (QF) et LocationList (LL) est d'abord parce que si le parent du tampon QF / LL est get caché (et nulle part affiché dans une fenêtre), le QF / La fenêtre LL qui lui est couplée est supprimée. Ce n'est pas un problème en soi, mais lorsque la fenêtre se cache, tous les numéros de fenêtre sont réaffectés et l'échange est foiré car le numéro enregistré de la première fenêtre marquée n'existe (potentiellement) plus.
Pour mettre cette perspective en perspective:
Première marque de fenêtre
Deuxième marque de fenêtre
Premier commutateur de tampon, la fenêtre un est remplie du tampon de la fenêtre trois. Ainsi, la fenêtre QF est supprimée car elle n'a plus de fenêtre parente. Cela réorganise les numéros de fenêtres. Notez que curNum (le numéro de la deuxième fenêtre sélectionnée) pointe vers une fenêtre qui n'existe plus.
Ainsi lors du basculement du second buffer, il essaie de sélectionner la fenêtre curNum, qui n'existe plus. Ainsi, il le crée et commute le tampon, ce qui entraîne l'ouverture d'une fenêtre indésirable.
la source
Approche Mark-Window-Then-Swap-Buffer similaire, mais vous permet également de réutiliser le dernier échange.
la source
set hidden
en .vimrc, il n'est pas nécessaire de masquer manuellement les tampons.Vous pouvez également utiliser un gestionnaire de fenêtres en mosaïque comme X-monad
la source