Asumsikan saya punya beberapa tata letak pemisahan yang acak di vim.
____________________
| one | two |
| | |
| |______|
| | three|
| | |
|___________|______|
Apakah ada cara untuk swap one
dan two
dan mempertahankan tata letak yang sama? Sederhana dalam contoh ini, tetapi saya mencari solusi yang akan membantu tata letak yang lebih kompleks.
MEMPERBARUI:
Saya kira saya harus lebih jelas. Contoh saya sebelumnya adalah penyederhanaan case-use yang sebenarnya. Dengan contoh aktual:
Bagaimana saya bisa menukar dua perpecahan itu, mempertahankan tata letak yang sama?
Memperbarui! 3+ tahun kemudian ...
Saya menempatkan solusi sgriffin dalam plugin Vim yang dapat Anda instal dengan mudah! Instal dengan pengelola plugin favorit Anda dan cobalah: WindowSwap.vim
Jawaban:
Agak terlambat ke pos, tetapi menemukan ini mencari sesuatu yang lain. Saya menulis dua fungsi beberapa waktu lalu untuk menandai jendela dan kemudian menukar buffer antar windows. Ini sepertinya yang Anda minta.
Hanya menampar ini di .vimrc Anda dan memetakan fungsi yang Anda inginkan:
Untuk menggunakan (dengan asumsi pemimpin peta Anda disetel ke \) Anda akan:
Voila! Buffer bertukar tanpa mengacaukan tata letak jendela Anda!
sumber
noremap
pemetaan untuk membuatnya bekerja. Tidak yakin mengapa, tetapi mudah-mudahan itu membantu siapa saja yang menemukan ini nanti. : D0r!figlet one
[dua, tiga, dll], lalu mengujinya. Sebelum melangkah lebih jauh, saya memeriksa github, menemukan plugin Anda (wes '), dengan swap jendela figlet animasi, dan tautan ke jawaban yang sama (yang saya miliki sebagai komentar di .vimrc). Saya merasa sudah membuat dan mengunggahnya, dan kemudian melupakannya. Ngomong-ngomong, pekerjaan bagus! Menghemat saya kerja :)Dimulai dengan ini:
Jadikan 'tiga' jendela aktif, lalu jalankan perintah ctrl+ w J. Ini menggerakkan jendela saat ini untuk mengisi bagian bawah layar, memberi Anda:
Sekarang jadikan 'satu' atau 'dua' jendela aktif, lalu jalankan perintah ctrl+ w r. Ini 'memutar' jendela di baris saat ini, memberi Anda:
Sekarang buat 'dua' jendela aktif, dan keluarkan perintah ctrl+ w H. Ini menggerakkan jendela saat ini untuk mengisi bagian kiri layar, memberi Anda:
Seperti yang Anda lihat, manuvernya sedikit acak-acakan. Dengan 3 jendela, ini agak seperti salah satu teka-teki 'permainan ubin'. Saya tidak menyarankan mencoba ini jika Anda memiliki 4 jendela atau lebih - Anda lebih baik menutupnya kemudian membukanya lagi di posisi yang diinginkan.
Saya membuat screencast mendemonstrasikan bagaimana cara bekerja dengan windows split di Vim .
sumber
ctrl-w r
bekerja seperti pesona. Terima kasih atas tipnya! Ini +1 saya.\mw
/\pw
dan yang ini dan mencoba menggunakan keduanya selama seminggu masing-masing. Saya menemukan menggunakan solusi "asli" ini bekerja paling baik, karena saya tidak harus terus memasang plugin di selusin instalasi vim yang saya miliki di server dan mesin jarak jauh dan desktop, laptop, tablet, dan semua perangkat lainnya. TKI, mempelajari perintah-perintah Asli ini (mis.ctrl-w r
) Adalah benar-benar semua yang Anda butuhkan untuk mengkomit otot memori dan dilakukan.Lihatlah
:h ctrl-w_ctrl-x
dan / atau:h ctrl-w_ctrl-r
. Perintah-perintah ini memungkinkan Anda untuk bertukar atau memutar jendela di tata letak saat ini.Sunting: Sebenarnya, ini tidak akan berfungsi dalam situasi ini karena hanya akan bertukar di kolom atau baris saat ini. Anda bisa pergi ke masing-masing windows dan memilih buffer target, tapi itu cukup bertele-tele.
sumber
Randy benar karena
CTRL-W x
tidak ingin menukar windows yang tidak ada di kolom / baris yang sama.Saya telah menemukan bahwa
CTRL-W HJKL
tombol-tombol ini paling berguna ketika memanipulasi windows. Mereka akan memaksa jendela Anda saat ini keluar dari lokasi saat ini dan mengatakannya untuk menempati seluruh tepi yang ditunjukkan oleh arah tombol yang Anda tekan. Lihat:help window-moving
untuk lebih jelasnya.Untuk contoh Anda di atas, jika Anda mulai di jendela "satu", ini melakukan apa yang Anda inginkan:
Untuk kenyamanan, Anda dapat menetapkan urutan yang Anda butuhkan untuk pemetaan kunci (lihat
:help mapping
).sumber
Saya memiliki versi yang sedikit ditingkatkan dari solusi sgriffin, Anda dapat menukar windows tanpa menggunakan dua perintah, tetapi dengan perintah HJKL yang intuitif.
Jadi begini caranya:
Cobalah untuk memindahkan jendela Anda dengan menggunakan modal HJKL di simpul normal, itu sangat keren :)
sumber
Membangun berat pada jawaban @ sgriffin ini, inilah sesuatu yang bahkan lebih dekat dengan apa yang Anda minta:
Harap beri tahu saya jika perilaku tersebut tidak sesuai dengan harapan Anda.
sumber
Juga berdasarkan solusi sgriffin, buka jendela yang ingin Anda tukarkan, tekan
CTRL-w m
, buka jendela yang ingin Anda tukarkan dan tekanCTRL-w m
lagi.CTRL-w m
adalah pilihan mnemonik yang buruk, jadi jika ada yang membuat yang lebih baik, silakan edit ini.Juga, saya ingin menerima umpan balik dari skrip alias "Jendela bertanda. Harap ulangi sesuai target", namun karena menjadi vimscript noob, saya tidak tahu bagaimana melakukannya.
Semua yang dikatakan, skrip bekerja dengan baik apa adanya
sumber
Pendekatan berikut mungkin nyaman jika fungsi tidak tersedia karena beberapa alasan (karena itu bukan vim Anda).
Gunakan
:buffers
perintah untuk mengetahui id buffer terbuka, navigasikan ke jendela yang diinginkan dan gunakan perintah seperti:b 5
untuk membuka buffer (buffer number 5 dalam hal ini). Ulangi dua kali dan isi windows ditukar.Saya "menemukan" metode ini setelah beberapa upaya untuk menghafal
ctrl-w-something
urutan bahkan untuk tata letak yang sangat sederhana seperti satu-dua-tiga dalam pertanyaan awal.sumber
Benar-benar dingin, namun usulan saya untuk pemetaan adalah dengan menggunakan ^ W ^ J bukannya J (karena semua hjkl sudah memiliki makna), ditambah juga aku akan menarik di buffer baru, karena pada saat Anda ingin menukar sekitar Anda mungkin tidak ingin melanjutkan mengedit buffer yang sudah ada. Ini dia:
sumber
Semua jawaban di atas sangat bagus, sayangnya solusi ini tidak bekerja dengan baik jika dikombinasikan dengan QuickFix atau LocationList windows (saya mengalami masalah saat mencoba mendapatkan buffer pesan kesalahan Ale untuk bekerja dengan ini).
Larutan
Karena itu saya menambahkan baris kode tambahan untuk menutup semua jendela ini sebelum melakukan swap.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
Kode total terlihat seperti;
Kredit untuk fungsi swap Brandon Orther
Mengapa itu dibutuhkan?
Alasan fungsi swap tidak berfungsi dengan baik tanpa menghapus semua jendela QuickFix (QF) dan LocationList (LL) terlebih dahulu adalah karena jika induk dari buffer QF / LL get's hidden (dan tidak ditampilkan di jendela), QF / LL jendela digabungkan dengan itu dihapus. Ini bukan masalah dalam dirinya sendiri tetapi ketika jendela menyembunyikan semua nomor jendela dipindahkan dan swap kacau karena nomor yang disimpan dari jendela yang ditandai pertama tidak (berpotensi) tidak ada lagi.
Untuk menempatkan perspektif ini:
Tanda jendela pertama
Tanda jendela kedua
Switch buffer pertama, window satu diisi dengan buffer window tiga. Dengan demikian jendela QF dihapus karena tidak memiliki jendela induk lagi. Ini mengatur ulang nomor windows. Perhatikan bahwa curNum (jumlah jendela yang dipilih kedua) menunjuk ke jendela yang tidak ada lagi.
Jadi ketika mengganti buffer kedua, ia mencoba untuk memilih jendela curNum, yang tidak ada lagi. Jadi itu menciptakannya dan mengaktifkan buffer, menghasilkan satu jendela yang tidak diinginkan untuk tetap diam.
sumber
Pendekatan mark-window-then-swap-buffer yang serupa, tetapi juga memungkinkan Anda menggunakan kembali swapping terakhir.
sumber
set hidden
di .vimrc, tidak perlu menyembunyikan buffer secara manual.Anda juga bisa menggunakan tiling window manager seperti X-monad
sumber