Bagaimana cara mengedit buffer yang ada di tab baru di vim?

51

Misalkan saya sudah mulai vim seperti ini:

vim foo bar

Sekarang saya memutuskan bahwa saya ingin masing-masing file di tab sendiri. Apakah ada cara untuk melakukan itu tanpa keluar vim dan menambahkan -popsi ke baris perintah saya?

innaM
sumber
Banyak dari Anda mungkin mencari tabe %yang disebutkan dalam jawaban liuyang1 di bawah ini.
Mateusz Piotrowski
1
@MateuszPiotrowski Seperti yang saya sebutkan di komentar ini untuk jawaban itu , :tabe %tidak bekerja dengan buffer yang tidak memiliki filepath yang valid. :tab sbbekerja setiap saat.
JoL

Jawaban:

30

Ketika Anda memulai vim seperti itu, Anda tidak mendapatkan klien vim, editor teks menggunakan terminal atau cmd prompt - dua file berada dalam dua buffer yang berbeda. Gunakan :lsuntuk membuat daftar buffer:

:ls
  1 %a   "foo"                 line 6
  2      "bar"             line 0

% A adalah buffer aktif. Anda dapat menggunakan :b2untuk beralih ke buffer 2 atau gunakan :bnuntuk siklus ke yang berikutnya atau :bpsebelumnya. Saya lebih suka (CTRL-W v) untuk membagi windows secara vertikal, daripada (CTRL-W), yang membelah secara horizontal.

Jika Anda memiliki 2 file yang dimuat & tanpa tab (belum), Anda bisa, :tabnewdan dalam jenis tab baru:b2

Jika Anda ingin selalu memiliki buffer dimuat ke dalam tab mereka sendiri, lihat artikel ini .

DaveParillo
sumber
Ya, tetapi saya ingin memiliki tab.
innaM
Jadi Anda sudah mulai vim dengan cara Anda memiliki file di klien vim, bukan di shell cmd / terminal?
DaveParillo
1
Saya tidak yakin apa yang Anda maksud. Saya menggunakan shell untuk memulai vim seperti dijelaskan di atas dan kemudian saya menjalankan vim.
innaM
Ah! Saya kira saya tidak pernah benar-benar mengerti bahwa buffer bukan lokal untuk tab. Saya selalu berpikir (tanpa berpikir banyak) bahwa setiap tab memiliki daftar penyangga sendiri.
innaM
Di mesin saya, vimakan meluncurkan editor di dalam shell. Untuk mendapatkan antarmuka pengguna grafis vim yang harus saya gunakan gvim. Dan Anda benar - buffer bersifat global untuk aplikasi vim.
DaveParillo
47

Anda ingin membuka buffer di tab baru?

Pisahkan layar (Ctrl-W), ambil jendela, dan Ctrl-W T

Benteng
sumber
Hmm. Tidak persis apa yang ada dalam pikiran saya, tetapi tidak buruk untuk memulai. Saya belum tahu tentang Ctrl-w Titu. Tentu saja, tab pertama masih akan memiliki dua buffer seperti itu.
innaM
Tidak. Setelah Anda membagi layar menjadi dua jendela, dan membuka salah satunya di tab baru, itu akan hilang dari tab pertama. Itu tidak akan tetap (setidaknya tidak pada gvim72 saya). Sejauh buffer pergi, mereka tidak terhubung ke windows / tab ... mereka lebih seperti memori di mana vim menyimpan konten file.
Rook
Ah! Kamu benar. Saya salah mengartikan output dari :ls.
innaM
Juga, ctrl-w V membagi jendela secara vertikal.
Shannon Nelson
1
CTRL-w v adalah perintah yang benar untuk memisahkan windows secara vertikal
JRM
27

Anda dapat melakukannya dengan menggabungkan tabperintah dengan sb[uffer]perintah.

Pertama, Anda harus mengetahui id buffer dari buffer yang ingin Anda buka di tab baru. Anda dapat mengetahui ini dengan lsperintah:

:ls
  1 %a   "foo"                          line 1
  2      "bar"                          line 0

Setelah memiliki id, Anda dapat dengan mudah membukanya di tab baru menggunakan:

:tab sb 2

The sbperintah biasanya membuka buffer yang diberikan di jendela perpecahan baru, tetapi tabperintah menyebabkannya untuk membuka di tab baru, sebagai gantinya.

The tabPerintah juga memungkinkan Anda untuk menentukan di mana dalam daftar tab tab baru harus dibuat. Misalnya, :0tab sb 2akan menghasilkan tab 'bilah' baru yang muncul di awal daftar alih-alih setelah tab saat ini.

