Fenêtre Annuler uniquement

24

Prenons un cas avec plusieurs divisions dans une fenêtre. vim permet de "maximiser" rapidement la division actuelle pour occuper toute la fenêtre via <C-W> o.

Existe-t-il un moyen pour vim de "se souvenir" des divisions qui existaient avant et de revenir à cet état après l'exécution <C-W> o?

EDIT: Pour clarifier, je cherche un moyen de le faire sans utiliser de plugins tiers.

Bhargav Bhat
la source
1
J'ai trouvé cette réponse sur SO pertinent, mais j'aimerais avoir cette fonctionnalité sans plugin si possible.
Bhargav Bhat
5
Veuillez inclure des exigences comme celle-ci dans la question elle-même, plutôt que dans un commentaire.
muru
Cette question est-elle considérée comme un doublon si elle se trouve sur un autre site stackexchange? stackoverflow.com/q/13194428/1698426
John Schmitt

Réponses:

14

La façon la plus simple de le faire est probablement avec les fichiers de session, qui sont des scripts vim (que vim peut produire automatiquement pour vous) qui restaureront un environnement d'édition précédent.

Vous pouvez créer un nouveau fichier de session à l'aide de :mksession <filename>. Vous pouvez restaurer cette session en exécutant le script de session généré, :source <filename>.

Ainsi, vous pouvez enregistrer la session en cours avant de maximiser une fenêtre et la restaurer lorsque vous souhaitez "dé-maximiser" la fenêtre.

À l'aide de cela, vous pouvez remapper les commandes de fenêtrage appropriées pour enregistrer une session au préalable et ajouter un nouveau mappage pour une afin d'annuler la dernière commande de fenêtrage en restaurant la session. Par exemple:

  • nnoremap <C-w>o :mksession! ~/session.vim<CR>:wincmd o<CR>et ainsi de suite pour toutes les commandes de fenêtrage que vous souhaitez prendre en charge (voyez :help CTRL-W, il y en a beaucoup). Le !empêche les erreurs liées à l'écrasement d'un fichier de session existant.
  • nnoremap <C-w>u :source ~/session.vim<CR> pour "annuler" la dernière commande de fenêtrage.

Si vous vouliez être particulièrement robuste, vous pouvez l'étendre via des fonctions pour enregistrer les fichiers de session dans une pile et les supprimer pour obtenir une chaîne d'annulation complète, bien qu'à ce stade, il soit probablement plus efficace d'écrire un tas de fonctions pour suivre la historique des commandes de fenêtre en mémoire ... à quel point vous dupliquez probablement les plugins qui font déjà ce genre de chose.


la source
11

Une autre option pourrait être d'ouvrir votre fenêtre actuelle dans un nouvel onglet, puis de simplement fermer l'onglet lorsque vous avez terminé.

La commande :split(ou :sppour faire court), sans argument, a pour effet d'ouvrir un nouveau split avec le même tampon que le split courant. La :tabcommande peut exécuter de nombreuses commandes liées aux fenêtres, en les modifiant pour utiliser un onglet à la place. La combinaison de ces données donne :tab sp, ce qui ouvrira un nouvel onglet avec le tampon actuel.

Ensuite, vous pouvez fermer le nouvel onglet avec :qou :tabclose( :tabcpour faire court).

tommcdo
la source
2

J'utilise le plugin ZoomWin ( https://github.com/itspriddle/ZoomWin ) pour exactement ce scénario. En appuyant sur CtrlW- Oune deuxième fois restaure la disposition de votre fenêtre.

craigp
la source
1
merci pour la suggestion, mais comme je l'ai fait remarquer dans ma question, j'aimerais savoir si cela peut se faire sans plugin.
Bhargav Bhat
1
Ce plugin était lent pour moi pour une raison quelconque lors d'un zoom arrière. Quelqu'un d'autre a le même problème?
Cri
2

Ce que vous décrivez ressemble exactement à la fonction qui s'appelle "zoom". Il y a déjà une excellente réponse sur SO qui le fait très bien.

EDIT: réponse explicite, copiée et collée depuis SO . Je mets l'extrait ci-dessous dans mon .vimrc, puis j'invoque

:ZoomToggle

dans mon invite de commande 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
la source
Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien de référence. Les réponses de lien uniquement peuvent devenir invalides si la page liée change.
muru
Pourquoi le downvote?
John Schmitt
Pas moi. Probablement celui qui l'a signalé.
muru
copier-coller à partir de SO n'est pas beaucoup plus utile que la liaison
alxndr
Je suis d'accord. Quelle serait la chose la plus utile que je pourrais faire?
John Schmitt
0

Ce message est ancien, la réponse acceptée ne concerne pas terminal buffer.

La réponse acceptée sert sessionà faire l'affaire, mais sessionne peut pas restaurer complètement 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 réponse de Tommcdo fonctionne toujours, <c-w>:tab splitfonctionne bien terminal buffer. Il mérite une carte:

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