Satu hal yang sering saya lakukan (tetapi bergantung pada baris perintah untuk melakukannya) adalah mencari / menangkap beberapa file.
Apakah ada cara untuk menampilkan hasil pencarian untuk semua buffer terbuka?
Idealnya, saya ingin memiliki buffer split baru yang berisi lokasi hasil dan cuplikan seperti grep
halnya. Misalnya ( /statistics
):
models/statistics.php: /*! \file statistics.php
controllers/stats.php: $this->load->model('statistics');
controllers/stats.php: // Query statistics...
controllers/stats.php: $num_exams = $this->statistics->countExams();
Sebagai bonus, saya ingin dapat mencari istilah di bawah kursor, seperti gd
halnya.
search
multiple-files
Roflo
sumber
sumber
Jawaban:
Anda dapat menggunakan
:vimgrep /pattern/ {files}
untuk mengisi daftar perbaikan cepat dengan pola yang cocok. Masalahnya adalah bahwa:vimgrep
opsi file tidak memungkinkan buffer secara langsung. Kamu bisa memakai:Pilihan lain adalah menulis skrip yang menghasilkan daftar file dari
:buffers
. Per posting SO ini dengan sedikit tweek kita dapatkan:Anda sekarang dapat memanggil
:GrepBufs <expression>
dan mendapatkan:vimgrep
output standar tetapi menggunakan buffer sebagai gantinya.Perbarui Jika Anda ingin menelepon
GrepBuffers
menggunakan nilai di bawah kursor, tambahkan pemetaan baru ini.Ketika Anda berada dalam tipe mode normal
<leader>z
dan Anda akan:vimgrep
kata kursor di atas buffer terbuka.sumber
command! -bang -nargs=+ Bufgrep execute 'vimgrep<bang><args> ' . join(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '"#".v:val'), ' ')
. Penggunaan::Bufgrep/foo/
Pencarian di buffer yang dibuka itu bagus, tetapi mungkin ada saatnya Anda ingin mencari di seluruh proyek. Ini bisa lebih cepat dan lebih mudah dari yang Anda pikirkan!
Mencari di seluruh proyek
grep
adalah alat pencarian standar Unix. Layak disebutkan karena keberadaannya di mana-mana. Sudah terintegrasi ke Vim via:grep
perintah. mis:grep -r 'foo'
. Lihat:h :grep
.--perl
. Untuk integrasi Vim, lihat Ack.vimgit grep
mencari repositori dengan sangat cepat. Fugitive.vim menyediakan:Ggrep
.git grep
. Dapat digunakan dengan:grep
juga.Saya merekomendasikan ripgrep, Ag, dan
git grep
karena keduanya super cepat. Saya telah mencari lebih dari 4700+ dalam waktu kurang dari 1 detik. Cukup sulit untuk mengalahkan ripgrep.Untuk menguji salah satu dari alternatif ini tanpa plugin atau Anda hanya tidak ingin plugin, Anda dapat mengatur
'grepprg'
opsi Anda sesuai. misalnyaset grepprg=ag\ --vimgrep
atauset grepprg=rg\ --vimgrep
. Lihat:h 'grepprg'
dan:h 'grepformat'
untuk informasi lebih lanjut. Sekarang Anda dapat mencari via:grep
. mis:grep 'foo'
.Sebagai fallback akhir, Anda dapat menggunakannya
:vimgrep
karena tersedia di semua sistem yang Vim tersedia. Lihat:h :vimg
untuk bantuan lebih lanjut.Daftar QuickFix
Karena sebagian besar opsi ini menggunakan daftar perbaikan cepat, saya sarankan Anda menggunakan beberapa pemetaan yang lebih ramah untuk melintangkan daftar perbaikan cepat. Saya menggunakan plugin Tim Pope yang tidak rusak yang menggunakan
]q
dan[q
untuk masing:cnext
-:cprev
masing. Beberapa orang seperti quickfix untuk membuka setelah pencarian dilakukan kemudian tambahkan berikut ini untuk Anda~/.vimrc
berkas:autocmd QuickFixCmdPost *grep* cwindow
. Anda juga dapat secara manual membuka daftar QuickFix via:copen
.Ingin "pencarian" lebih cepat?
Anda akan perlu menggunakan beberapa alat yang menggunakan indeks prebuilt seperti ctags , cscope , atau GNU global .
:tag
,<c-]>
dan banyak perintah dan opsi. Lihat:h tags
. Juga mungkin ingin membaca Ctag yang mudah dengan Git atau melihat ke dalam plugin Gutentags:cscope
perintah. Lihat:h cscope
Lebih banyak bantuan
Saya akan mulai dengan episode Vimcast yang bagus ini : Cari beberapa file dengan
:vimgrep
.Untuk bantuan Vim lebih lanjut, lihat dokumentasi:
sumber
Plugin GrepCommands saya mendefinisikan varian perintah built-in
:vimgrep
yang menargetkan semua argumen, buffer yang terdaftar, jendela di halaman tab saat ini atau semua halaman tab untuk pencariannya. Pada dasarnya, implementasi plugin yang kuat dari jawaban @ jecxjo.sumber
Perintah
:bufdo
dan:vimgrepadd
Jawaban ini didasarkan pada /programming//a/11976158/1057593 .
Namun, saya ingin menambahkan beberapa bit. Sekali lagi perintah dasarnya adalah
Jika daftar perbaikan cepat Anda tidak kosong, Anda mungkin ingin menghapusnya terlebih dahulu (lihat /programming//q/27385970/1057593 ). Ini bisa dilakukan dengan
vim-unimpaired menyediakan pemetaan
]q
dan[q
untuk menelusuri pertandingan.cmdline-history
Ini adalah alur kerja yang baik untuk memasukkan pola pencarian secara terpisah
/pattern
. Ini memungkinkan Anda untuk menggunakan perintah generik dari riwayat baris perintah Anda menggunakan pola pencarian saat ini. Ini akan terlihat sepertiSebuah pencarian lebar buffer yang khas akan
Saya telah menambahkan pemetaan berikut ke vimrc saya untuk digunakan
<C-N>
dan<C-P>
bukan tombol panahUntuk mencari riwayat perintah gunakan
q:
, lalu/bufdo<CR>
dan panggil perintah dengan<CR>
. Untuk detail lebih lanjut, lihat https://vim.fandom.com/wiki/Using_command-line_history dan halaman bantuan:h history
dan:h cmdline-window
.Anda dapat menambahkan ke perintah yang dapat digunakan kembali
:copen
untuk segera melihat daftar perbaikan cepat dengan cara berikut:Proposal dari stackoverflow
:bufdo vimgrepadd // % | copen
membuka beberapa jendela yang tidak diinginkan dalam kasus saya.sumber