Menggunakan tab Vim seperti buffer

366

Saya telah melihat kemampuan untuk menggunakan tab di Vim (dengan :tabe,, :tabnewdll.) Sebagai pengganti praktik saya saat ini memiliki banyak file yang dibuka di jendela yang sama di buffer tersembunyi.

Saya ingin setiap file berbeda yang saya buka selalu ada di tabnya sendiri. Namun, ada beberapa hal yang menghalangi hal ini. Bagaimana cara memperbaikinya:

  1. Saat perintah suka gfdan ^]lompat ke lokasi di file lain, file tersebut membuka buffer baru di tab saat ini. Apakah ada cara agar semua jenis perintah ini membuka file di tab baru, atau beralih ke tab yang ada dengan file jika sudah terbuka?

  2. Saat mengganti buffer yang bisa saya gunakan :b <part of filename><tab> dan itu akan melengkapi nama file di buffer yang ada. <part of filename>bahkan bisa menjadi tengah nama file, bukan awal. Apakah ada yang setara untuk berpindah tab?

lekukan
sumber

Jawaban:

642

Berhenti, berhenti, berhenti.

Ini bukan bagaimana tab Vim dirancang untuk digunakan. Faktanya, mereka salah nama. Nama yang lebih baik adalah "viewport" atau "tata letak", karena itulah tabnya — tata letak jendela yang berbeda dari semua buffer yang ada.

Mencoba untuk mengalahkan Vim menjadi 1 tab == 1 buffer adalah latihan yang sia-sia. Vim tidak tahu atau peduli dan tidak akan menghormati itu pada semua perintah-khususnya, apa pun yang menggunakan quickfix penyangga ( :make, :grep, dan :helpgrepadalah orang-orang yang muncul dalam pikiran) dengan senang hati akan mengabaikan tab dan tidak ada yang dapat Anda lakukan untuk berhenti bahwa.

Sebagai gantinya:

  • :set hidden
    Jika Anda belum memiliki set ini, maka lakukanlah. Itu membuat vim bekerja seperti editor multi-file lainnya di planet ini. Anda dapat mengedit buffer yang tidak terlihat di jendela di suatu tempat.
  • Gunakan :bn, :bp, :b #,:b name , dan ctrl-6untuk beralih di antara buffer. Saya suka ctrl-6sendiri (sendiri itu beralih ke buffer yang sebelumnya digunakan, atau #ctrl-6beralih ke nomor buffer #).
  • Gunakan :lsuntuk membuat daftar buffer, atau sebuah plugin seperti MiniBufExpl atau BufExplorer .
Zathrus
sumber
192
Bagi saya, ini adalah bug, bukan "kesalahan pengguna". Pencarian di web untuk 'tab vim' menunjukkan bahwa hampir semua orang tidak setuju dengan Anda, atau tidak mengetahui cara "nyata" untuk menggunakan tab Vim. Juga, jika tab benar-benar tampilan "tata letak", lalu mengapa judul tab default, nama file saat ini? Jika saya ingin banyak tampilan dari file yang sama, maka semua judul tab saya akan menjadi nama yang sama (tidak sangat membantu?). Jadi bagaimanapun Anda melihatnya, implementasi tab default di Vim cacat.
cmcginty
45
Apa lagi yang akan Anda tampilkan di judul tab? Ini menunjukkan nama buffer saat ini (bukan "nama file"). Anda dapat mengubah apa yang ditampilkan dalam judul tab.
aehlke
46
@Casey: FWIW, ketika saya pertama kali tahu tentang tab Vim dan harus membungkus kepala saya tentang mereka dan untuk apa mereka, memikirkan persis definisi yang diberikan oleh Zathrus. (Saya seorang pemula Vim btw). Jadi tidak, saya tidak setuju itu fitur yang rusak atau tidak intuitif ... bahkan kurang setuju bahwa "tentang semua orang" tidak setuju (dan berpikir bahwa setidaknya satu atau dua referensi dapat memberikan bobot lebih pada pernyataan). Ini bekerja sangat baik untuk memiliki beberapa, tata letak layar simultan.
Atau
17
Komentar ini salah, saya tidak yakin mengapa itu dibatalkan atau diterima. Robince di bawah ini memiliki jawaban yang benar -: tab sball dan: switchbuf adalah yang Anda cari.
Roel
38
+1 untuk "Stop, stop, stop". Vim adalah mentalitas dan juga alat. Penting untuk mengajarkan mentalitas baru kepada pengguna baru, sehingga mereka dapat menggunakan alat secara maksimal.
Cody Poll
273

