Pindahkan jendela yang ada ke tab yang ada

14

Terkadang saya perlu memindahkan windows ke tab yang sudah ada, dan saya bertanya-tanya apakah ada pintasan perintah / keyboard yang bisa melakukan ini. Saya tahu saya bisa menutup jendela, beralih ke tab, dan kemudian membukanya di split baru, tapi saya bertanya-tanya apakah ada cara yang lebih pendek untuk mencapai ini. Perhatikan bahwa saya ingin memindahkannya ke tab yang sudah ada , bukan tab baru seperti <C-w>Thalnya.

Pohon cemara
sumber
Tidak mungkin memindahkan windows melintasi tab.
lcd047
Hmm, itu terlalu buruk. Saya mungkin bisa membuat beberapa pemetaan atau perintah yang bisa menyelesaikannya.
EvergreenTree
Saya pikir yang terbaik yang dapat Anda lakukan adalah menyimpan semua pengaturan jendela dan kemudian membuatnya kembali pada tab yang ada.
tommcdo

Jawaban:

10

Meskipun ada perintah untuk memindahkan jendela yang ada di halaman tab saat ini (yaitu memengaruhi tata letak jendela dengan memutar, mengubah ukuran, dan memindahkan), tidak ada perintah untuk memindahkan jendela ke tab lain.

Karena jendela hanyalah viewport ke buffer yang dimuat, Anda harus:

  1. Perhatikan nomor buffer yang ditampilkan di jendela saat ini.
  2. :close! jendela.
  3. Beralih ke halaman tab target yang ada.
  4. :sbuffer nomor buffer untuk membukanya kembali.

Anda akan kehilangan opsi spesifik jendela apa pun karena hal ini. Anda dapat menyimpan dan mengembalikannya dalam skrip juga.

Ingo Karkat
sumber
Saya pikir inilah masalahnya. Saya mungkin bisa membuat skrip kecil yang melakukan hal itu.
EvergreenTree
2
  1. buka tab target yang ada
  2. membaginya sesuai keinginan Anda
  3. :b ab(tab-lengkapi sisanya)

abhanya huruf acak, ganti dengan awal nama file yang Anda inginkan. :btab-completion telah bekerja sangat baik untuk saya, biasanya dapat menemukan sumber buffer yang tepat berdasarkan hanya satu huruf dan 1-2 Tabpenekanan tombol.

Manfaat dari pendekatan ini terhadap Ingo adalah kurangnya memperhatikan atau mengingat apa pun, yang berarti beban kognitif lebih sedikit. Nama file yang sudah Anda ketahui.

lkraav
sumber
2

Dua perintah yang didefinisikan di bawah ini memindahkan semua buffer dari tab tangan kanan ke tab saat ini dan kemudian tutup tab tangan kanan. Mtabspmemindahkannya dengan membelah secara horizontal dan Mtabvspmembelah secara vertikal. Anda perlu memindahkan tab gabungan sebelum menggunakan perintah. Gunakan +tabm, -tabmatau <n>tabm.

Mempersiapkan

Tambahkan skrip vim di bawah ini ke vimrc:

function! Mtab(vert)
    if tabpagenr() == tabpagenr("$")
        return 0
    endif
    +tabnext
    let s:killed_tab = tabpagenr()
    let s:buf_list = tabpagebuflist()
    -tabnext
    for item in s:buf_list
        if a:vert
            vsp
        else
            sp
        endif
        execute "buf " . item
    endfor
    execute "tabclose " . s:killed_tab
endfunction

command! Mtabsp call Mtab(0)
command! Mtabvsp call Mtab(1)

Rincian teknis

Fungsi Mtab menerima satu parameter vert. Ini menentukan apakah tab saat ini dipisah secara horizontal atau vertikal.

Hasil yang diinginkan dicapai dengan langkah-langkah berikut:

  1. Kami pindah ke tab berikutnya untuk sementara
  2. Gunakan dua variabel untuk merujuk nomor tab dan buffernya
  3. Kembali ke tab saat ini
  4. Kami membagi tab dan membuka setiap buffer
  5. Akhirnya, kami menutup tab kanan

Jika tab kita saat ini adalah yang terakhir, perintahnya diabaikan.

evpo
sumber
1

Jika ini adalah buffer file (tidak akan berfungsi untuk buffer awal, dll.), Anda dapat:

  1. :let @f=@%ENTER - di jendela sumber;
    • Ini menggantikan isi register reguler f dengan isi register khusus % , yang berisi nama file saat ini.
    • Catatan: Saya memilih register f seperti dalam file , tetapi Anda dapat menggunakan register lain yang Anda suka.
    • Anda dapat memverifikasi bahwa register berisi jalur yang benar dengan: :echo @f
  2. Secara opsional: Ctrl-WCtrl-Q- untuk menutup jendela lama;
  3. gt/ gT- arahkan ke tab target (dan jendela);
  4. Ctrl-Ws - pisahkan tab sesuka Anda, untuk membuka jendela baru;
  5. :e␣Ctrl-RfENTER
    • di jendela yang baru dibuka, memuat file dari jalur yang disimpan dalam register f ;
    • Catatan: karakter ␣ di sini menandai spasi reguler.

Catatan penting: langkah terakhir tidak akan berfungsi dengan benar jika path berisi spasi atau beberapa karakter khusus! :-( Sebagai solusinya, perintah berikut, sedikit lebih panjang harus bekerja untuk jalur dengan spasi (meskipun mungkin masih gagal untuk beberapa karakter khusus lainnya):

  • :e␣"Ctrl-Rf"ENTER

(yaitu, mengutip hasil Ctrl-R, f )

Terinspirasi oleh jawaban dari lkraav dan ingo-karkat .

alias
sumber
Ini luar biasa, saya perlu mengatur pemetaan untuk "cut and paste" Windows ke Tab.
dragon788