Zamień pozycję dwóch okien

29

Powiedz, że jest to bieżąca struktura mojego okna:

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

Kolejność A i B nie jest całkiem naturalna. Byłoby lepiej, gdyby B był na górze.

Jeśli jednak przejdę <C-w>K, B będzie na samym szczycie wszystkich okien, co nie jest tym, czego chcę. Jak mogę umieścić B powyżej A, ale nie powyżej żadnego innego okna, które jest już powyżej A?

A jeśli dwa okna są podzielone w pionie, jak mogę je zmienić na poziomy?

Jason Hu
źródło
7
W tym poście wyjaśniono, jak obracać okna. Chodzi o przełączanie podziałów z pionowego na poziomy.
lcd047
@ lcd047 To są pytania spoza tej strony. Czy warto tutaj napisać krótką odpowiedź i dołączyć linki (które są cenne)?
Bernhard
1
@Bernhard Myślę, że to dobre pytanie dla meta .
lcd047
1
@Bernhard Tak . Pamiętaj, aby napisać pełną odpowiedź, a nie tylko linki.
Gilles „SO- przestań być zły”
1
Następnie wyjaśnij, co próbujesz zrobić i dlaczego dwie odpowiedzi, które wskazałem, aby nie rozwiązać problemu.
lcd047

Odpowiedzi:

33

Aby zamienić dwie części podzielonego okna, po prostu wykonaj: <C-w> <C-r>

modesto
źródło
Mogę się mylić, ale twoje rozwiązanie obraca okna, więc przy więcej niż 2 podziale wynik nie będzie tego, czego szukał OP.
statox
Masz absolutną rację. OP szukał s.th. bardziej skomplikowane niż „zamiana dwóch części podzielonego okna”.
modesto
Właściwie OP szuka polecenia, aby zamienić dwa podzielone okna, ale twoje rozwiązanie obróci wszystkie obecne podzielone okna. Jak stwierdzono w :h CTRL-W_CTRL-R: The second window becomes the first one, the third one becomes the second one, etc.Tak więc, jeśli masz 3 podziały, kursor na dolnym i uderzy <c-w><c-r>w trzecie okno będzie na szczycie dwóch pozostałych, o które OP nie prosił:How can I put B above A, but not above any other window that is already above A?
statox
6

W celu zamiany windowpozycji efekt jest równoważny buforom wymiany wyświetlanym przez te dwa okna.
np. jeśli okno A ma bufor 2, a okno B ma bufor 8, będziesz chciał przejść do okna A, wybierz bufor 8, a następnie do okna B, wybierz bufor 2.

Ten pomysł zainspirował mnie do napisania skryptu - i jest już w moim własnym zestawie narzędzi

Kod funkcji:

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. Wybierz okno A
  2. Wybierz okno B
  3. :call WinBufSwap()
    Spowoduje to zamianę buforów w dwóch wstępnie wybranych oknach, pozostawiając kursor w oryginalnym oknie.

Wybór dwóch pożądanych okien, które mają zostać zamienione przed czasem, jest kluczowym szczegółem, ponieważ jest to konieczne, aby określić dla Vima, z którymi z nich pracować.

Pieśń Komiczna
źródło
Po prostu precyzja, kiedy mówisz „wybierz okno A, a następnie B”, masz na myśli „Skoncentruj się na A, a następnie na B, aby zaznaczyć kolejność ostatnio widzianych buforów i okien, aby poprawnie zamienić? Czy też” wybrać „znaczy coś innego niż„ skoncentrować się na ”?
padawin
Tak, dokładnie: używam „select” jako „focus on”.
Cometsong
6
CTRL-W x zmień bieżące okno z oknem N
                   (domyślnie: następne okno)

( index.txtsekcja 2.2, „Polecenia okna”)

Jeśli bieżącym oknem jest A, następnym będzie B, więc potrzebujesz tylko <C-w> x

Jeśli B to bieżące okno (a poniżej jest więcej okien), najpierw musisz przejść do A, a następnie wymienić: <C-w> k <C-w> x

JigglyNaga
źródło
4

Inną alternatywą do zamiany okien lub zamiany buforów jest oznaczanie pozycji (przy użyciu wielkich liter ) w plikach i otwieranie tych znaków w wybranych oknach.

Na przykład, jeśli mam dwa pliki, file_A i file_B :

  • Przejdę do okna z plikiem file_A i oznaczę :mA
  • przejdź do okna z plikiem file_B i zaznacz to:mB
  • Następnie pobierz znak file_A do tego okna:'A
  • następnie wróć do pierwszego okna i sprowadzić znamię file_B tam: 'B.

Zaletą tej metody jest to, że z jakiegoś powodu dzielisz panel więcej niż raz i nie ma jasnej logiki zamiany, na przykład jeśli chcesz zamienić panele o godzinie 12 i 7, możesz ' po prostu obróć okna, ale możesz łatwo zamienić bufory.

Chan Youn
źródło
0

Możesz zamienić bufory między dwoma oknami za pomocą następującej funkcji:

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>

Teraz najczęściej zamiana buforów będzie technicznie zachowywać się jak zamiana okien. Ponieważ nie śledzisz ręcznie okien, monitorujesz, które okno przechowuje bufor. Tak więc powyższa funkcja pomoże ci w większości sytuacji.

klaus
źródło