Jak wymieniać pliki między oknami w VIM?

123

Kiedy pracuję z VIMem, zawsze mam widocznych wiele okien. Czasami chciałbym mieć łatwy sposób, żeby miejscami zamienić te okna. Czy jest jakaś wtyczka, makro itp., Które to ułatwią? Przy okazji, używam MiniBufExplorer.

mdrozdziel
źródło
2
Czy przez „zamianę tych okien miejscami” masz na myśli „otwarcie bufora znajdującego się w oknie A w oknie B i odwrotnie, bez zmiany pozycji okien”?
hcs42
1
Tak, właśnie tego chcę.
mdrozdziel

Odpowiedzi:

304

Istnieje kilka przydatnych poleceń, które zapewniają pewną kontrolę, ale nie są one wyczerpujące. Najważniejsze z nich to:

  • Ctrl- W, r(tj. przytrzymaj CTRL, naciśnij W, zwolnij CTRL, naciśnij r) - który obraca okna (pierwsze okno staje się drugim, drugie trzecim itd.)

  • Ctrl- W, x- zamienia bieżące okno na następne

  • Ctrl- W, Shift- H- przesuń to okno maksymalnie w lewo

  • Ctrl- W, Shift- K- przesuń to okno na górę

(i podobnie dla Ctrl- W, Shift- Ji Ctrl- W, Shift- L). Widzieć:

:help window-moving

po więcej informacji.

DrAl
źródło
16
To powinna być „najlepsza odpowiedź” - natywna funkcjonalność, a nie niestandardowy Vimscript.
David Rivers,
1
Nie do końca, nie. Istnieje wiele przypadków użycia, których nie można wykonać za pomocą wbudowanego zarządzania oknami bez niszczenia i ponownego tworzenia okien. Skrypt wymiany buforów umożliwia takie przypadki użycia.
bobpaul
zwróć uwagę, że działa również ctl-w. ctl-W zamknie okna w niektórych emulatorach terminali.
datakid
7

Napisałem i używam następującego fragmentu kodu w moim vimrc do kopiowania i wklejania moich okien Vima.

Definiuje na przykład następujące skróty:

  • <c-w>y: "Yanks the window", tj. Przechowuje numer bufora w bieżącym oknie w zmiennej globalnej.
  • <c-w>pp: "Umieszcza okno w miejscu bieżącego okna", tzn. Odczytuje numer bufora zapisanego poprzednio i otwiera ten bufor w bieżącym oknie. Przechowuje również numer bufora, który znajdował się w bieżącym oknie.

Jeśli przez „zamianę okien w miejscach” masz na myśli „otwarcie bufora w oknie A w oknie B i odwrotnie, bez zmiany położenia okien”, możesz użyć następującej sekwencji klawiszy, aby zamienić okna:

  1. Wybierz okno A (za pomocą myszy lub poleceń klawiaturowych)
  2. Naciśnij <c-w>y(szarpiąc numer bufora)
  3. Wybierz okno B
  4. Naciśnij <c-w>pp(wklejanie bufora)
  5. Wybierz okno A
  6. Naciśnij <c-w>pp(ponowne wklejanie bufora)

Działa tylko w Vimie> = 7.0.

if version >= 700
function! HOpen(dir,what_to_open)

    let [type,name] = a:what_to_open

    if a:dir=='left' || a:dir=='right'
        vsplit
    elseif a:dir=='up' || a:dir=='down'
        split
    end

    if a:dir=='down' || a:dir=='right'
        exec "normal! \<c-w>\<c-w>"
    end

    if type=='buffer'
        exec 'buffer '.name
    else
        exec 'edit '.name
    end
endfunction

function! HYankWindow()
    let g:window = winnr()
    let g:buffer = bufnr('%')
    let g:bufhidden = &bufhidden
endfunction

function! HDeleteWindow()
    call HYankWindow()
    set bufhidden=hide
    close
endfunction

