Отменить только окно


24

Рассмотрим случай с несколькими разбиениями в окне. vim позволяет быстро «максимизировать» текущее разделение, чтобы охватить все окно <C-W> o.

Есть ли способ заставить vim «запомнить» расщепления, которые существовали до, и вернуться в это состояние после выполнения <C-W> o?

РЕДАКТИРОВАТЬ: Чтобы уточнить, я ищу способ сделать это без использования каких-либо сторонних плагинов.


1
Я нашел этот ответ на ТАК актуальным, но я хотел бы иметь эту функциональность без плагина, если это возможно.
Бхаргав Бхат

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
спасибо за предложение, но, как я заметил в своем вопросе, я хотел бы знать, можно ли это сделать без плагина.
Бхаргав Бхат

1
Этот плагин был медленным для меня по некоторым причинам при уменьшении масштаба. У кого-то еще есть такая же проблема?
визг

2

То, что вы описываете, звучит так же, как функция, которая называется «масштабирование». На SO уже есть отличный ответ, который делает это очень хорошо.

РЕДАКТИРОВАТЬ: Явный ответ, скопированы и вставлены из 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.