Agak terlambat ke pesta di sini tetapi terkejut saya tidak melihat yang berikut dalam daftar ini:

:tab sball - ini membuka tab baru untuk setiap buffer terbuka.

:help switchbuf- ini mengontrol perilaku switching buffer, coba :set switchbuf=usetab,newtab. Ini harus berarti beralih ke tab yang ada jika buffer terbuka, atau membuat yang baru jika tidak.

merampok
sumber
4
+1 untuk switchbuf- set switchbuf=useopenbagus untuk menghindari perilaku menjengkelkan :make, :vimgrepdan perintah serupa yang mengubah buffer dalam tata letak jendela bahkan ketika buffer sudah ditampilkan.
mMontu
3
mengapa tidak cocok untukku? setelah diatur :se switchbuf=usetab,newtab, ketika digunakan bnuntuk beralih buffer, masih membuka file buffer di tab saat ini alih-alih beralih ke tab yang ada? Apakah ada yang salah?
zhiyelee
173

Vim :help windowmenjelaskan kebingungan "tab vs buffer" dengan cukup baik.

Buffer adalah teks dalam memori dari suatu file.
Jendela adalah viewport pada buffer.
Halaman tab adalah kumpulan windows.

Membuka beberapa file dicapai dengan vim buffer . Di editor lain (mis. Notepad ++) ini dilakukan dengan tab, jadi nama tab di vim mungkin menyesatkan.

Windows bertujuan untuk membagi ruang kerja dan menampilkan beberapa file (buffer) secara bersamaan pada satu layar. Di editor lain, ini bisa dicapai dengan membuka banyak jendela GUI dan menatanya kembali di desktop.

Akhirnya di halaman tab analogi vim ini akan sesuai dengan beberapa desktop, yaitu pengaturan ulang windows yang berbeda.

Sebagai vim help: tab-page menjelaskan halaman tab dapat digunakan, ketika seseorang ingin mengedit file untuk sementara, tetapi tidak ingin mengubah apa pun dalam tata letak windows dan buffer saat ini. Dalam kasus seperti itu, halaman tab lain dapat digunakan hanya untuk tujuan mengedit file tertentu.

Tentu saja Anda harus ingat bahwa menampilkan file yang sama di banyak halaman tab atau windows akan menghasilkan menampilkan copy (buffer) kerja yang sama.

crenate
sumber
11
Ini sebenarnya jawaban yang luar biasa, tetapi perlu beberapa bacaan agar masuk akal. buffer = tab, jendela = jendela gui, halaman tab = desktop paling masuk akal sejauh ini yang saya temukan untuk seseorang yang tidak terbiasa dengan konsep
icc97
4
Saya cenderung menganggap mereka melihat melalui jendela ke dalam ruangan - buffer= objek , window= panel , dan tab= jendela . Saya dapat bergerak di sekitar ruangan dan melihat dari jendela yang berbeda ( tabs). Jendela yang berbeda dapat memiliki jumlah, pengaturan, dan ukuran panel yang berbeda . Objek yang sama dapat dilihat secara bersamaan dari panel yang berbeda di jendela yang berbeda .
go2null
Jika Anda terbiasa dengan Linux Workspaces dan paradigma Windows, maka Anda akan melihat warisan vimpenggunaannya. Pada awalnya hanya ada jendela . Pengelola jendela kemudian memungkinkan Anda untuk membagi jendela menjadi panel (ubin WM) atau menjadi panel yang tumpang tindih (, WM mengambang) tetapi mereka masih menyebut masing-masing panel sebagai jendela. Sekarang tambahkan konsep ruang kerja di mana panel dapat ditampilkan di banyak ruang kerja. Jadi, dalam paradigma ini, buffer= app , window= window dan tab= workspace .
go2null
56

