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.
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.
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ć:
:help window-moving
po więcej informacji.
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.
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. <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>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):
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>
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