Desfazer somente janela


24

Considere um caso com várias divisões em uma janela. O vim permite "maximizar" rapidamente a divisão atual para ocupar toda a janela <C-W> o.

Existe uma maneira de o vim "lembrar" as divisões que existiam antes e reverter para esse estado após a execução <C-W> o?

EDIT: Para esclarecer, estou procurando uma maneira de fazer isso sem o uso de plugins de terceiros.


1
Encontrei esta resposta na SO relevante, mas gostaria de ter essa funcionalidade sem um plug-in, se possível.
Bhargav Bhat

5
Inclua requisitos como esse na própria pergunta, em vez de em um comentário.
muru 4/02/15

Essa pergunta é considerada duplicada se estiver em outro site de stackexchange? stackoverflow.com/q/13194428/1698426
John Schmitt

Respostas:


14

A maneira mais simples de fazer isso é provavelmente com arquivos de sessão, que são scripts do vim (que o vim pode produzir automaticamente para você) que restauram um ambiente de edição anterior.

Você pode criar um novo arquivo de sessão usando :mksession <filename>. Você pode restaurar essa sessão executando o script de sessão gerado :source <filename>,.

Assim, você pode salvar a sessão atual antes de maximizar uma janela e restaurá-la quando desejar "desmaximizar" a janela.

Usando isso, você pode remapear os comandos de janelas apropriados para salvar uma sessão com antecedência e adicionar um novo mapeamento para que um "desfaça" o último comando de janelas restaurando a sessão. Por exemplo:

  • nnoremap <C-w>o :mksession! ~/session.vim<CR>:wincmd o<CR>e assim por diante para todos os comandos de janelas que você deseja suportar (veja :help CTRL-W, há muito). Os !evita erros relativos ao sobrescrever um arquivo de sessão existente.
  • nnoremap <C-w>u :source ~/session.vim<CR> para "desfazer" o último comando de janelas.

Se você quiser ser particularmente robusto, poderá estender isso via funções para salvar os arquivos de sessão em uma pilha e removê-los para obter uma cadeia completa de desfazer, embora nesse momento seja provavelmente mais eficiente escrever várias funções para rastrear o histórico de comandos da janela na memória ... nesse ponto você provavelmente está duplicando os plugins que já fazem esse tipo de coisa.


11

Outra opção pode ser abrir a janela atual em uma nova guia e simplesmente fechar a guia quando terminar.

O comando :split(ou :spabreviado), sem argumento, tem o efeito de abrir uma nova divisão com o mesmo buffer que a divisão atual. O :tabcomando pode executar muitos comandos relacionados à janela, alterando-os para usar uma guia. Combinando esses dados juntos :tab sp, será aberta uma nova guia com o buffer atual.

Depois, você pode fechar a nova guia com :qou :tabclose( :tabcpara abreviar).


2

Eu uso o plugin ZoomWin ( https://github.com/itspriddle/ZoomWin ) para exatamente esse cenário. Pressionar CtrlW- Ouma segunda vez restaura o layout da janela.


1
obrigado pela sugestão, mas como observei na minha pergunta, gostaria de saber se isso pode ser feito sem um plug-in.
Bhargav Bhat

1
Este plugin foi lento para mim por algum motivo ao diminuir o zoom. Alguém mais com o mesmo problema?
grito

2

O que você está descrevendo soa exatamente como o recurso chamado "zoom". Já existe uma ótima resposta no SO que faz isso muito bem.

EDIT: Resposta explícita, copiada e colada do SO . Coloquei o trecho abaixo no meu .vimrc e depois invoco

:ZoomToggle

no meu prompt de comando do 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>

Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada.
muru

Por que o voto negativo?
John Schmitt

Eu não. Provavelmente quem quer que tenha sinalizado.
muru

copiar-e-colar de SO não é muito mais útil do que o ligando
alxndr

Concordo. Qual seria a coisa mais útil que eu poderia fazer?
John Schmitt

0

Este post é antigo, a resposta aceita não se preocupa terminal buffer.

A resposta aceita é usada sessionpara fazer o truque, mas sessionnão pode restaurar completamente 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.
...

A resposta de Tommcdo ainda funciona, <c-w>:tab splitfunciona bem terminal buffer. Merece um mapa:

nnoremap <c-w><space> :tab split<cr>
tnoremap <c-w><space> <c-w>:tab split<cr>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.