Berlawanan dengan beberapa jawaban lain di sini, saya mengatakan bahwa Anda dapat menggunakan tab sesuka Anda. vim dirancang agar fleksibel dan dapat disesuaikan, daripada memaksa Anda untuk bekerja sesuai dengan parameter yang telah ditentukan. Kita semua tahu bagaimana kita para programmer suka memaksakan "etika" kita pada orang lain, jadi pencapaian ini tentu saja merupakan fitur utama.

<C-w>gfadalah tab yang setara dengan gfperintah buffer . <C-PageUp>dan <C-PageDown>akan beralih antar tab. (Dalam Byobu, kedua perintah ini tidak pernah bekerja untuk saya, tetapi mereka bekerja di luar Byobu / tmux. Alternatifnya adalah gtdan gT.) <C-w>T Akan memindahkan jendela saat ini ke halaman tab baru.

Jika Anda lebih suka menggunakan vim menggunakan tab yang ada jika memungkinkan, daripada membuat tab duplikat, tambahkan :set switchbuf=usetabke file .vimrc Anda. Anda dapat menambahkan newtabke daftar ( :set switchbuf=usetab,newtab) untuk memaksa perintah QuickFix yang menampilkan kompilasi kesalahan untuk dibuka di tab terpisah. Saya lebih suka split, yang membuka kesalahan kompilasi di jendela terpisah.

Jika dukungan mouse diaktifkan :set mouse=a, Anda dapat berinteraksi dengan tab dengan mengkliknya. Ada juga +tombol secara default yang akan membuat tab baru.

Untuk dokumentasi pada tab, ketikkan :help tab-pagedalam mode normal. (Setelah Anda melakukannya, Anda dapat berlatih memindahkan jendela ke tab menggunakan <C-w>T.) Ada daftar panjang perintah. Beberapa perintah jendela berhubungan dengan tab, jadi Anda mungkin ingin melihat dokumentasi itu juga melalui :help windows.

Tambahan: 2013-12-19

Untuk membuka banyak file dalam vim dengan setiap file di tab terpisah, gunakan vim -p file1 file2 .... Jika Anda seperti saya dan selalu lupa menambahkan -p, Anda dapat menambahkannya di akhir, karena vim mengikuti aturan penguraian opsi baris perintah normal. Atau, Anda dapat menambahkan pemetaan alias bash vimke vim -p.

Zenexer
sumber
3
vim -pNamun +1 untuk diketahui bahwa hanya hingga 10 tab yang akan ditampilkan secara default. File tambahan dimuat ke buffer, tetapi tidak ditampilkan di tab mereka sendiri.
IanB
@IB: bagaimana cara mengatasi pengaturan standar untuk membatasi ke 10 tab?
0xC0000022L
3
@ 0xC0000022L lihat tabpagemaxpengaturan
IanB
14

Saya mengalami masalah yang sama. Saya ingin tab berfungsi seperti buffer dan saya tidak pernah berhasil mengaturnya. Solusi yang akhirnya saya setujui adalah membuat buffer berperilaku seperti tab!

Periksa plugin yang disebut Mini Buffer Explorer , setelah diinstal dan dikonfigurasikan, Anda akan dapat bekerja dengan buffer dengan cara yang sama seperti tab tanpa kehilangan fungsionalitas apa pun.

Dominic Dos Santos
sumber
10

Ini adalah jawaban untuk mereka yang tidak terbiasa dengan Vim dan datang dari editor teks lain (dalam kasus saya Sublime Text).

Saya membaca semua jawaban ini dan masih belum jelas. Jika Anda membacanya cukup banyak hal mulai masuk akal, tetapi butuh berjam-jam bolak-balik antara pertanyaan.

Hal pertama adalah, seperti yang dijelaskan orang lain:

Tab Pages , terdengar sangat mirip tab , mereka bertindak seperti tab dan sangat mirip tab di sebagian besar editor GUI lainnya, tetapi sebenarnya tidak. Saya pikir ini adalah model mental yang buruk yang dibangun di dalam Vim, yang sayangnya mengaburkan kekuatan ekstra yang Anda miliki dalam halaman tab.

