Скасувати лише вікно


24

Розглянемо випадок із кількома розщепленнями у вікні. vim дозволяє швидко "максимізувати" поточний розділ, щоб зайняти все вікно через <C-W> o.

Чи є спосіб отримати vim "запам'ятати" розбиття, які існували раніше, і повернути його до цього стану після виконання <C-W> o?

EDIT: Для уточнення, я шукаю спосіб це зробити без використання сторонніх плагінів.


1
Я знайшов цю відповідь на SO так, але я хотів би мати цю функціональність без плагіна, якщо це можливо.
Bhargav Bhat

5
Будь ласка, включіть такі вимоги до самого питання, а не до коментаря.
муру

Чи вважається це питання дублікатом, якщо він знаходиться на іншому сайті stackexchange? stackoverflow.com/q/13194428/1698426
Джон Шмітт

Відповіді:


14

Найпростіший спосіб зробити це, мабуть, з файлами сеансу, які є сценаріями vim (які vim може автоматично створити для вас), які відновлять попереднє середовище редагування.

Ви можете створити новий файл сеансу за допомогою :mksession <filename>. Ви можете відновити цю сесію, виконавши згенерований сеанс сценарій :source <filename>.

Таким чином, ви можете зберегти поточний сеанс до максимізації вікна та відновити його, коли ви хочете "не максимізувати" вікно.

Використовуючи це, ви можете перезаписати відповідні команди вікон, щоб попередньо зберегти сеанс, і додати нове відображення для одного, щоб "скасувати" останню команду вікна, відновивши сеанс. Наприклад:

  • nnoremap <C-w>o :mksession! ~/session.vim<CR>:wincmd o<CR>і так далі для всіх команд вікон, які ви хочете підтримати (див. :help CTRL-W, тут багато). В !дозволяє запобігти помилкам , пов'язані з перезаписом існуючого файлу сеансу.
  • nnoremap <C-w>u :source ~/session.vim<CR> щоб "скасувати" останню команду вікна.

Якщо ви хочете бути особливо надійними, ви можете розширити це за допомогою функцій, щоб зберегти файли сеансу в стек і випустити їх, щоб отримати повний ланцюжок скасування, хоча в цей момент, мабуть, більш ефективно написати купу функцій для відстеження історія команд вікна в пам'яті ... в цей момент ви, ймовірно, дублюєте плагіни, які вже роблять подібні речі.


11

Іншим варіантом може бути відкриття вашого поточного вікна в новій вкладці, а потім просто закрити вкладку, коли ви закінчите.

Команда :split(або :spкоротко) без аргументу має ефект відкриття нового розбиття з тим же буфером, що і поточний розкол. :tabКоманда може виконувати безліч команд пов'язаних з вікном, змінюючи їх використовувати вкладку замість. Поєднання цих даних дає :tab spзмогу відкрити нову вкладку з поточним буфером.

Після цього нову вкладку можна закрити за допомогою ( :qабо коротко).:tabclose:tabc


2

Я використовую плагін ZoomWin ( https://github.com/itspriddle/ZoomWin ) для саме цього сценарію. Натискання CtrlW- Oвдруге відновлює макет вашого вікна.


1
дякую за пропозицію, але, як я зазначив у своєму запитанні, я хотів би знати, чи можна це зробити без плагіна.
Bhargav Bhat

1
Цей плагін мені чомусь повільно під час зменшення масштабу. Хтось ще має те саме питання?
крик

2

Те, що ви описуєте, звучить точно як функція, що має назву "масштабування". На SO вже чудова відповідь, що це робить дуже добре.

EDIT: Явна відповідь, скопійована та вставлена ​​з SO . Я кладу фрагмент нижче у свій .vimrc, а потім викликаю

:ZoomToggle

в моєму командному рядку 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>

Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
муру

Чому потік?
Джон Шмітт

Не я. Напевно, хто б це не позначив.
муру

Скопіюйте та вставте з SO не набагато корисніше, ніж посилання
alxndr

Я згоден. Що було б найкориснішим, що я міг зробити?
Джон Шмітт

0

Ця публікація стара, прийнята відповідь не хвилює terminal buffer.

Прийнята відповідь використовується sessionдля виконання трюку, але sessionне може повністю відновити 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.
...

Tommcdo в відповідь по- , як і раніше працює, <c-w>:tab splitдобре працює terminal buffer. Він заслуговує на карту:

nnoremap <c-w><space> :tab split<cr>
tnoremap <c-w><space> <c-w>:tab split<cr>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.