Bagaimana saya bisa membuka banyak tab sekaligus?

14

Jika saya menggunakan:

:tabedit file1 file2

Saya mendapat:

E172: Only one file name allowed

Apakah ada cara untuk digunakan :tabeditdengan banyak nama file? Atau cara lain untuk membuka banyak tab sekaligus?

Martin Tournoij
sumber
@kenorb Ya. Dan jawaban yang persis sama sudah ada di sini, kecuali tanpa penjelasan apa yang dilakukannya. Jadi, bagaimana menautkannya menambah nilai apa pun?
Martin Tournoij
Ada beberapa jawaban lain, dan jawaban baru bisa datang ke sana. Kedua ada beberapa tautan / terkait serupa lainnya di sana, sehingga pengguna dapat belajar lebih banyak dari onces terkait juga.
kenorb
Saya telah belajar ini satu-liner: :args *.c | tab all. Pertanyaan lain lebih populer daripada ini, jadi ada baiknya untuk menautkannya juga.
kenorb
Terkait: Buka beberapa file di tab baru dengan VIM di Stack Overflow.
Mihai Capotă

Jawaban:

10

Mengingat masalah & kompleksitas dalam jawaban saya yang lain menggunakan cara "bawaan" dengan mengubah daftar argumen, saya menambahkan fungsi kecil sendiri untuk melakukan ini:

" Open multiple tabs at once
fun! OpenMultipleTabs(pattern_list)
    for p in a:pattern_list
        for c in glob(l:p, 0, 1)
            execute 'tabedit ' . l:c
        endfor
    endfor
endfun

command! -bar -bang -nargs=+ -complete=file Tabedit call OpenMultipleTabs([<f-args>])

Anda sekarang dapat menggunakan :Tabedit *.vim. Fungsi ini akan memperluas semua pola globbing, dan mengeksekusi :tabedit <f>untuk setiap file. Anda dapat menambahkan banyak nama path yang Anda inginkan, misalnya ini semua berfungsi:

:Tabedit file.rb
:Tabedit *.c
:Tabedit file1.py file2.py _*.py
:Tabedit /etc/hosts file{1,2}.sh

Nah, dan sebagainya ...

Saya menempatkan ini dalam sedikit globedit.vim plugin, yang juga berisi perintah untuk :Edit, :Split, dll

Martin Tournoij
sumber
2
Fungsi dan perintah hebat! Beberapa peningkatan: (1) Gunakan [<f-args>]sebagai ganti "<args>"- dengan cara itu, patternparameter akan menjadi Daftar (array) dan Anda tidak perlu berurusan dengan membelah string secara manual. (2) Lulus bukan-nol sebagai argumen ketiga glob()agar ia mengembalikan Daftar. Maka Anda dapat menghindari membelah secara manual di sana juga. Anda harus lulus 0sebagai argumen kedua untuk melewati itu tanpa mempengaruhi perilaku: glob(l:p, 0, 1).
tommcdo
7

Sejauh yang saya tahu, satu-satunya cara untuk melakukan ini adalah:

:args *.vim
:tab all

Pertama, :argsakan mengganti daftar argumen. Daftar argumen mencantumkan file yang dibuka dengan Vim; sehingga vim file1 file2berarti bahwa daftar argumen mengandung file1dan file2.
Kami dapat memodifikasi ini saat runtime, dan Vim akan membuka buffer untuk setiap entri baru dalam daftar argumen.
Lihat :help argument-listuntuk informasi lebih lanjut.

The :allperintah membuka jendela untuk setiap entri dalam daftar argumen, :tabperintah mengeksekusi perintah, dan membuka tab baru ketika perintah diberikan akan membuka jendela baru.

Peringatan

Ada beberapa peringatan untuk metode ini.

Pertama-tama, tidak ada pemeriksaan untuk duplikat, sehingga Anda dapat berakhir dengan 2 tab atau lebih untuk buffer yang sama.

