Hoàn tác chỉ cửa sổ


24

Hãy xem xét một trường hợp có nhiều phần tách trong một cửa sổ. vim cho phép nhanh chóng "tối đa hóa" sự phân chia hiện tại để chiếm toàn bộ cửa sổ thông qua <C-W> o.

Có cách nào để vim "nhớ" các phần tách tồn tại trước đó và trở lại trạng thái này sau khi thực hiện <C-W> okhông?

EDIT: Để làm rõ, tôi đang tìm cách để làm điều này mà không cần sử dụng bất kỳ plugin nào của bên thứ ba.


1
Tôi đã tìm thấy câu trả lời này tại SO có liên quan, nhưng tôi muốn có chức năng này mà không cần plugin nếu có thể.
Bhargav Bhat

5
Vui lòng bao gồm các yêu cầu như thế trong chính câu hỏi, thay vì trong một bình luận.
muru

Câu hỏi này có được coi là trùng lặp không nếu nó trên một trang web stackexchange khác? stackoverflow.com/q/13194428/1698426
John Schmitt

Câu trả lời:


14

Cách đơn giản nhất để làm điều này có lẽ là với các tệp phiên, đó là các tập lệnh vim (vim có thể tự động tạo cho bạn) sẽ khôi phục môi trường chỉnh sửa trước đó.

Bạn có thể tạo một tệp phiên mới bằng cách sử dụng :mksession <filename>. Bạn có thể khôi phục phiên đó bằng cách thực thi tập lệnh phiên được tạo :source <filename>.

Do đó, bạn có thể lưu phiên hiện tại trước khi tối đa hóa cửa sổ và khôi phục phiên khi bạn muốn "tối đa hóa" cửa sổ.

Sử dụng điều này, bạn có thể ánh xạ lại các lệnh cửa sổ thích hợp để lưu phiên trước đó và thêm ánh xạ mới cho một để "hoàn tác" lệnh cửa sổ cuối cùng bằng cách khôi phục phiên. Ví dụ:

  • nnoremap <C-w>o :mksession! ~/session.vim<CR>:wincmd o<CR>và v.v. cho tất cả các lệnh cửa sổ mà bạn muốn hỗ trợ (xem :help CTRL-W, có rất nhiều). Việc !ngăn chặn các lỗi liên quan đến ghi đè tệp phiên hiện có.
  • nnoremap <C-w>u :source ~/session.vim<CR> để "hoàn tác" lệnh cửa sổ cuối cùng.

Nếu bạn muốn đặc biệt mạnh mẽ, bạn có thể mở rộng điều này thông qua các chức năng để lưu các tệp phiên trong một ngăn xếp và bật chúng ra để có được một chuỗi hoàn tác đầy đủ, mặc dù tại thời điểm đó có thể hiệu quả hơn để viết một loạt các chức năng để theo dõi lịch sử lệnh cửa sổ trong bộ nhớ ... tại thời điểm đó bạn có khả năng sao chép các plugin đã thực hiện loại điều này.


11

Một tùy chọn khác có thể là mở cửa sổ hiện tại của bạn trong một tab mới, sau đó chỉ cần đóng tab khi bạn hoàn tất.

Lệnh :split(hoặc :spviết tắt), không có đối số, có tác dụng mở một phân tách mới với cùng bộ đệm như phân tách hiện tại. Các :tablệnh có thể chạy nhiều lệnh cửa sổ liên quan đến việc thay đổi họ sử dụng một tab để thay thế. Kết hợp những thứ này lại với nhau :tab sp, sẽ mở ra một tab mới với bộ đệm hiện tại.

Sau đó, bạn có thể đóng tab mới bằng :qhoặc :tabclose( :tabcviết tắt).


2

Tôi sử dụng plugin ZoomWin ( https://github.com/itspriddle/ZoomWin ) cho chính xác kịch bản này. Nhấn CtrlW- Olần thứ hai khôi phục bố cục cửa sổ của bạn.


1
cảm ơn về lời đề nghị, nhưng như tôi đã lưu ý trong câu hỏi của mình, tôi muốn biết liệu điều này có thể được thực hiện mà không cần plugin không.
Bhargav Bhat

1
Plugin này chậm đối với tôi vì một số lý do khi thu nhỏ. Còn ai có vấn đề tương tự không?
hét lên

2

Những gì bạn đang mô tả âm thanh chính xác giống như tính năng đi theo tên "phóng to". Đã có một câu trả lời tuyệt vời về SO làm điều đó rất tốt.

EDIT: Trả lời rõ ràng, sao chép và dán từ SO . Tôi đặt đoạn trích bên dưới trong .vimrc của mình và sau đó gọi

:ZoomToggle

trong dấu nhắc lệnh vim của tôi.

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

Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
muru

Tại sao các downvote?
John Schmitt

Không phải tôi. Có lẽ bất cứ ai đã gắn cờ nó.
muru

sao chép và dán từ SO không hữu ích hơn nhiều so với liên kết
alxndr

Tôi đồng ý. Điều gì sẽ là điều hữu ích nhất tôi có thể làm?
John Schmitt

0

Bài đăng này là cũ, câu trả lời được chấp nhận không quan tâm terminal buffer.

Câu trả lời được chấp nhận sử dụng sessionđể thực hiện thủ thuật, nhưng sessionkhông thể khôi phục hoàn toàn 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.
...

Câu trả lời của Tommcdo vẫn hoạt động, <c-w>:tab splithoạt động tốt trên terminal buffer. Nó xứng đáng với một bản đồ:

nnoremap <c-w><space> :tab split<cr>
tnoremap <c-w><space> <c-w>:tab split<cr>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.