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?


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>


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ć.


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


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.