Załóżmy, że mam w Vimie dowolny układ podziałów.
____________________
| one | two |
| | |
| |______|
| | three|
| | |
|___________|______|
Czy istnieje sposób, aby zamienić one
a two
i utrzymać ten sam układ? W tym przykładzie jest to proste, ale szukam rozwiązania, które pomoże w bardziej złożonych układach.
AKTUALIZACJA:
Chyba powinienem być bardziej jasny. Mój poprzedni przykład był uproszczeniem faktycznego przypadku użycia. W rzeczywistej instancji:
Jak mogę zamienić dowolne dwa z tych podziałów, zachowując ten sam układ?
Aktualizacja! Ponad 3 lata później ...
Umieściłem rozwiązanie sgriffin we wtyczce Vima, którą możesz łatwo zainstalować! Zainstaluj go ze swoim ulubionym menedżerem wtyczek i wypróbuj: WindowSwap.vim
Odpowiedzi:
Trochę za późno na wpis, ale natknąłem się na to, szukając czegoś innego. Wcześniej napisałem dwie funkcje, aby zaznaczyć okno, a następnie zamienić bufory między oknami. Wydaje się, że o to prosisz.
Wystarczy uderzyć nimi w .vimrc i mapować funkcje według własnego uznania:
Aby użyć (zakładając, że twój klon jest ustawiony na \):
Voila! Zamienione bufory bez zepsucia układu okna!
źródło
noremap
mapowań, aby działało. Nie jestem pewien, dlaczego, ale mam nadzieję, że to pomoże każdemu, kto znajdzie to później. : D0r!figlet one
[dwa, trzy itd.], A następnie przetestowałem. Przed pójściem dalej sprawdziłem github, znalazłem wtyczkę (wes ') z animowanymi zamianami okien figlet i link do tej samej odpowiedzi (którą miałem jako komentarz w moim .vimrc). Czułem, że już to zrobiłem i załadowałem, a potem o tym zapomniałem. W każdym razie, dobra robota! Oszczędza mi trochę pracy :)Począwszy od tego:
Ustaw „trzy” w aktywnym oknie, a następnie wydaj polecenie ctrl+ w J. To przesuwa bieżące okno, wypełniając dolną część ekranu, pozostawiając:
Teraz uaktywnij „jedno” lub „dwa” aktywne okno, a następnie wydaj polecenie ctrl+ w r. To „obraca” okna w bieżącym rzędzie, pozostawiając ci:
Teraz ustaw „dwa” na aktywne okno i wydaj polecenie ctrl+ w H. To przesuwa bieżące okno, wypełniając lewą stronę ekranu, pozostawiając:
Jak widać, manewr jest trochę przetasowany. Z 3 oknami jest to trochę jak jedna z tych łamigłówek. Nie polecam wypróbowania tego, jeśli masz 4 lub więcej okien - lepiej zamknij je, a następnie otwórz je ponownie w pożądanych pozycjach.
Zrobiłem zrzut ekranu pokazujący, jak pracować z podzielonymi oknami w Vimie .
źródło
ctrl-w r
działa jak urok. Dzięki za wskazówkę! Oto moje +1.\mw
/\pw
i próbowałem używać obu przez tydzień każdego. Zauważyłem, że użycie tego „rodzimego” rozwiązania działa najlepiej, ponieważ nie muszę instalować wtyczek w ciągu kilkunastu instalacji vima, które mam na serwerach i zdalnych komputerach i komputerach stacjonarnych, laptopach, tabletach i wszystkich innych urządzeniach. IOW, nauka tych natywnych poleceń (np.ctrl-w r
) Jest naprawdę wszystkim, czego potrzebujesz, aby zaangażować się w pamięć mięśni i wykonać.Spójrz na
:h ctrl-w_ctrl-x
i / lub:h ctrl-w_ctrl-r
. Te polecenia umożliwiają wymianę lub obrócenie okien w bieżącym układzie.Edycja: W rzeczywistości nie zadziała to w tej sytuacji, ponieważ zmieni się tylko w bieżącej kolumnie lub wierszu. Zamiast tego możesz przejść do każdego z okien i wybrać bufor docelowy, ale to dość szczegółowe.
źródło
Randy ma rację,
CTRL-W x
ponieważ nie chce zamieniać okien, które nie znajdują się w tej samej kolumnie / wierszu.Przekonałem się, że
CTRL-W HJKL
klawisze są najbardziej przydatne podczas manipulowania oknami. Zmuszą bieżące okno do opuszczenia bieżącej lokalizacji i powiedzą mu, aby zajmował całą krawędź wskazaną kierunkiem naciśniętego klawisza. Zobacz:help window-moving
po więcej szczegółów.W powyższym przykładzie, jeśli zaczynasz w oknie „jeden”, robi to, co chcesz:
Dla wygody możesz przypisać sekwencje potrzebne do mapowania klawiszy (patrz
:help mapping
).źródło
Mam nieco ulepszoną wersję rozwiązania sgriffin, możesz zamieniać okna bez użycia dwóch poleceń, ale z intuicyjnymi poleceniami HJKL.
Oto, jak to wygląda:
Spróbuj przesunąć okno za pomocą dużego HJKL w normalnym węźle, to jest naprawdę fajne :)
źródło
Opierając się w dużej mierze na odpowiedzi @ sgriffin, oto coś jeszcze bliższego temu, o co prosisz:
Daj mi znać, jeśli zachowanie nie spełnia Twoich oczekiwań.
źródło
Również w oparciu o rozwiązanie sgriffin, przejdź do okna, które chcesz zamienić, naciśnij
CTRL-w m
, przejdź do okna, z którym chcesz zamienić i naciśnijCTRL-w m
ponownie.CTRL-w m
jest złym wyborem mnemonicznym, więc jeśli ktoś wymyśli lepszy, edytuj go.Chciałbym również otrzymać informację zwrotną od skryptu aka „Okno oznaczone. Proszę powtórzyć na celu”, jednak ponieważ jest to noob vimscript, nie wiem, jak to zrobić.
To powiedziawszy, skrypt działa dobrze
źródło
Poniższe podejście może być wygodne, jeśli funkcje z jakiegoś powodu nie są dostępne (na przykład nie jest to twój vim).
Użyj
:buffers
polecenia, aby znaleźć identyfikator otwartych buforów, przejdź do żądanego okna i użyj polecenia, jak:b 5
otworzyć bufor (w tym przypadku bufor numer 5). Powtórz dwa razy, a zawartość okien zostanie zamieniona.„Wynalazłem” tę metodę po kilku próbach zapamiętania
ctrl-w-something
sekwencji nawet dla bardzo prostych układów, takich jak jeden-dwa-trzy w pierwotnym pytaniu.źródło
Naprawdę fajne, ale moja propozycja dla mapowania jest użycie ^ W ^ J zamiast J (ponieważ wszystkie hjkl mają już znaczenia), plus też bym ciągnąć w nowym buforze, ponieważ do czasu chcesz zamienić wokół ciebie prawdopodobnie nie chcesz kontynuować edycji bufora, na którym już jesteś. Tutaj idzie:
źródło
Wszystkie powyższe odpowiedzi są świetne, niestety te rozwiązania nie działają dobrze w połączeniu z oknami QuickFix lub LocationList (uruchomiłem ten problem, próbując zmusić bufor komunikatów o błędach Ale do pracy z tym).
Rozwiązanie
Dlatego dodałem dodatkowy wiersz kodu, aby zamknąć wszystkie te okna przed wykonaniem zamiany.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
Cały kod wygląda;
Kredyty dla funkcji zamiany Brandon Orther
Dlaczego jest to potrzebne
Powodem, dla którego funkcje wymiany nie działają poprawnie bez uprzedniego usunięcia wszystkich okien QuickFix (QF) i LocationList (LL), jest to, że jeśli element nadrzędny bufora QF / LL get jest ukryty (i nigdzie nie pokazano w oknie), QF Połączone z nim okno / LL jest usuwane. Nie jest to problem sam w sobie, ale gdy okno się ukrywa, wszystkie numery okien są ponownie przypisywane, a zamiana jest pomieszana, ponieważ zapisana liczba pierwszego zaznaczonego okna już (potencjalnie) już nie istnieje.
Aby umieścić to w innej perspektywie:
Znak pierwszego okna
Drugi znak okna
Pierwszy przełącznik bufora, okno pierwsze jest wypełnione buforem okna trzeciego. W ten sposób okno QF jest usuwane, ponieważ nie ma już okna nadrzędnego. To zmienia kolejność numerów Windows. Zauważ, że curNum (numer drugiego wybranego okna) wskazuje na okno, które już nie istnieje.
Więc przełączając drugi bufor, próbuje wybrać okno curNum, które już nie istnieje. Tworzy go i przełącza bufor, co powoduje, że jedno niechciane okno jest nadal otwarte.
źródło
Podobne podejście do mark-window-then-swap-buffer, ale pozwala również na ponowne użycie ostatniej zamiany.
źródło
set hidden
plik .vimrc, nie ma potrzeby ręcznego ukrywania buforów.Możesz także użyć menedżera okien kafelkowych, takiego jak X-monad
źródło