Deskripsi pertama yang saya mengerti adalah dari jawaban @ crenate adalah bahwa mereka setara dengan beberapa desktop. Ketika dilihat dalam hal itu Anda hanya akan memiliki beberapa desktop terbuka tetapi memiliki banyak jendela GUI terbuka di masing-masing.

Saya akan mengatakan mereka mirip dengan editor / browser lain:

  1. Pengelompokan tab
  2. Sublime Text workspaces (yaitu daftar file terbuka yang Anda miliki dalam suatu proyek)

Ketika Anda melihat mereka seperti itu, Anda menyadari kekuatan mereka bahwa Anda dapat dengan mudah mengelompokkan set file (buffer) bersama-sama misalnya file CSS Anda, file HTML Anda dan file JS Anda di halaman tab yang berbeda. Yang sebenarnya cukup mengagumkan.

Deskripsi lain yang menurut saya membingungkan

Viewport

Ini tidak masuk akal bagi saya. Sebuah viewport yang walaupun memiliki istilah kamus yang ditentukan , saya hanya mendengar merujuk ke Vim windows di :help windowdoc. Viewport bukan istilah yang pernah saya dengar berkaitan dengan editor seperti Sublime Text, Visual Studio, Atom, Notepad ++. Bahkan saya belum pernah mendengarnya untuk Vim sampai saya mulai mencoba menggunakan halaman tab.

Jika Anda melihat halaman tab seperti beberapa desktop, maka merujuk ke desktop sebagai satu jendela tampaknya aneh.

Ruang kerja

Ini mungkin lebih masuk akal, definisi kamus adalah:

Fasilitas penyimpanan memori untuk penggunaan sementara.

Jadi itu seperti tempat Anda menyimpan sekelompok penyangga.

Saya awalnya tidak terdengar seperti konsep Sublime Text tentang ruang kerja yang merupakan daftar semua file yang Anda buka di proyek Anda:

file sublime-workspace, yang berisi data spesifik pengguna, seperti file yang terbuka dan masing-masing modifikasi.

Namun memikirkannya lebih lanjut, ini sebenarnya setuju. Jika Anda menganggap halaman tab Vim seperti proyek Teks Sublime, maka akan aneh jika hanya memiliki satu file terbuka di setiap proyek dan terus beralih di antara proyek. Karenanya mengapa menggunakan halaman tab untuk membuka hanya satu file itu aneh.

Koleksi jendela

The :help windowmengacu ke halaman tab dengan cara ini. Ditambah banyak jawaban lain menggunakan konsep yang sama. Namun sampai Anda mengetahui apa itu jendela vim, maka itu tidak banyak berguna, seperti membangun istana di atas pasir.

Seperti yang saya sebutkan di atas, jendela vim sama dengan viewport dan diam-diam dijelaskan dengan baik di artikel linux.com ini :

Fitur yang sangat berguna di Vim adalah kemampuan untuk membagi area yang dapat dilihat antara satu atau lebih file, atau hanya untuk membagi jendela untuk melihat dua bit file yang sama dengan lebih mudah. Dokumentasi Vim menyebut ini sebagai viewport atau jendela, secara bergantian.

Anda mungkin sudah terbiasa dengan fitur ini jika Anda pernah menggunakan fitur bantuan Vim dengan menggunakan: topik bantuan atau menekan tombol F1. Ketika Anda memasukkan bantuan, Vim membagi viewport dan membuka dokumentasi bantuan di viewport atas, meninggalkan dokumen Anda terbuka di viewport bawah.

Saya merasa aneh bahwa halaman tab disebut sebagai kumpulan jendela, bukan kumpulan buffer. Tapi saya kira Anda dapat memiliki dua halaman tab terpisah masing-masing terbuka dengan beberapa jendela semua menunjuk pada buffer yang sama, setidaknya itulah yang saya mengerti sejauh ini.

