Annulla solo la finestra


24

Prendi in considerazione un caso con più divisioni in una finestra. vim consente di "massimizzare" rapidamente la divisione corrente per occupare l'intera finestra <C-W> o.

C'è un modo per ottenere vim per "ricordare" le suddivisioni che esistevano prima e tornare a questo stato dopo l'esecuzione <C-W> o?

EDIT: Per chiarire, sto cercando un modo per farlo senza l'uso di plugin di terze parti.


1
Ho trovato questa risposta su SO rilevante, ma mi piacerebbe avere questa funzionalità senza un plugin, se possibile.
Bhargav Bhat

5
Si prega di includere requisiti come quello nella domanda stessa, anziché in un commento.
muru,

Questa domanda è considerata duplicata se si trova su un altro sito stackexchange? stackoverflow.com/q/13194428/1698426
John Schmitt,

Risposte:


14

Il modo più semplice per farlo è probabilmente con i file di sessione, che sono script vim (che vim può produrre automaticamente per te) che ripristineranno un ambiente di modifica precedente.

È possibile creare un nuovo file di sessione utilizzando :mksession <filename>. È possibile ripristinare la sessione eseguendo lo script di sessione generata, :source <filename>.

Pertanto, è possibile salvare la sessione corrente prima di ingrandire una finestra e ripristinarla quando si desidera "non ingrandire" la finestra.

Usando questo, è possibile rimappare i comandi di windowing appropriati per salvare una sessione in anticipo e aggiungere un nuovo mapping per uno per "annullare" l'ultimo comando di windowing ripristinando la sessione. Per esempio:

  • nnoremap <C-w>o :mksession! ~/session.vim<CR>:wincmd o<CR>e così via per tutti i comandi di finestre che vuoi supportare (vedi :help CTRL-W, ce n'è molto). Questo !impedisce errori relativi alla sovrascrittura di un file di sessione esistente.
  • nnoremap <C-w>u :source ~/session.vim<CR> per "annullare" l'ultimo comando di windowing.

Se si desidera essere particolarmente affidabili, è possibile estenderlo tramite le funzioni per salvare i file di sessione in uno stack e espellerli per ottenere una catena di annullamento completa, anche se a quel punto è probabilmente più efficiente scrivere un sacco di funzioni per tenere traccia dei cronologia dei comandi della finestra in memoria ... a quel punto probabilmente stai duplicando i plugin che fanno già questo genere di cose.


11

Un'altra opzione potrebbe essere quella di aprire la finestra corrente in una nuova scheda, quindi semplicemente chiudere la scheda quando hai finito.

Il comando :split(o :spin breve), senza argomento, ha l'effetto di aprire una nuova divisione con lo stesso buffer della divisione corrente. Il :tabcomando può eseguire molti comandi relativi alle finestre, modificandoli per utilizzare invece una scheda. Combinando questi insieme si ottiene :tab sp, che aprirà una nuova scheda con il buffer corrente.

Successivamente, puoi chiudere la nuova scheda con :qo :tabclose( :tabcin breve).


2

Uso esattamente il plugin ZoomWin ( https://github.com/itspriddle/ZoomWin ) proprio per questo scenario. Premendo CtrlW- Ouna seconda volta ripristina il layout della finestra.


1
grazie per il suggerimento, ma come ho notato nella mia domanda, mi piacerebbe sapere se questo può essere fatto senza un plugin.
Bhargav Bhat,

1
Questo plugin è stato lento per me per qualche motivo durante lo zoom indietro. Qualcun altro ha lo stesso problema?
grido

2

Quello che stai descrivendo suona esattamente come la funzione che va sotto il nome di "zoom". C'è già un'ottima risposta su SO che lo fa molto bene.

EDIT: risposta esplicita, copiata e incollata da SO . Ho inserito lo snippet di seguito nel mio .vimrc e quindi invoco

:ZoomToggle

nel mio prompt dei comandi di 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>

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
Muru,

Perché il downvote?
John Schmitt,

Non me. Probabilmente chiunque lo abbia segnalato.
Muru,

il copia e incolla da SO non è molto più utile del collegamento
alxndr,

Sono d'accordo. Quale sarebbe la cosa più utile che potrei fare?
John Schmitt,

0

Questo post è vecchio, la risposta accettata non riguarda terminal buffer.

La risposta accettata usa sessionper fare il trucco, ma sessionnon può ripristinare 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.
...

La risposta di Tommcdo funziona ancora, <c-w>:tab splitfunziona bene terminal buffer. Merita una mappa:

nnoremap <c-w><space> :tab split<cr>
tnoremap <c-w><space> <c-w>:tab split<cr>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.