copiar - ¿Cómo intercambiar archivos entre ventanas en VIM?
buscar en vim linux (5)
Como <cw>r
o <cw>x
tiene una restricción que no puede rotar o intercambiar ventanas cuando las divisiones de ventanas verticales y horizontales se mezclan. Y <cw>H
puede hacer que el diseño de la ventana cambie más allá de sus expectativas, especialmente cuando tiene muchas ventanas.
Por lo tanto, puede hacer un poco de trabajo para satisfacer sus necesidades particulares de conmutación de ventana / buffer. Aquí hay un ejemplo para cambiar la ventana actual con la ventana superior izquierda (normalmente la hago verticalmente maximizada):
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>
Cuando trabajo con VIM, siempre tengo varias ventanas visibles. A veces me gustaría tener una manera fácil de intercambiar esas ventanas en algunos lugares. ¿Hay algún complemento, macro, etc. para hacer esto más fácil? Por cierto, uso MiniBufExplorer.
En mi opinión, http://vimcasts.org/episodes/working-with-windows/ tiene la respuesta perfecta para esta pregunta. En breve:
-
ctrl-w w
ciclo entre las ventanas abiertas -
ctrl-w h
enfoca la ventana a la izquierda -
ctrl-w j
enfoca la ventana hacia abajo -
ctrl-w k
enfoca la ventana hacia arriba -
ctrl-w l
enfoca la ventana a la derecha -
ctrl-w r
rotar todas las ventanas -
ctrl-w x
intercambia ventana actual con su vecino -
ctrl-w H
mueve la ventana actual a la extrema izquierda -
ctrl-w J
mueve la ventana actual a la parte inferior -
ctrl-w K
mueve la ventana actual hacia arriba -
ctrl-w L
mueve la ventana actual a la extrema derecha
Escribí y he estado usando el siguiente fragmento de código en mi vimrc para copiar y pegar mis ventanas de Vim.
Esto define, por ejemplo, los siguientes atajos:
-
<cw>y
: "Conecta la ventana", es decir, almacena el número del búfer en la ventana actual en una variable global. -
<cw>pp
: "Pone la ventana en el lugar de la ventana actual", es decir, lee el número del búfer almacenado previamente y abre ese búfer en la ventana actual. También almacena el número del búfer que solía estar en la ventana actual.
Si al "intercambiar esas ventanas en lugares", quiere decir "abrir el búfer en la ventana A en la ventana B, y viceversa, sin cambiar la posición de las ventanas", puede usar la siguiente secuencia de teclado para intercambiar las ventanas:
- Seleccione la ventana A (ya sea con el mouse o con comandos de teclado)
- Presione
<cw>y
(quitando el número de buffer) - Seleccione la ventana B
- Presione
<cw>pp
(pegando el buffer) - Seleccione la ventana A
- Presione
<cw>pp
(pegando el buffer nuevamente)
Funciona solo en 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
Hay algunos comandos útiles integrados que le dan cierta cantidad de control, pero no son completos. Los principales son:
Ctrl - W , r (es decir, mantenga presionado CTRL , presione W , suelte CTRL , presione r ) - que gira las ventanas (la primera ventana se convierte en la segunda, la segunda se convierte en la tercera, etc.)
Ctrl - W , x - intercambia la ventana actual con la siguiente
Ctrl - W , Shift - H - mueve esta ventana hacia el extremo izquierdo
Ctrl - W , Shift - K - mueve esta ventana a la parte superior
(y de manera similar para Ctrl - W , Shift - J y Ctrl - W , Shift - L ). Ver:
:help window-moving
para más información.
Hice una pregunta similar al mismo tiempo: quería una forma de cambiar ventanas específicamente sin alterar un diseño arbitrariamente complicado. Terminé creando un plugin vim de una de las soluciones sugeridas. Se llama WindowSwap.vim ; instálalo con tu administrador de plugins vim preferido y dale un giro.
Con WindowSwap.vim, simplemente
-
<Leader>yw
para tirar de una ventana. - Mueva su cursor a otra ventana.
-
<Leader>pw
para pegar esa ventana, intercambiándola con la posición de la primera.
Las combinaciones de teclas son, por supuesto, configurables según sus preferencias.