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.
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:
Wybierz okno A (za pomocą myszy lub poleceń klawiaturowych)
Naciśnij <c-w>y(szarpiąc numer bufora)
Wybierz okno B
Naciśnij <c-w>pp(wklejanie bufora)
Wybierz okno A
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
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
<Leader>yw szarpnąć okno.
Przenieś kursor do innego okna.
<Leader>pw wkleić to okno, zamieniając je pozycją pierwszego.
Kluczowe kombinacje można oczywiście skonfigurować według własnych preferencji.
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):
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.
Odpowiedzi:
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ć:
po więcej informacji.
źródło
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:
<c-w>y
(szarpiąc numer bufora)<c-w>pp
(wklejanie bufora)<c-w>pp
(ponowne wklejanie bufora)Działa tylko w Vimie> = 7.0.
źródło
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
<Leader>yw
szarpnąć okno.<Leader>pw
wkleić to okno, zamieniając je pozycją pierwszego.Kluczowe kombinacje można oczywiście skonfigurować według własnych preferencji.
źródło
Tak jak
<c-w>r
lub<c-w>x
ma ograniczenie, że nie można obracać ani zamieniać okien, gdy są mieszane pionowe i poziome podziały okien. I<c-w>H
moż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):
źródło
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 oknamictrl-w h
skup okno na lewoctrl-w j
skieruj okno na dółctrl-w k
skoncentruj okno na góręctrl-w l
skup okno na prawoctrl-w r
obrócić wszystkie oknactrl-w x
zamienić bieżące okno z jego sąsiademctrl-w H
przesuń bieżące okno do skrajnej lewej stronyctrl-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źródło