Deshacer solo ventana

24

Considere un caso con múltiples divisiones en una ventana. vim permite "maximizar" rápidamente la división actual para ocupar toda la ventana a través de <C-W> o.

¿Hay alguna forma de obtener vim para "recordar" las divisiones que existían antes y volver a este estado después de la ejecución <C-W> o?

EDITAR: Para aclarar, estoy buscando una manera de hacer esto sin el uso de complementos de terceros.

Bhargav Bhat
fuente
1
Encontré esta respuesta en SO relevante, pero me gustaría tener esta funcionalidad sin un complemento si es posible.
Bhargav Bhat
55
Incluya requisitos como ese en la pregunta misma, en lugar de en un comentario.
muru
¿Se considera esta pregunta un duplicado si está en otro sitio de stackexchange? stackoverflow.com/q/13194428/1698426
John Schmitt

Respuestas:

14

La forma más sencilla de hacer esto es probablemente con archivos de sesión, que son scripts vim (que vim puede producir automáticamente para usted) que restaurarán un entorno de edición anterior.

Puede crear un nuevo archivo de sesión usando :mksession <filename>. Puede restaurar la sesión mediante la ejecución de la secuencia de comandos de sesión generada, :source <filename>.

Por lo tanto, puede guardar la sesión actual antes de maximizar una ventana y restaurarla cuando desee "no maximizar" la ventana.

Con esto, puede reasignar los comandos de ventana apropiados para guardar una sesión de antemano y agregar una nueva asignación para "deshacer" el último comando de ventana restaurando la sesión. Por ejemplo:

  • nnoremap <C-w>o :mksession! ~/session.vim<CR>:wincmd o<CR>y así sucesivamente para todos los comandos de ventanas que desea admitir (vea :help CTRL-W, hay muchos). Esto !evita errores relacionados con la sobrescritura de un archivo de sesión existente.
  • nnoremap <C-w>u :source ~/session.vim<CR> para "deshacer" el último comando de ventanas.

Si desea ser particularmente robusto, puede extender esto mediante funciones para guardar los archivos de sesión en una pila y sacarlos para obtener una cadena de deshacer completa, aunque en ese punto probablemente sea más eficiente escribir un montón de funciones para rastrear el historial de comandos de la ventana en la memoria ... en ese momento es probable que esté duplicando los complementos que ya hacen este tipo de cosas.


fuente
11

Otra opción podría ser abrir su ventana actual en una pestaña nueva, luego simplemente cierre la pestaña cuando haya terminado.

El comando :split(o :sppara abreviar), sin argumento, tiene el efecto de abrir una nueva división con el mismo búfer que la división actual. El :tabcomando puede ejecutar muchos comandos relacionados con ventanas, cambiándolos para usar una pestaña en su lugar. Combinando estos elementos :tab sp, se abrirá una nueva pestaña con el búfer actual.

Después, puede cerrar la nueva pestaña con :qo :tabclose( :tabcpara abreviar).

tommcdo
fuente
2

Utilizo el complemento ZoomWin ( https://github.com/itspriddle/ZoomWin ) exactamente para este escenario. Al presionar CtrlW, Ouna segunda vez restaura el diseño de la ventana.

craigp
fuente
1
gracias por la sugerencia, pero como hice notar en mi pregunta, me gustaría saber si esto se puede hacer sin un complemento.
Bhargav Bhat
1
Este complemento fue lento para mí por alguna razón al alejarme. ¿Alguien más tiene el mismo problema?
chillido
2

Lo que está describiendo suena exactamente como la característica que se conoce con el nombre de "zoom". Ya hay una gran respuesta en SO que lo hace muy bien.

EDITAR: Respuesta explícita, copiada y pegada de SO . Puse el fragmento a continuación en mi .vimrc y luego invoco

:ZoomToggle

en mi símbolo del sistema vim.

" Zoom / Restore window.
function! s:ZoomToggle() abort
    if exists('t:zoomed') && t:zoomed
        execute t:zoom_winrestcmd
        let t:zoomed = 0
    else
        let t:zoom_winrestcmd = winrestcmd()
        resize
        vertical resize
        let t:zoomed = 1
    endif
endfunction
command! ZoomToggle call s:ZoomToggle()
nnoremap <silent> <C-A> :ZoomToggle<CR>
John Schmitt
fuente
Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia.
muru
¿Por qué el voto negativo?
John Schmitt
Yo no. Probablemente quien lo marcó.
muru
copiar y pegar de SO no es mucho más útil que la vinculación
alxndr
Estoy de acuerdo. ¿Cuál sería la cosa más útil que podría hacer?
John Schmitt
0

Esta publicación es antigua, la respuesta aceptada no le preocupa terminal buffer.

La respuesta aceptada se utiliza sessionpara hacer el truco, pero sessionno se puede restaurar por completo terminal buffer:

                            *terminal-session*
A terminal window will be restored when using a session file, if possible and
wanted.

If "terminal" was removed from 'sessionoptions' then no terminal windows will
be restored.

If the job in the terminal was finished the window will not be restored.
...

La respuesta de Tommcdo todavía funciona, <c-w>:tab splitfunciona bien terminal buffer. Se merece un mapa:

nnoremap <c-w><space> :tab split<cr>
tnoremap <c-w><space> <c-w>:tab split<cr>
dedowsdi
fuente