Nur Fenster rückgängig machen


24

Stellen Sie sich einen Fall mit mehreren Teilungen in einem Fenster vor. Mit vim kann der aktuelle Split schnell "maximiert" werden, um das gesamte Fenster über einzunehmen <C-W> o.

Gibt es eine Möglichkeit, sich an die zuvor vorhandenen Splits zu "erinnern" und nach der Ausführung in diesen Zustand zurückzukehren <C-W> o?

EDIT: Zur Verdeutlichung suche ich nach einer Möglichkeit, dies ohne die Verwendung von Plugins von Drittanbietern zu tun.


1
Ich fand diese Antwort bei SO relevant, aber ich möchte diese Funktionalität wenn möglich ohne Plugin haben.
Bhargav Bhat

5
Bitte nehmen Sie solche Anforderungen in die Frage selbst auf, anstatt in einen Kommentar.
muru

Wird diese Frage als Duplikat betrachtet, wenn sie sich auf einer anderen Stack-Exchange-Site befindet? stackoverflow.com/q/13194428/1698426
John Schmitt

Antworten:


14

Am einfachsten ist dies wahrscheinlich mit Sitzungsdateien, bei denen es sich um VIM-Skripts handelt (die VIM automatisch für Sie erstellen kann), mit denen eine vorherige Bearbeitungsumgebung wiederhergestellt wird.

Sie können eine neue Sitzungsdatei mit erstellen :mksession <filename>. Sie können diese Sitzung wiederherstellen, indem Sie das generierte Sitzungsskript ausführen :source <filename>.

Auf diese Weise können Sie die aktuelle Sitzung vor dem Maximieren eines Fensters speichern und wiederherstellen, wenn Sie das Fenster "unmaximieren" möchten.

Auf diese Weise können Sie die entsprechenden Fensterbefehle neu zuordnen, um eine Sitzung im Voraus zu speichern, und eine neue Zuordnung hinzufügen, um den letzten Fensterbefehl durch Wiederherstellen der Sitzung rückgängig zu machen. Beispielsweise:

  • nnoremap <C-w>o :mksession! ~/session.vim<CR>:wincmd o<CR>und so weiter für alle Fensterbefehle, die Sie unterstützen möchten (siehe :help CTRL-W, es gibt eine Menge). Die !verhinderten Fehler im Zusammenhang mit dem Überschreiben eine bestehende Sitzungsdatei.
  • nnoremap <C-w>u :source ~/session.vim<CR> um den letzten Fensterbefehl rückgängig zu machen.

Wenn Sie besonders robust sein möchten, können Sie dies über Funktionen erweitern, um die Sitzungsdateien in einem Stapel zu speichern und sie zu entfernen, um eine vollständige Rückgängigmachungskette zu erhalten, obwohl es an diesem Punkt wahrscheinlich effizienter ist, eine Reihe von Funktionen zu schreiben, um die zu verfolgen Fenster Befehlsverlauf im Speicher ... an diesem Punkt werden Sie wahrscheinlich die Plugins duplizieren, die dies bereits tun.


11

Eine andere Möglichkeit besteht darin, das aktuelle Fenster in einem neuen Tab zu öffnen und den Tab dann einfach zu schließen, wenn Sie fertig sind.

Der Befehl :split(oder :spkurz: Befehl) ohne Argument bewirkt, dass ein neuer Split mit demselben Puffer wie der aktuelle Split geöffnet wird. Der :tabBefehl kann viele fensterbezogene Befehle ausführen und sie so ändern, dass stattdessen eine Registerkarte verwendet wird. Wenn Sie diese kombinieren :tab sp, wird eine neue Registerkarte mit dem aktuellen Puffer geöffnet.

Anschließend können Sie die neue Registerkarte mit :qoder :tabclose( :tabckurz) schließen.


2

Ich verwende das ZoomWin-Plugin ( https://github.com/itspriddle/ZoomWin ) für genau dieses Szenario. Drücken Sie CtrlW- Oein zweites Mal, um die Fensteranordnung wiederherzustellen.


1
danke für den vorschlag, aber wie ich in meiner frage bemerkt habe, würde ich gerne wissen, ob dies ohne plugin möglich ist.
Bhargav Bhat

1
Dieses Plugin war aus irgendeinem Grund beim Herauszoomen für mich langsam. Hat noch jemand das gleiche Problem?
Schrei

2

Was Sie beschreiben, klingt genauso wie die Funktion "Zoomen". Es gibt bereits eine gute Antwort auf SO , die es sehr gut macht.

EDIT: Explizite Antwort, aus SO kopiert und eingefügt . Ich habe das Snippet unten in meinem .vimrc abgelegt und dann aufgerufen

:ZoomToggle

in meiner vim Eingabeaufforderung.

" 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>

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzuschließen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert.
muru

Warum die Gegenstimme?
John Schmitt

Nicht ich. Wahrscheinlich wer auch immer es markiert hat.
muru

Kopieren und Einfügen von SO ist nicht viel nützlicher als Verknüpfen
alxndr

Genau. Was wäre das Nützlichste, was ich tun könnte?
John Schmitt

0

Dieser Beitrag ist alt, die akzeptierte Antwort betrifft nicht terminal buffer.

Die akzeptierte Antwort reicht aus session, sessionkann jedoch nicht vollständig wiederhergestellt werden 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.
...

Tommcdos Antwort funktioniert immer noch, <c-w>:tab splitfunktioniert gut terminal buffer. Es verdient eine Karte:

nnoremap <c-w><space> :tab split<cr>
tnoremap <c-w><space> <c-w>:tab split<cr>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.