rkjnsn
sumber
2
Anda tidak memerlukan nomor buffer, berikan bagian yang tidak ambigu dari nama buffer dan VIM mengerjakan sisanya untuk Anda.
hidangan penutup
1
Inilah jawaban yang saya cari dan butuhkan. Saya kecewa ketika :tab buffer part-of-nametidak membuka tab baru! Tetapi :tab sb part-of-namebekerja seperti pesona. Terima kasih!!!!
Sukima
Ini bukan pertanyaan persis OP, tetapi persis apa yang saya cari :)
jackcogdill
25

Cara yang lebih baik untuk mencapai apa yang diminta OP adalah:

:bufdo tab split

Ini akan membuka setiap buffer ke dalam tabnya sendiri, tidak peduli berapa banyak. Jika Anda sering menggunakan ini, mudah untuk membuat pemetaan di .vimrc Anda. Dikombinasikan dengan sesuatu seperti plugin vim kecil ini , yang berikut ini akan membuka setiap item dari :grep(atau : Ack ) di tabnya sendiri:

:grep foo
:QuickFixOpenAll
:bufdo tab split

Tentu saja, ketika beralih ke plugin itu akan cukup mudah untuk memodifikasinya untuk membuka konten daftar perbaikan cepat langsung ke tab.

UPDATE : Saya benar-benar harus memberikan teriakan untuk komentar ggustafsson di bawah ini. Jauh dan jauh, jawaban terbaik dari semuanya dan dengan indah menggambarkan kecenderungan Vim terhadap perilaku komposisi. Sarannya adalah:

 :tab sball

Sebaiknya mencari bantuan Vim untuk : tab dan : sball untuk melihat apa yang terjadi di sini.

John Whitley
sumber
Pendekatan serupa dari suntingan sebelumnya, untuk anak cucu, adalah :bufdo execute "tabnew %". Saya pikir pendekatan baru sedikit lebih jelas.
John Whitley
Satu peringatan: jika buffer awal di vim tidak kosong, ini tampaknya membuka buffer terakhir dua kali. Saya akan memposting pembaruan jika saya menemukan perbaikan sederhana.
John Whitley
12
:tab sballtampaknya bekerja lebih baik.
ggustafsson
6

1. Buka dua file di Vim.

$ vim foo bar

2. Periksa jumlah buffer.

: ls
  1% a "foo"
  2 "bar"

3. Rantai dua perintah: tabnewuntuk membuka tab baru dan b <buffer_number>memuat buffer yang diinginkan di tab.

: tabnew | b 2
Shamaoke
sumber
8
Masalah dengan langkah 3 adalah pertama kali membuat tab baru dengan buffer kosong, dan kemudian membuka buffer 2, menghasilkan buffer tanpa judul tambahan dalam daftar buffer. Lebih baik digunakan:tab sb 2
rkjnsn
1
@rkjnsn Anda harus memposting itu sebagai jawaban - sebaiknya jawab pertanyaan 'bagaimana cara mengedit buffer yang ada di tab baru di vim?'
JonnyRaa
1
@JonnyLeeds selesai.
rkjnsn
4

Tambahkan saja beberapa hal yang tidak disebutkan orang lain.

  • jendela saat ini ke tab baru

Jika memiliki banyak jendela, <C-W>Takan memindahkan jendela ini ke tab baru. Namun, pintasan ini hanya untuk "Jendela", bukan "penyangga". Jika memilih gaya ini, :spatau <C-W>suntuk menduplikasi buffer saat ini ke satu jendela lagi, maka <C-W>Tuntuk memindahkannya ke tab baru.

4 penekanan tombol atau 7 penekanan tombol.

  • buffer saat ini ke tab baru

:tabe % untuk membuka tab baru untuk buffer saat ini.

7 penekanan tombol.

  • buffer ke tab baru

Jika menggunakan plugin CtrlP, juga bisa menggunakan "CtrlPBuffer", lalu dengan <C-t>pintasan untuk membukanya dengan halaman tab baru. Gaya ini, mudah untuk beralih ke buffer yang berbeda.

Dengan pintasan "CtrlPBuffer", 4 penekanan tombol atau lebih.

liuyang1
sumber
:tabe %adalah apa yang sudah lama saya cari, terima kasih!
pevik
Tidak, :tabe %tidak benar-benar membuka tab baru untuk buffer saat ini. Apa yang terjadi adalah yang %diperluas ke filepath dari buffer saat ini dan :tabemembuka path itu. Vim akan melihat Anda mencoba membuka file yang sudah Anda buka dan akan menggunakan kembali buffer yang Anda miliki. Ini berarti bahwa ini tidak berfungsi dengan buffer yang tidak memiliki filepath. Jika Anda membuka file baru dengan :newdan Anda belum menyimpannya, Anda tidak dapat meletakkannya di tab baru dengan ini. Perintah sebenarnya yang Anda butuhkan adalah apa yang rkjnsn masukkan dalam jawaban mereka: :tab sb %atau lebih pendek::tab sb
JoL