Quando lavoro con VIM, ho sempre più finestre visibili. A volte mi piacerebbe avere un modo semplice, per scambiare quelle finestre in alcuni punti. Esistono plugin, macro, ecc. Per renderlo più semplice? A proposito, io uso MiniBufExplorer.
Quando lavoro con VIM, ho sempre più finestre visibili. A volte mi piacerebbe avere un modo semplice, per scambiare quelle finestre in alcuni punti. Esistono plugin, macro, ecc. Per renderlo più semplice? A proposito, io uso MiniBufExplorer.
Risposte:
Ci sono alcuni comandi utili incorporati che ti danno una certa quantità di controllo, ma non sono completi. I principali sono:
Ctrl- W, r(cioè tieni premuto CTRL, premi W, rilascia CTRL, premi r) - che ruota le finestre (la prima finestra diventa la seconda, la seconda diventa la terza, ecc.)
Ctrl- W, x- scambia la finestra corrente con quella successiva
Ctrl- W, Shift- H- sposta questa finestra all'estrema sinistra
Ctrl- W, Shift- K- sposta questa finestra in alto
(e allo stesso modo per Ctrl- W, Shift- Je Ctrl- W, Shift- L). Vedere:
:help window-moving
per maggiori informazioni.
Ho scritto e ho utilizzato il seguente frammento di codice nel mio vimrc per copiare e incollare le mie finestre Vim.
Questo definisce ad esempio le seguenti scorciatoie:
<c-w>y
: "Yanks the window", cioè memorizza il numero del buffer nella finestra corrente in una variabile globale.<c-w>pp
: "Mette la finestra al posto della finestra corrente", cioè legge il numero di buffer memorizzato in precedenza e apre quel buffer nella finestra corrente. Memorizza anche il numero del buffer che si trovava nella finestra corrente.Se per "scambiare quelle finestre in posti", intendi "aprire il buffer nella finestra A nella finestra B, e viceversa, senza cambiare la posizione delle finestre", puoi usare la seguente sequenza di tasti per scambiare le finestre:
<c-w>y
(strappando il numero del buffer)<c-w>pp
(incollare il buffer)<c-w>pp
(incollando di nuovo il buffer)Funziona solo in Vim> = 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
Ho posto una domanda simile nello stesso periodo: volevo un modo per scambiare le finestre in modo specifico senza alterare un layout arbitrariamente complicato. Ho finito per creare un plugin vim da una delle soluzioni suggerite. Si chiama WindowSwap.vim ; installalo con il tuo gestore di plug-in vim preferito e fai un giro.
Con WindowSwap.vim, dovresti semplicemente
<Leader>yw
per strappare una finestra. <Leader>pw
per incollare quella finestra, scambiandola con la posizione della prima.Le combinazioni di tasti sono ovviamente configurabili in base alle tue preferenze.
Come <c-w>r
o <c-w>x
ha una restrizione che non è possibile ruotare o scambiare finestre Quando le divisioni delle finestre verticali e orizzontali sono mescolate. E <c-w>H
può far cambiare il layout della finestra oltre le tue aspettative, specialmente quando hai molte finestre.
Quindi potresti fare del lavoro per soddisfare le tue particolari esigenze di cambio finestra / buffer. Ecco un esempio per cambiare la finestra corrente con la finestra in alto a sinistra (in genere la ingrandisco verticalmente):
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>
A mio parere, http://vimcasts.org/episodes/working-with-windows/ ha la risposta perfetta a questa domanda. In breve:
ctrl-w w
ciclo tra le finestre apertectrl-w h
focalizza la finestra a sinistractrl-w j
focalizza la finestra verso il bassoctrl-w k
focalizza la finestra in altoctrl-w l
focalizza la finestra a destractrl-w r
ruota tutte le finestrectrl-w x
scambia la finestra corrente con il suo vicinoctrl-w H
sposta la finestra corrente all'estrema sinistractrl-w J
sposta la finestra corrente in bassoctrl-w K
sposta la finestra corrente in altoctrl-w L
sposta la finestra corrente all'estrema destra