Cofnij tylko okno

24

Rozważ przypadek z wieloma podziałami w oknie. vim pozwala szybko „zmaksymalizować” bieżący podział, aby zajął całe okno przez <C-W> o.

Czy istnieje sposób, aby vim „zapamiętał” istniejące wcześniej podziały i powrócił do tego stanu po wykonaniu <C-W> o?

EDYCJA: Aby wyjaśnić, szukam sposobu, aby to zrobić bez użycia wtyczek innych firm.

Bhargav Bhat
źródło
1
Znalazłem odpowiedź w SO, ale chciałbym mieć tę funkcjonalność bez wtyczki, jeśli to możliwe.
Bhargav Bhat
5
Podaj takie wymagania w samym pytaniu zamiast w komentarzu.
muru
Czy to pytanie jest uważane za duplikat, jeśli znajduje się na innej stronie wymiany stosów? stackoverflow.com/q/13194428/1698426
John Schmitt

Odpowiedzi:

14

Najprościej jest to zrobić za pomocą plików sesji, które są skryptami vima (które vim może dla ciebie automatycznie wygenerować), które przywrócą poprzednie środowisko edycji.

Możesz utworzyć nowy plik sesji za pomocą :mksession <filename>. Można przywrócić tej sesji wykonując wygenerowanego skryptu sesji :source <filename>.

W ten sposób można zapisać bieżącą sesję przed zmaksymalizowaniem okna i przywrócić ją, aby „zmaksymalizować” okno.

Korzystając z tego, możesz ponownie przypisać odpowiednie polecenia okienkowania, aby wcześniej zapisać sesję, i dodać nowe mapowanie, aby „cofnąć” ostatnie polecenie okienkowania, przywracając sesję. Na przykład:

  • nnoremap <C-w>o :mksession! ~/session.vim<CR>:wincmd o<CR>i tak dalej dla wszystkich poleceń okienkowania, które chcesz wesprzeć (zobacz :help CTRL-W, jest wiele). W !zapobiega błędom związane z zastąpieniem istniejącego pliku sesji.
  • nnoremap <C-w>u :source ~/session.vim<CR> „cofnąć” ostatnie polecenie okienkowania.

Jeśli chcesz być wyjątkowo solidny, możesz rozszerzyć to za pomocą funkcji, aby zapisać pliki sesji w stosie i wyskoczyć je, aby uzyskać pełny łańcuch cofania, chociaż w tym momencie prawdopodobnie bardziej wydajne jest napisanie wielu funkcji do śledzenia historia poleceń okna w pamięci ... w którym momencie prawdopodobnie duplikujesz wtyczki, które już to robią.


źródło
11

Inną opcją może być otwarcie bieżącego okna w nowej karcie, a następnie zamknięcie karty po zakończeniu.

Polecenie :split(lub :spw skrócie) bez argumentu powoduje otwarcie nowego podziału z tym samym buforem co bieżący podział. :tabPolecenia można uruchomić wiele poleceń związanych z oknami, zmieniając im zamiast korzystać z zakładki. Połączenie ich razem daje :tab sp, co otworzy nową kartę z bieżącym buforem.

Następnie możesz zamknąć nową kartę za pomocą :qlub :tabclose( :tabcw skrócie).

tommcdo
źródło
2

Korzystam z wtyczki ZoomWin ( https://github.com/itspriddle/ZoomWin ) właśnie w tym scenariuszu. Naciśnięcie CtrlW- Odrugi raz przywraca układ okna.

craigp
źródło
1
dziękuję za sugestię, ale jak zauważyłem w moim pytaniu, chciałbym wiedzieć, czy można to zrobić bez wtyczki.
Bhargav Bhat
1
Ta wtyczka była dla mnie powolna z jakiegoś powodu podczas pomniejszania. Czy ktoś jeszcze ma ten sam problem?
wrzask
2

To, co opisujesz, brzmi dokładnie tak, jak nazwa „powiększanie”. Jest już świetna odpowiedź na temat SO, która robi to bardzo dobrze.

EDYCJA: Jawna odpowiedź, skopiowana i wklejona z SO . Umieszczam poniższy fragment w moim .vimrc, a następnie wywołuję

:ZoomToggle

w moim wierszu polecenia 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
źródło
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko link mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
muru
Dlaczego głosowanie negatywne?
John Schmitt,
Nie ja. Prawdopodobnie ktokolwiek go oflagował.
muru
kopiowanie i wklejanie z SO nie jest dużo bardziej przydatne niż linkowanie
alxndr
Zgadzam się. Jaka byłaby najbardziej przydatna rzecz, jaką mogłem zrobić?
John Schmitt
0

Ten post jest stary, zaakceptowana odpowiedź nie dotyczy terminal buffer.

Zaakceptowana odpowiedź służy sessiondo wykonania lewy, ale sessionnie można jej całkowicie przywrócić 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.
...

Odpowiedź Tommcdo nadal działa, <c-w>:tab splitdziała dobrze terminal buffer. Zasługuje na mapę:

nnoremap <c-w><space> :tab split<cr>
tnoremap <c-w><space> <c-w>:tab split<cr>
dedowsdi
źródło