icc97
sumber
1
Akhirnya setelah satu tahun penuh penggunaan Vim penuh waktu, saya menemukan sebuah kasus di mana saya ingin menggunakan lebih dari satu halaman tab. Saat ini buffer berfungsi dengan baik untuk saya karena saya akan menggunakan tab di editor lain. Tetapi memiliki monitor besar saya membandingkan sejumlah 3-4 buffer berbeda. Kemudian seorang kolega meminta saya untuk mencari beberapa kode di basis kode yang lain. Daripada kehilangan set perbandingan windows saya, saya bisa membuat halaman tab baru yang kemudian memungkinkan saya untuk melakukan pencarian terpisah seperti yang saya lakukan ketika hanya menggunakan Vim secara normal dan kemudian saya bisa menutup halaman tab setelah selesai dan kembali ke set awal saya
icc97
4

Melihat pada: tab bantuan sepertinya vim tidak ingin bekerja seperti yang Anda lakukan ...

Buffer dibagi di seluruh tab, jadi sepertinya tidak mungkin untuk mengunci buffer yang diberikan hanya muncul di tab tertentu.

Tapi itu ide yang bagus.

Anda mungkin bisa mendapatkan efek yang Anda inginkan dengan menggunakan terminal yang mendukung tab, seperti terminal multi-gnome, lalu menjalankan instance vim di setiap tab terminal. Tidak sempurna, meskipun ...

Mike G.
sumber
Saya mencoba itu, masalah dengan itu, selain membuatnya sulit dinavigasi antar tab, adalah teks yang disentak tidak dapat dibagi di seluruh tab terminal, karena mereka pada dasarnya adalah dua terminal / cangkang yang berbeda
puk
@puk: Coba plugin YankRing vim. Ini menyimpan teks yang disentak dalam file, sehingga dapat dibagikan di seluruh contoh vim.
pixelastic
@Pixelastic Saya menemukan solusi yang cocok di sini untuk menarik ke clipboard sistem. Juga, Vim bekerja paling baik dalam satu contoh. Saya berhenti membuatnya melakukan apa yang saya inginkan, dan belajar cara menggunakan vim dengan benar :-) stackoverflow.com/a/8757876/654789
puk
@puk: Terima kasih, tidak terpikir oleh saya bahwa menggunakan clipboard sistem berarti membagikannya melalui instance vim :)
pixelastic
4
  • Anda dapat memetakan perintah yang biasanya memanipulasi buffer untuk memanipulasi tab, seperti yang telah saya lakukan dengan gf di .vimrc saya:

    map gf :tabe <cfile><CR>
    

    Saya yakin Anda dapat melakukan hal yang sama dengan [^

  • Saya tidak berpikir vim mendukung ini untuk tab (belum). Saya menggunakan gt dan gT untuk masing-masing pindah ke tab berikutnya dan sebelumnya. Anda juga dapat menggunakan Ngt, di mana N adalah nomor tab. Satu hal yang saya miliki adalah bahwa, secara default, nomor tab tidak ditampilkan di baris tab. Untuk memperbaikinya, saya meletakkan beberapa fungsi di akhir file .vimrc saya (saya tidak menempel di sini karena panjang dan tidak memformat dengan benar).

Lucas Oman
sumber
<c-w>gfakan membuka nama file di bawah kursor di tab baru
Peter Rincker
4

Saya menggunakan buffer seperti tab, menggunakan plugin BufExplorer dan beberapa makro:

" CTRL+b opens the buffer list
map <C-b> <esc>:BufExplorer<cr>

" gz in command mode closes the current buffer
map gz :bdelete<cr>

" g[bB] in command mode switch to the next/prev. buffer
map gb :bnext<cr>
map gB :bprev<cr>

Dengan BufExplorer Anda tidak memiliki bilah tab di bagian atas, tetapi di sisi lain itu menghemat ruang di layar Anda, ditambah lagi Anda dapat memiliki jumlah file / buffer terbuka dan daftar buffer dapat dicari ...

Jkramer
sumber
2

Jika Anda ingin buffer berfungsi seperti tab, lihat plugin tabline .

Itu menggunakan satu jendela, dan menambahkan garis di atas untuk mensimulasikan tab (hanya menampilkan daftar buffer). Ini keluar sejak lama ketika tab hanya didukung di GVim tetapi tidak di vim baris perintah. Karena ini hanya beroperasi dengan buffer, semuanya terintegrasi dengan baik dengan sisa vim.

thien.vuong
sumber