pegar - salir de vim ubuntu
Vim cerrar el bĂșfer pero no dividir ventana (7)
Si tengo 2 buffers divididos horizontalmente / verticalmente y quiero cerrar uno de ellos, pero no quiero cerrar una ventana. Quiero que los lugares de ventanas divididas sean los mismos que antes de cerrar el búfer.
Si presiono: bd, la ventana en la que se cerró el búfer también se cerró.
¿Quieres eliminar el búfer pero mantener la división? Necesitará un nuevo búfer y luego:: new lo hará por usted, creando un búfer para un archivo nuevo / vacío, pero aún tendrá que eliminar el búfer / ventana anterior. En vim, una ventana es una ventana gráfica en un búfer, por lo que si desea una ventana vacía, necesita un búfer vacío.
Aquí hay una solución:
function! CloseSplitOrDeleteBuffer()
let curNr = winnr()
let curBuf = bufnr(''%'')
wincmd w " try to move on next split
if winnr() == curNr " there is no split"
exe ''bdelete''
elseif curBuf != bufnr(''%'') " there is split with another buffer
wincmd W " move back"
exe ''bdelete''
else " there is split with same buffer"
wincmd W
wincmd c
endif
endfunction
nnoremap <silent> Q :call CloseSplitOrDeleteBuffer()<CR>
Aquí hay una variación de la respuesta proporcionada @zenbro que mantiene abiertas todas sus ventanas y pestañas (divididas) incluso si el búfer que cierra es el último.
La función cambia todas las ventanas que apuntan al búfer actual (que está cerrando) al siguiente búfer (o un búfer nuevo si el búfer actual es el último).
function! CloseBuffer()
let curBuf = bufnr(''%'')
let curTab = tabpagenr()
exe ''bnext''
" If in last buffer, create empty buffer
if curBuf == bufnr(''%'')
exe ''enew''
endif
" Loop through tabs
for i in range(tabpagenr(''$''))
" Go to tab (is there a way with inactive tabs?)
exe ''tabnext '' . (i + 1)
" Store active window nr to restore later
let curWin = winnr()
" Loop through windows pointing to buffer
let winnr = bufwinnr(curBuf)
while (winnr >= 0)
" Go to window and switch to next buffer
exe winnr . ''wincmd w | bnext''
" Restore active window
exe curWin . ''wincmd w''
let winnr = bufwinnr(curBuf)
endwhile
endfor
" Close buffer, restore active tab
exe ''bd'' . curBuf
exe ''tabnext '' . curTab
endfunction
Para mapearlo:
map <silent> <F4> :call CloseBuffer()<cr>
Como @RusAlex no me gustan los complementos. También me gusta saber qué código introduzco realmente.
nmap ,d :b#<bar>bd#<CR>
En resumen, esto agrega una asignación de teclas al modo normal de vim que espera la secuencia de teclas ,d
. Cuando se ejecuta, este cambia a un búfer abierto previamente e intenta eliminar el búfer que se cambió.
Eliminar un búfer fuera de pantalla mantiene la pantalla dividida como está.
El comando consta de tres partes separadas por espacios:
-
nmap
- agregar / cambiar la asignación de teclas para el modo normal -
,d
- secuencia de teclas para reaccionar; primero,
(coma), luegod
-
:b#<bar>bd#<CR>
- secuencia de teclas para ejecutar
El comando a ejecutar consta de cinco partes:
-
:
- cambia vim a modo línea de comandos -
b#
- cambiar la ventana para abrir previamente el búfer -
<bar>
- espera un comando de seguimiento; representa|
(personaje de la pipa); usado para encadenar comandos -
bd#
- elimina el búfer previamente abierto, es decir, el búfer que se acaba de cambiar -
<CR>
- ejecuta comando (s); Representa retorno de carro, básicamente las teclasReturn
oEnter
El comando está en el formato que se usa en un archivo de configuración como ~/.vimrc
. Si desea agregar la asignación desde dentro de vim, debe añadir al principio :
(dos puntos): la asignación se perderá al salir de vim:
:nmap ,d :b#<bar>bd#<CR>
Cuando abre vim, generalmente está en modo normal en lugar de insertar modos (indicado en la parte inferior de la pantalla por -- INSERT --
después de presionar i
), visual y así sucesivamente. La n
en nmap
especifica la asignación de teclas que se agregará solo al modo normal. Encuentre más sobre mapeos here
Notas importantes:
-
b#
cambiará al búfer actual si es el único búfer conocido. -
b#
puede cambiar a un búfer oculto / cerrado, por ejemplo, el que acaba de cerrar al presionar,d
. -
bd#
cerrará el búfer actual si es el único búfer conocido que no divide la pantalla y le deja un búfer vacío. -
bd#
fallará si el búfer que se aleja es un búfer oculto / cerrado. -
bd#
aún no se dividirá si después de cambiar otra ventana, el búfer se cierra.
Notas adicionales:
-
:windo b#
cambiará todas las ventanas al búfer abierto previamente. No estoy seguro de cómo combinar conbd
. -
<CR>
se puede omitir, en cuyo caso debe presionarReturn
oEnter
para ejecutar. -
:nmap ,
muestra todas las asignaciones de modo normal que comienzan con,. -
:ls
listas buffers abiertos.
Es imposible tener una ventana vacía en vim, pero puedes crear un nuevo archivo vacío en la ventana actual usando :enew
.
La versión de @RusAlex + activa el búfer actual al final, si se elimina el búfer dos veces.
nmap ,d :b#<bar>bd#<bar>b<CR>
Tendré que revisar mi computadora de trabajo, pero creo que el script que estoy usando para esto es BufClose .