Angenommen, ich habe ein beliebiges Layout von Splits in vim.
____________________
| one | two |
| | |
| |______|
| | three|
| | |
|___________|______|
Gibt es eine Möglichkeit zu tauschen one
und two
und hält das gleiche Layout? In diesem Beispiel ist es einfach, aber ich suche nach einer Lösung, die für komplexere Layouts hilfreich ist.
AKTUALISIEREN:
Ich denke, ich sollte klarer sein. Mein vorheriges Beispiel war eine Vereinfachung des tatsächlichen Anwendungsfalls. Mit einer tatsächlichen Instanz:
Wie könnte ich zwei dieser Teilungen austauschen und dabei das gleiche Layout beibehalten?
Aktualisieren! 3+ Jahre später ...
Ich habe die Lösung von sgriffin in ein Vim-Plugin integriert, das Sie problemlos installieren können! Installieren Sie es mit Ihrem bevorzugten Plugin-Manager und probieren Sie es aus: WindowSwap.vim
Antworten:
Ein bisschen spät zur Post, bin aber auf diese Suche nach etwas anderem gestoßen. Ich habe vor einiger Zeit zwei Funktionen geschrieben, um ein Fenster zu markieren und dann die Puffer zwischen den Fenstern auszutauschen. Dies scheint das zu sein, wonach Sie fragen.
Schlagen Sie diese einfach in Ihre .vimrc und ordnen Sie die Funktionen so zu, wie Sie es für richtig halten:
Zur Verwendung (vorausgesetzt, Ihr Mapleader ist auf \ eingestellt) würden Sie:
Voila! Vertauschte Puffer, ohne Ihr Fensterlayout zu vermasseln!
quelle
noremap
in den Zuordnungen verwenden, damit es funktioniert. Ich weiß nicht warum, aber hoffentlich hilft das jedem, der das später findet. : D0r!figlet one
[zwei, drei usw.] ausgeführt und es dann getestet. Bevor ich weiter ging, überprüfte ich Github, fand Ihr (wes ') Plugin mit animierten Figlet-Fensterwechseln und einem Link zu derselben Antwort (die ich als Kommentar in meiner .vimrc hatte). Ich hatte das Gefühl, ich hätte es bereits gemacht und hochgeladen und es dann vergessen. Wie auch immer, gute Arbeit! Spart mir etwas Arbeit :)Beginnen Sie damit:
Machen Sie 'drei' zum aktiven Fenster und geben Sie den Befehl ctrl+ ein w J. Dadurch wird das aktuelle Fenster so verschoben, dass es den unteren Bildschirmrand ausfüllt. Sie erhalten Folgendes:
Machen Sie nun entweder 'eins' oder 'zwei' zum aktiven Fenster und geben Sie den Befehl ctrl+ ein w r. Dadurch werden die Fenster in der aktuellen Zeile "gedreht", sodass Sie Folgendes erhalten:
Machen Sie nun 'zwei' zum aktiven Fenster und geben Sie den Befehl ctrl+ ein w H. Dadurch wird das aktuelle Fenster so verschoben, dass es den linken Bildschirmrand ausfüllt und Sie Folgendes erhalten:
Wie Sie sehen können, ist das Manöver ein bisschen gemischt. Mit 3 Fenstern ist es ein bisschen wie eines dieser 'Kachelspiel'-Rätsel. Ich empfehle nicht, dies zu versuchen, wenn Sie 4 oder mehr Fenster haben - Sie sollten sie besser schließen, als sie an den gewünschten Positionen wieder zu öffnen.
Ich habe einen Screencast erstellt, der zeigt, wie man mit geteilten Fenstern in Vim arbeitet .
quelle
ctrl-w r
funktioniert wie ein Zauber. Danke an dich für den Tipp! Hier ist meine +1.\mw
/\pw
als auch dieses hochgestuft und versucht, beide jeweils eine Woche lang zu verwenden. Ich fand, dass die Verwendung dieser "nativen" Lösung am besten funktioniert, da ich nicht ständig Plugins für die über vierzehn Dutzend vim-Installationen installieren muss, die ich auf Servern und Remotecomputern und Desktops, Laptops, Tablets und allen anderen Geräten habe. IOW, das Erlernen dieser nativen Befehle (z. B.ctrl-w r
) ist wirklich alles, was Sie brauchen, um sich auf den Gedächtnismuskel einzulassen und fertig zu sein.Schauen Sie sich an
:h ctrl-w_ctrl-x
und / oder:h ctrl-w_ctrl-r
. Mit diesen Befehlen können Sie Fenster im aktuellen Layout austauschen oder drehen.Bearbeiten: In dieser Situation funktioniert dies nicht, da nur die aktuelle Spalte oder Zeile ausgetauscht wird. Sie könnten stattdessen zu jedem der Fenster gehen und den Zielpuffer auswählen, aber das ist ziemlich ausführlich.
quelle
Randy ist richtig darin, dass er
CTRL-W x
keine Fenster tauschen möchte, die sich nicht in derselben Spalte / Zeile befinden.Ich habe festgestellt, dass die
CTRL-W HJKL
Tasten beim Bearbeiten von Fenstern am nützlichsten sind. Sie zwingen Ihr aktuelles Fenster aus seiner aktuellen Position und weisen es an, die gesamte Kante einzunehmen, die durch die Richtung der Taste angezeigt wird, die Sie drücken. Siehe:help window-moving
für weitere Details.Wenn Sie in Ihrem obigen Beispiel im Fenster "Eins" beginnen, tun Sie Folgendes:
Der Einfachheit halber können Sie den Tastenzuordnungen die Sequenzen zuweisen, die Sie benötigen (siehe
:help mapping
).quelle
Ich habe eine leicht verbesserte Version von sgriffins Lösung. Sie können Fenster austauschen, ohne zwei Befehle zu verwenden, aber mit intuitiven HJKL-Befehlen.
Also hier ist, wie es geht:
Versuchen Sie, Ihr Fenster mit Großbuchstaben HJKL im normalen Knoten zu verschieben, es ist wirklich cool :)
quelle
Der Aufbau stark auf @ sgriffin Antwort, hier ist etwas , noch näher an , was Sie fragen nach:
Bitte lassen Sie mich wissen, wenn das Verhalten nicht Ihren Erwartungen entspricht.
quelle
Gehen Sie auch basierend auf der Lösung von sgriffin zu dem Fenster, das Sie tauschen möchten, drücken Sie
CTRL-w m
, gehen Sie zu dem Fenster, mit dem Sie tauschen möchten, und drücken SieCTRL-w m
erneut.CTRL-w m
ist eine schlechte mnemonische Wahl. Wenn also jemand eine bessere findet, bearbeiten Sie diese bitte.Außerdem möchte ich ein Feedback vom Skript erhalten, auch bekannt als "Fenster markiert. Bitte auf Ziel wiederholen". Da ich jedoch ein Vimscript-Neuling bin, weiß ich nicht, wie ich das machen soll.
Alles in allem funktioniert das Skript so wie es ist
quelle
Der folgende Ansatz kann nützlich sein, wenn Funktionen aus irgendeinem Grund nicht verfügbar sind (z. B. nicht Ihr Ziel).
Verwenden Sie den
:buffers
Befehl, um die IDs der geöffneten Puffer herauszufinden, navigieren Sie zum gewünschten Fenster und verwenden Sie den Befehl like:b 5
zum Öffnen eines Puffers (in diesem Fall Puffernummer 5). Wiederholen Sie diesen Vorgang zweimal und der Inhalt der Fenster wird ausgetauscht.Ich habe diese Methode nach mehreren Versuchen "erfunden",
ctrl-w-something
Sequenzen selbst für sehr einfache Layouts wie eins, zwei, drei in der ursprünglichen Frage zu speichern .quelle
Wirklich cool, aber mein Vorschlag für die Zuordnung zu verwenden ist ^ W ^ J anstelle von J (weil alle HJKL bereits Bedeutungen haben), und auch würde ich ziehen in den neuen Puffer, weil durch die Zeit , die Sie um Sie zu tauschen wollen Wahrscheinlich möchten Sie den Puffer, in dem Sie sich bereits befinden, nicht weiter bearbeiten. Hier geht:
quelle
Alle oben genannten Antworten sind großartig. Leider funktionieren diese Lösungen in Kombination mit QuickFix- oder LocationList-Fenstern nicht gut (ich habe dieses Problem ausgeführt, als ich versucht habe, den Ale-Fehlermeldungen-Puffer dazu zu bringen, damit zu funktionieren).
Lösung
Daher habe ich eine zusätzliche Codezeile hinzugefügt, um alle diese Fenster vor dem Austausch zu schließen.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
Der Gesamtcode sieht aus wie;
Credits für die Swap-Funktion an Brandon Orther
Warum es gebraucht wird
Der Grund, warum die Swap-Funktionen nicht ordnungsgemäß funktionieren, ohne zuerst alle QuickFix- (QF) und LocationList- (LL) Fenster zu entfernen, liegt darin, dass das QF ausgeblendet wird (und nirgendwo in einem Fenster angezeigt wird), wenn das übergeordnete Element des QF / LL-Puffers das Get versteckt Das damit gekoppelte / LL-Fenster wird entfernt. Dies ist an sich kein Problem, aber wenn das Fenster ausgeblendet ist, werden alle Fensternummern neu zugewiesen und der Austausch wird durcheinander gebracht, da die gespeicherte Nummer des ersten markierten Fensters (möglicherweise) nicht mehr vorhanden ist.
Um dies in die richtige Perspektive zu rücken:
Erste Fenstermarkierung
Zweite Fenstermarke
Erster Pufferschalter, Fenster eins wird mit dem Puffer von Fenster drei gefüllt. Somit wird das QF-Fenster entfernt, da es kein übergeordnetes Fenster mehr hat. Dadurch werden die Fensternummern neu angeordnet. Beachten Sie, dass curNum (die Nummer des zweitausgewählten Fensters) auf ein Fenster verweist, das nicht mehr existiert.
Beim Umschalten des zweiten Puffers wird versucht, das nicht mehr vorhandene curNum-Fenster auszuwählen. Es erstellt es also und wechselt den Puffer, was dazu führt, dass ein unerwünschtes Fenster noch geöffnet ist.
quelle
Ähnliche Mark-Window-Then-Swap-Buffer-Methode, aber Sie können auch das letzte Swapping wiederverwenden.
quelle
set hidden
in .vimrc bin, müssen die Puffer nicht manuell ausgeblendet werden.Sie können auch einen Kachelfenstermanager wie X-monad verwenden
quelle