Gandakan buffer ke tab baru alih-alih memindahkannya

10

Saya sering ingin memaksimalkan buffer sementara di halaman tab dan kemudian kembali ke konfigurasi buffer lama yang saya lihat. Alur kerja saya saat ini untuk melakukan sesuatu seperti ini adalah menutup semua buffer lain menggunakan <c-w>oatau memindahkan buffer yang saat ini saya lihat ke tabnya sendiri <c-w>T. Masalah dengan pendekatan kedua adalah ia menghapus buffer dari halaman tab asli.

Saya mengisi tiga file a.txt, b.txtdan c.txtdengan a, b, dan cmasing-masing.

% echo a > a.txt
% echo b > b.txt
% echo c > c.txt

Ketika saya membuka ketiga file ini dalam satu halaman tab, saya mendapatkan yang berikut ini.

masukkan deskripsi gambar di sini

Lalu saya bisa pindah a.txtke tab dengan sendirinya. Namun, ketika saya melakukannya, a.txtdihapus dari halaman tab asli. (Jadi ini akan menjadi setelah a <c-w>Tgt)

masukkan deskripsi gambar di sini

Saya ingin kemampuan untuk memilih pada saat itu saya akan menekan <c-w>Tuntuk menjaga isi buffer asli, membuat halaman tab baru yang hanya berisi buffer yang saat ini fokus, dan kemudian fokus halaman tab baru yang baru saja saya dibuat. Dengan kata lain, perintah hampir persis seperti <c-w>Tkecuali bahwa halaman tab asli dipertahankan dan sekarang a.txtberada di dua halaman tab.

Apakah ada cara untuk melakukan ini?

Gregory Nisbet
sumber

Jawaban:

13

Saya tidak yakin tetapi Anda bisa mencoba :tab split(atau versi yang lebih pendek :tab sp).

The :splitperintah harus menduplikasi viewport menampilkan a.txt, sedangkan :tabpengubah harus bergerak viewport ini ke halaman tab khusus.


Jika Anda ingin mengubah perilaku C-w T, Anda dapat memetakannya kembali seperti ini:

nnoremap <C-w>T :tab split<CR>

Secara umum, setiap kali Anda menemukan perintah yang membagi jendela, dan Anda lebih suka itu menciptakan halaman tab baru, Anda bisa mengawali dengan :tab.

Ini dapat digunakan, misalnya, untuk membaca buffer bantuan di halaman tab baru:

:tab help {your_topic}

Secara default, halaman tab baru akan muncul setelah yang sekarang. Tetapi jika Anda ingin membuatnya muncul di tempat lain, Anda bisa mengawali :tabdengan hitungan.

Misalnya, untuk menduplikasi viewport saat ini di halaman tab setelah yang ke-3, Anda bisa mengetik:

:3tab split

Dan untuk membuatnya tampil sebagai yang pertama:

:0tab split

Untuk informasi lebih lanjut, Anda dapat membaca :h :tab:

:[count]tab {cmd}                   *:tab*
        Execute {cmd} and when it opens a new window open a new tab
        page instead.  Doesn't work for |:diffsplit|, |:diffpatch|,
        |:execute| and |:normal|.
        If [count] is given the new tab page appears after the tab
        page [count] otherwise the new tab page will appear after the
        current one.
        Examples:

            :tab split      " opens current buffer in new tab page
            :tab help gt    " opens tab page with help for "gt"
            :.tab help gt   " as above
            :+tab help      " opens tab page with help after the next
                            " tab page
            :-tab help      " opens tab page with help before the
                            " current one
            :0tab help      " opens tab page with help before the
                            " first one
            :$tab help      " opens tab page with help after the last
                            " one
pengguna9433424
sumber
2

Saya sebagian besar telah menghindari tab karena masalah ini, tetapi sekarang saya memiliki fungsi yang memiliki perilaku duplikasi tab yang saya inginkan. Saya sudah mengujinya, tetapi belum mulai menggunakannya dengan sungguh-sungguh. Mungkin ada beberapa kekurangan tersembunyi untuk alur kerja ini.

Salah satu masalah dengan fungsi ini adalah bahwa itu tidak menduplikasi beberapa negara dari pasangan buffer-window sebelumnya (seperti apakah set numberaktif atau tidak). Berspekulasi sedikit, c-w Tmungkin tidak memiliki masalah ini karena tidak ada duplikasi yang dilakukan dan jendela mungkin hanya direparasi.

Vim memiliki beberapa daftar berbasis 1 untuk hal-hal seperti buffer, tab, dan windows. Sejauh yang saya tahu, mereka berbasis 1 karena 0kuncinya digunakan untuk pindah ke awal garis dan sebagai hasilnya melewati nol sebagai argumen numerik tidak mungkin.

Kami peduli dengan tiga daftar untuk meniru fungsi ini:

  • Daftar halaman tab global
  • Daftar per [tab halaman] windows
  • Daftar buffer global

Kami menyimpan semua nilai ini, lalu membuat tab baru melalui "tabnew". Tab baru selalu dibuat di sebelah kanan, sehingga tidak ada indeks di bawah tab yang kami tabnewgunakan tidak valid. (Cara yang lebih kuat untuk melakukan ini mungkin akan lebih baik).

The tabnewperintah juga bergerak fokus ke tab baru dan satu jendela di dalamnya. Dari sana kita dapat menggunakan bufferperintah untuk membuat tampilan ke buffer yang awalnya memiliki fokus.

Kemudian kami menggunakan indeks tersimpan dari tab asli untuk mengembalikan fokus kembali ke tab itu. Dan kemudian, sebagian besar karena paranoia, kami menetapkan fokus di dalam tab itu ke jendela asli. Vim tampaknya mengingat jendela mana yang memiliki fokus pada tab yang tidak terlihat, tapi saya tidak suka mengandalkan itu.

(Beberapa poin gaya: konversi numerik eksplisit 0+, variabel global, dan pernyataan semuanya disengaja)

function! TabDuplicate()
  " set vars, sanity checking
  let g:tabdup_win      = 0+ winnr()
  let g:tabdup_buf      = 0+ bufnr('%')
  let g:tabdup_tabpage  = 0+ tabpagenr()
  call assert_true(g:tabdup_win > 0)
  call assert_true(g:tabdup_buf > 0)
  call assert_true(g:tabdup_tabpage > 0)
  " make a new tab page,
  " the new tab page will have focus
  " none of the indices, which are all
  " less than the current index, are
  " invalidated by creating a new tab
  execute "tabnew"
  " visit the buffer we saved
  execute "buffer " . g:tabdup_buf
  " return to the original tab page
  execute "tabnext " . g:tabdup_tabpage
  " return focus to original window
  execute g:tabdup_win . " windcmd w"
endfunction
Gregory Nisbet
sumber