Bagaimana cara membuka banyak file yang cocok dengan ekspresi wildcard?

10

Saya ingin mengedit beberapa file yang cocok dengan ekspresi glob. Sebagai contoh, untuk mengedit semua file git config di direktori anak, saya dapat melakukan ini di shell:

vim */.git/config

Pada :baris perintah Vim , saya berharap :find */.git/configuntuk melakukan sesuatu yang serupa (yaitu, buka semua file yang cocok dengan ekspresi glob), tetapi malah mengeluh E77: Too many file names.

Apakah ada perintah Vim atau satu-liner untuk membuka beberapa file yang cocok dengan wildcard / glob expression (yang tidak melibatkan penulisan fungsi)?

Justin M. Keyes
sumber

Jawaban:

8

Anda bisa menggunakannya :args {glob}. Di glob Anda, **akan melintasi direktori secara rekursif.

Ini akan mengisi daftar argumen, yang merupakan daftar yang sama yang terisi ketika Anda memulai Vim dengan satu atau lebih nama file sebagai argumen.

Setelah daftar argumen Anda diisi, Anda dapat menavigasi menggunakan :nextdan :previous. Anda juga dapat melompat ke item pertama dan terakhir dengan perintah :firstdan :last.

tommcdo
sumber
1
Bagus :) :args */.git/configsebenarnya mengisi daftar buffer juga, jadi :bnextberfungsi juga. Apakah itu terlihat aneh? (Vim 7.4.52, dan Neovim)
Justin M. Keyes
1
Juga pengingat kepada orang lain, ]asiklus :argsdaftar jika github.com/tpope/vim-unimpaired diinstal.
Justin M. Keyes
Juga :argadd file*bisa dilakukan.
kenorb
Untuk menggunakan pola glob ( **), Anda harus globstarmenyetel, lihat: Mencocokkan semua file di bawah semua direktori bersarang dengan globbing shell .
kenorb
@ JustinM.Keyes Daftar buffer adalah superset dari daftar args, jadi itu yang diharapkan.
jamessan
3

Untuk membuka file yang cocok di tab terpisah ...

:n */.git/config | tab all

Penjelasan: :n ( :next) mengatur daftar file-berikutnya untuk semua kecocokan. tab allmembuka semua file dalam daftar file selanjutnya di tab baru.

… atau …

for f in glob("*.py", 0, 1) | exe "tabe" f | endfor

Penjelasan: Dalam glob(…), 0 berarti untuk memasukkan semua file yang cocok, bahkan jika mereka akan diabaikan karena pengaturan suffixesatau wildignorecase. 1 berarti mengembalikan daftar, bukan string. exe "tabe" fadalah bentuk singkat execute "tabedit" fdan sarana untuk membuka file yang ditentukan oleh variabel fdi tab baru.

Alex Quinn
sumber
1
Sepertinya :n */.git/config | bufferbekerja.
Mateen Ulhaq
2

Pada baris perintah Vim:, saya berharap :find */.git/configuntuk melakukan sesuatu yang serupa (yaitu, buka semua file yang cocok dengan ekspresi glob), tetapi malah mengeluh E77: Too many file names.

Jangan mengharapkan apa pun sebelum membaca dokumentasi.

Selain jawaban Tom, Anda dapat langsung menggunakan :nextsebagai alternatif :args.

romainl
sumber
0

Membuka file dengan vim */.git/configpasti harus berhasil. Jika tidak, Anda harus meningkatkan Vim ke 7.4 (versi sebelumnya lebih bermasalah).

Atau coba salah satu dari yang berikut (di dalam editor):

:n `find .git/ -name config`
:args `find . -name config`
kenorb
sumber
Anda tidak membaca pertanyaan saya dengan cermat. Dan, jawaban yang diterima sudah menyebutkan :args.
Justin M. Keyes
@ JustinM.Keyes Terima kasih atas poin Anda. Wildcard seharusnya berfungsi secara default dan ini adalah satu-satunya jawaban yang mengatakan bahwa itu harus bekerja di 7.4 (karena saya memiliki kesalahan yang sama persis sebelum upgrade). Menggunakan argshanyalah solusinya, tetapi lebih jauh lagi itu menunjukkan Anda bagaimana menggunakan ekspansi shell dalam vim sendiri jika pengguna lebih lanjut ingin menggunakannya untuk solusi yang lebih kompleks, dengan menggunakan find, seperti ini . Jadi saya pikir itu memberikan beberapa nilai tambahan untuk pertanyaan Anda. Jadi saya harap tidak apa-apa dengan Anda.
kenorb
Saya tidak pernah memiliki masalah dengan vim */foo, dan tidak ada cara yang dapat dikaitkan dengan versi Vim, karena itu fitur shell .
Justin M. Keyes
0

Jelas, tetapi tidak tercantum di atas - contoh menemukan semua file sql memiliki string create_table dalam namanya

:args **/*create_table*sql

dan memeriksanya

:ls

dan buka yang pertama

:b 1
Yordan Georgiev
sumber