Tetapi masalah terbesar adalah bahwa ia mengganti semua tab Anda dengan apa yang ada dalam daftar argumen; jadi Anda kehilangan semua tab yang ada.
Anda dapat sedikit menghindari ini dengan menggunakan :argadd *.vimuntuk menambah daftar argumen, alih-alih menggantinya; tapi perintah seperti :editatau :tabedittidak tidak mengubah daftar argumen, dan Anda akan kehilangan tab tersebut kecuali jika Anda menambahkan mereka ke daftar argumen (Anda masih memiliki mereka dalam daftar penyangga, meskipun). Anda mungkin juga tidak ingin membuka semua yang ada di daftar argumen Anda di sebuah tab, mungkin Anda hanya ingin membuka 2 file sebagai tab tambahan.

Anda mungkin bisa membuat ini sedikit lebih baik dengan pertama-tama menambahkan semua tab yang saat ini terbuka ke daftar argumen (yang saya tidak dapat benar-benar bekerja), tetapi ini masih jauh dari sempurna. Jika tab memiliki 2 atau lebih windows, ia masih akan memodifikasinya ...

Martin Tournoij
sumber
Saya mungkin salah, tetapi bukankah ini membuka tab tambahan (seperti yang terlihat dalam pertanyaan saya tentang membuka tab secara default)?
muru
1
Jika Anda merujuk pada jawaban saya pada pertanyaan itu, perbedaannya ada yang saya gunakan :argdo tabedit %, yang membuka tab baru untuk setiap argumen. Dimulai dengan satu tab dan membuka n yang baru secara alami akan meninggalkan Anda dengan n +1 tab. :tab alladalah solusi yang jauh lebih baik.
tommcdo
@ komando saya sedang berbicara tentang jawaban Josh Petrie . Anda tidak akan terjadi pada salah satu aliasnya, bukan? :)
muru
Haha, tidak. Saya pasti memikirkan pertanyaan yang berbeda!
tommcdo
2

Anda bisa menggunakan :nextperintah, misalnya:

:n file1 file2

atau:

:n *.txt
kenorb
sumber
Ini sepertinya sama dengan menggunakan :args *.vim? Setidaknya, berperilaku sama, dan :help next_fmendokumentasikannya sama ...
Martin Tournoij
Lebih pendek dan sederhana dan Anda tidak menyebutkannya. Perilaku itu sama, seperti yang Anda tanyakan dalam pertanyaan untuk itu.
kenorb
2

Dari baris perintah Anda dapat menggunakan:

vim file1 ... filen -p

Dan jika Anda lupa menggunakan -pmasih dapat Anda gunakan

:tab ball

Btw, jangan lupa bahwa variabel tabpagemax(nilai default 10) membatasi berapa banyak tab yang dapat Anda buka dengan cara ini.

dsueiro
sumber
0

Anda sebenarnya dapat membuka tab baru dan menyimpan tab saat ini tanpa menulis fungsi baru (lihat jawaban ini di Stack Overflow ):

:args file1 file2 | argdo tabe

Anda mungkin ingin membuka tab kosong baru ( :tabe) sebelum melakukannya, karena file pertama akan terbuka di tab saat ini. Juga, tab ekstra kosong akan dibiarkan terbuka (lihat :help argdountuk memahami mengapa).

Mihai Capotă
sumber
Anda juga perlu memperbaiki penyorotan sintaksis (untuk beberapa alasan), seperti yang dijelaskan dalam tautan dan tutup tab terakhir, sehingga perintah 'lengkap' adalah: :tabnew | args file1 file2 | argdo tabe | tabdo syntax onAnda perlu menekan Enter untuk menghapus prompt dan ketik :closeuntuk menghapus yang terakhir ( kosong) tab ... ini banyak sekali pengetikan, dan hanya layak jika Anda membuka banyak tab (untuk 2 atau 3 file, hanya menggunakan :tabedua kali akan lebih cepat).
Martin Tournoij