Batalkan Jendela Saja

24

Pertimbangkan kasing dengan banyak split di jendela. vim memungkinkan dengan cepat "memaksimalkan" pemisahan saat ini untuk mengambil seluruh jendela melalui <C-W> o.

Adakah cara mendapatkan vim untuk "mengingat" pemisahan yang ada sebelumnya dan kembali ke keadaan ini setelah dieksekusi <C-W> o?

EDIT: Untuk memperjelas, saya mencari cara untuk melakukan ini tanpa menggunakan plugin pihak ketiga.

Bhargav Bhat
sumber
1
Saya menemukan jawaban ini di SO relevan, tetapi saya ingin memiliki fungsi ini tanpa plugin jika memungkinkan.
Bhargav Bhat
5
Harap sertakan persyaratan seperti itu dalam pertanyaan itu sendiri, bukan dalam komentar.
muru
Apakah pertanyaan ini dianggap duplikat jika ada di situs pertukaran stackex lain? stackoverflow.com/q/13194428/1698426
John Schmitt

Jawaban:

14

Cara paling sederhana untuk melakukan ini mungkin dengan file sesi, yaitu skrip vim (yang vim dapat hasilkan secara otomatis untuk Anda) yang akan memulihkan lingkungan pengeditan sebelumnya.

Anda dapat membuat file sesi baru menggunakan :mksession <filename>. Anda dapat memulihkan sesi itu dengan menjalankan skrip sesi yang dibuat :source <filename>,.

Dengan demikian, Anda bisa menyimpan sesi saat ini sebelum memaksimalkan jendela dan mengembalikannya ketika Anda ingin "unmaximize" jendela.

Dengan menggunakan ini, Anda bisa memetakan ulang perintah windowing yang sesuai untuk menyimpan sesi sebelumnya, dan menambahkan pemetaan baru untuk "membatalkan" perintah windowing terakhir dengan mengembalikan sesi. Sebagai contoh:

  • nnoremap <C-w>o :mksession! ~/session.vim<CR>:wincmd o<CR>dan seterusnya untuk semua perintah windowing yang ingin Anda dukung (lihat :help CTRL-W, ada banyak). The !mencegah kesalahan yang berkaitan dengan Timpa file sesi yang ada.
  • nnoremap <C-w>u :source ~/session.vim<CR> untuk "membatalkan" perintah windowing terakhir.

Jika Anda ingin menjadi sangat kuat, Anda dapat memperluas ini melalui fungsi untuk menyimpan file sesi dalam tumpukan dan menghapusnya untuk mendapatkan rantai undo penuh, meskipun pada saat itu mungkin lebih efisien untuk menulis banyak fungsi untuk melacak jendela perintah sejarah di memori ... di mana Anda kemungkinan menduplikasi plugin yang sudah melakukan hal semacam ini.


sumber
11

Pilihan lain bisa dengan membuka jendela Anda saat ini di tab baru, lalu cukup tutup tab setelah Anda selesai.

Perintah :split(atau :spsingkatnya), tanpa argumen, memiliki efek membuka split baru dengan buffer yang sama dengan split saat ini. The :tabperintah dapat menjalankan banyak perintah yang berhubungan dengan jendela, mengubah mereka untuk menggunakan tab sebagai gantinya. Menggabungkan ini bersama-sama memberi :tab sp, yang akan membuka tab baru dengan buffer saat ini.

Setelah itu, Anda dapat menutup tab baru dengan :qatau :tabclose( :tabcsingkatnya).

tommcdo
sumber
2

Saya menggunakan plugin ZoomWin ( https://github.com/itspriddle/ZoomWin ) untuk skenario ini. Menekan CtrlW- Ountuk kedua kalinya mengembalikan tata letak jendela Anda.

craigp
sumber
1
terima kasih atas sarannya, tetapi seperti yang saya perhatikan dalam pertanyaan saya, saya ingin tahu apakah ini dapat dilakukan tanpa plugin.
Bhargav Bhat
1
Plugin ini lambat bagi saya karena beberapa alasan ketika memperkecil. Adakah orang lain yang memiliki masalah yang sama?
pekik
2

Apa yang Anda gambarkan terdengar persis seperti fitur yang menggunakan nama "zooming". Sudah ada jawaban bagus pada SO yang melakukannya dengan sangat baik.

EDIT: Jawaban eksplisit, disalin dan ditempel dari SO . Saya menempatkan potongan di bawah ini di .vimrc saya dan kemudian memohon

:ZoomToggle

di command prompt vim saya.

" 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
sumber
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah.
muru
Mengapa downvote?
John Schmitt
Bukan saya. Mungkin siapa pun yang menandai itu.
muru
salin dan tempel dari SO tidak lebih berguna daripada menautkan
alxndr
Saya setuju. Apa hal paling berguna yang bisa saya lakukan?
John Schmitt
0

Posting ini sudah tua, jawaban yang diterima tidak perlu dikhawatirkan terminal buffer.

Jawaban yang diterima digunakan sessionuntuk melakukan trik, tetapi sessiontidak dapat sepenuhnya memulihkan 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 ini jawabannya masih bekerja, <c-w>:tab splitbekerja dengan baik pada terminal buffer. Layak peta:

nnoremap <c-w><space> :tab split<cr>
tnoremap <c-w><space> <c-w>:tab split<cr>
dedowsdi
sumber