function! HPasteWindow(direction)
    let old_buffer = bufnr('%')
    call HOpen(a:direction,['buffer',g:buffer])
    let g:buffer = old_buffer
    let &bufhidden = g:bufhidden
endfunction

noremap <c-w>d :call HDeleteWindow()<cr>
noremap <c-w>y :call HYankWindow()<cr>
noremap <c-w>p<up> :call HPasteWindow('up')<cr>
noremap <c-w>p<down> :call HPasteWindow('down')<cr>
noremap <c-w>p<left> :call HPasteWindow('left')<cr>
noremap <c-w>p<right> :call HPasteWindow('right')<cr>
noremap <c-w>pk :call HPasteWindow('up')<cr>
noremap <c-w>pj :call HPasteWindow('down')<cr>
noremap <c-w>ph :call HPasteWindow('left')<cr>
noremap <c-w>pl :call HPasteWindow('right')<cr>
noremap <c-w>pp :call HPasteWindow('here')<cr>
noremap <c-w>P :call HPasteWindow('here')<cr>

endif
hcs42
źródło
4

Mniej więcej w tym samym czasie zadałem podobne pytanie : chciałem konkretnie zamienić okna bez zmiany arbitralnie skomplikowanego układu. Skończyło się na stworzeniu wtyczki vim z jednego z sugerowanych rozwiązań. Nazywa się WindowSwap.vim ; zainstaluj go za pomocą preferowanego menedżera wtyczek vim i daj mu wir.

Dzięki WindowSwap.vim po prostu

  1. <Leader>yw szarpnąć okno.
  2. Przenieś kursor do innego okna.
  3. <Leader>pw wkleić to okno, zamieniając je pozycją pierwszego.

Kluczowe kombinacje można oczywiście skonfigurować według własnych preferencji.

wes
źródło
1

Tak jak <c-w>rlub <c-w>xma ograniczenie, że nie można obracać ani zamieniać okien, gdy są mieszane pionowe i poziome podziały okien. I <c-w>Hmoże sprawić, że układ okna zmieni się poza twoje oczekiwania, zwłaszcza gdy masz wiele okien.

Możesz więc wykonać trochę pracy, aby zaspokoić swoje szczególne potrzeby przełączania okna / bufora. Oto przykład przełączania bieżącego okna na lewe górne okno (zwykle robię je zmaksymalizowane w pionie):

function! SwitchMainWindow()
  let l:current_buf = winbufnr(0)
  exe "buffer" . winbufnr(1)
  1wincmd w
  exe "buffer" . l:current_buf
endfunction
nnoremap <c-w><c-e> :call SwitchMainWindow()<cr>
Bohr
źródło
1

Moim zdaniem http://vimcasts.org/episodes/working-with-windows/ ma idealną odpowiedź na to pytanie. W skrócie:

  • ctrl-w w cyklicznie między otwartymi oknami
  • ctrl-w h skup okno na lewo
  • ctrl-w j skieruj okno na dół
  • ctrl-w k skoncentruj okno na górę
  • ctrl-w l skup okno na prawo
  • ctrl-w r obrócić wszystkie okna
  • ctrl-w x zamienić bieżące okno z jego sąsiadem
  • ctrl-w H przesuń bieżące okno do skrajnej lewej strony
  • ctrl-w J przenieś bieżące okno na dół
  • ctrl-w K przenieś bieżące okno na górę
  • ctrl-w L przenieś bieżące okno do końca w prawo
Aman Dogra
źródło
3
Jaki jest powód dodania odpowiedzi, która nie wnosi do wpisu nowych przydatnych informacji? Na to doskonale odpowiedziano 6 lat temu. Robisz kampanię reklamową dla vimcastów?
mdrozdziel
@mdrozdziel Doceniam tę odpowiedź 9 lat po OP. Najbardziej zwięzła odpowiedź zawierająca tylko te informacje, które chciałem.
roro