창만 실행 취소


24

창에 여러 개의 분할이있는 경우를 고려하십시오. vim은 현재 분할을 "최대화"하여 전체 창을 통해 전체 창을 차지합니다 <C-W> o.

vim이 전에 존재했던 스플릿을 "기억"하고 실행 후이 상태로 되돌릴 수있는 방법이 <C-W> o있습니까?

편집 : 명확히하기 위해 타사 플러그인을 사용하지 않고이를 수행 할 수있는 방법을 찾고 있습니다.


1
SO 관련성 에서이 답변을 찾았 지만 가능하면 플러그인 없이이 기능을 원합니다.
Bhargav Bhat

5
의견 대신 질문 자체에 이와 같은 요구 사항을 포함하십시오.
muru

이 질문이 다른 스택 교환 사이트에있는 경우 중복 질문으로 간주됩니까? stackoverflow.com/q/13194428/1698426
John Schmitt

답변:


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
축소 할 때 어떤 이유로 든이 플러그인이 느려졌습니다. 다른 사람과 같은 문제가 있습니까?
shriek

2

당신이 묘사하는 것은 "zooming"이라는 이름으로가는 기능과 똑같습니다. 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>

이 링크가 질문에 대한 답변을 제공 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다.
muru

왜 공감해야합니까?
존 슈미트

내가 아니야 아마 깃발을 신고 한 사람 일 것입니다.
muru

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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.