Apa cara termudah untuk mencari semua file yang berguna di dalam satu proyek?

28

Apa cara termudah untuk mencari regexp di seluruh konten semua file dalam proyek saat ini, melewatkan file yang tidak berguna?

File yang tidak berguna adalah hal-hal seperti file yang dikompilasi, perpustakaan yang diimpor, file versi kontrol, dll.

Saya sadar rgrep, tetapi hanya mencari segalanya. Apakah ada paket yang mencari 'secara cerdas' dan tahu tentang beberapa bahasa pemrograman yang berbeda, jadi saya tidak perlu mengkonfigurasinya untuk setiap proyek individu?

Malabarba
sumber
Komentar "itu hanya mencari segalanya" tentang Anda rgrepsedikit membingungkan, mengingat secara default tidak termasuk semua file yang cocok dengan kriteria "file tidak berguna" Anda.
phils

Jawaban:

32

Pencarian berbasis proyek dalam Emacs dapat dilakukan dengan menggunakan proyektil .

Hal ini memungkinkan untuk konfigurasi per proyek file abaikan (dalam <projectroot>\.projectilefile), atau tentukan subdirektori untuk memantau dan mengabaikan semua yang lainnya.

Itu dapat berjalan grep, ack(membutuhkan ack-and-a-half.el) dan ag( ag.el) pada file dalam proyek yang ditentukan (baik berdasarkan pada .projectilefile atau dengan menemukan file VC yang didukung untuk menentukan root proyek).

Perintah yang Berguna

(Sehubungan dengan mencari melalui file yang bermanfaat)

Sesuai Proyektil Readme

  • C-c p s g :: Jalankan greppada file dalam proyek.
  • C-c p s a :: Berjalan ackpada proyek. Membutuhkan kehadiran ack-dan-setengah.
  • C-c p s s :: Berjalan agpada proyek. Membutuhkan kehadiran ag.el.
  • C-c p f :: Menampilkan daftar semua file dalam proyek.
  • C-c p d :: Menampilkan daftar semua direktori dalam proyek.
  • C-c p a :: Beralih di antara file dengan nama yang sama tetapi ekstensi berbeda dalam proyek.
  • C-c p o:: Berjalan multi-occurdi semua buffer proyek saat ini terbuka.

Ini hanya akan bertindak pada file yang didefinisikan sebagai bagian dari proyek (atau ditemukan ketika cache dihasilkan / dibuat ulang).

Jonathan Leech-Pepin
sumber
Terima kasih, apa perintah proyektil yang dapat saya gunakan untuk ini?
Malabarba
Diedit untuk memasukkan subset dari perintah (yang berhubungan dengan pencarian, find-file dan dired). Daftar lengkapnya ada dalam paket readme.
Jonathan Leech-Pepin
13

Pencarian seluruh proyek hanya file yang relevan dapat dilakukan menggunakan agalias the_silver_searcher .

Mengapa ag?

  • Mengabaikan pola file dari Anda .gitignore, .hgignore, svn:ignore. Anda dapat memilih pencarian Anda untuk TIDAK menggunakan daftar abaikan dari daftar abaikan kontrol versi dengan menggunakan -Usakelar.
  • Jika ada file di repo sumber Anda yang tidak ingin Anda cari, cukup tambahkan pola mereka ke .agignorefile.
    • .agignoreFile global dapat dimasukkan ke dalam Anda $HOMEdan kemudian Anda dapat menempatkan lebih banyak .agignorefile spesifik proyek di root proyek Anda.

Menyiapkan agdan emacs

  • Instal agalias the_silver_searcher di sistem Anda.
  • Siapkan .agignorefile. Saya lebih suka memiliki .agignorefile global di blog saya $HOME.
  • Instal agpaket (tersedia di Melpa).
  • Anda kemudian dapat menggunakan fungsi ag-projectatau ag-project-regexp(yang datang dengan agpaket) untuk melakukan pencarian file di seluruh proyek.
    • Secara default, fungsi-fungsi ini menggunakan akar repo VCS sebagai direktori untuk mencari. Anda dapat menimpanya dengan mengatur atau menyesuaikan ag-project-root-function.
    • Bahkan jika proyek Anda tidak dikontrol git, Anda dapat menandai root proyek untuk pencarian ag-project/ ag-project-regexpberbasis dengan meletakkan .gitfolder kosong di root proyek Anda. Maka Anda tidak perlu menyesuaikan ag-project-root-function.
Kaushal Modi
sumber
4

Jika proyek Anda menggunakan Git, Anda hanya perlu counsel https://github.com/abo-abo/swiper

  • counsel-git untuk mencari file

  • counsel-git-grep untuk grep

Satu-satunya ketergantungan adalah git

Grepping teks lebih cepat daripada pencari perak (ag)

Counsel juga menyediakan alat canggih lainnya. Misalnya, setelah berjalan counsel-git-grep, Anda dapat menekan C-c C-odan C-x C-qmasuk ke wgrep-modeuntuk dengan mudah mengganti teks dalam lingkup proyek.

Ada sebuah artikel https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/ menjelaskan rincian. Artikel itu menggunakan counsel-ag(perintah lain yang dibangun dalam nasihat) tetapi cousnel-git-grepmenggunakan alur kerja yang persis sama.

chen bin
sumber
Tapi bagaimana bisa text-grepping lebih cepat dari ag? Bisakah Anda jelaskan?
denis631
1
agjuga merupakan program grep, seperti git-grep. Saya tidak bisa mengatakan mana yang lebih cepat. Lihat github.com/BurntSushi/ripgrep yang membandingkan kinerja program grep yang populer (termasuk agdan git-grep)
chen bin
1

Jawaban pertama itu indah, tetapi meninggalkan beberapa detail penting tentang versi modern Emacs. Saya tahu Emacs sendiri, jadi pendatang baru mungkin tidak menyadari hal ini. Mengingat tujuan Anda adalah untuk mencari teks DALAM WAKTU file dalam PROYEK, maka Anda akan menginstal proyektil menggunakan repositori MELPA.

Ini menginstal paket di .emacs.d dan menambahkan beberapa konfigurasi dasar ke .emacs di direktori $ USER Anda (dengan asumsi Anda telah membuat file .emacs), seperti memerlukan Proyektil di instal Emacs Anda.

Namun, Anda masih perlu mengaktifkannya dan mengaitkan awalan keymap, sehingga Anda bisa memintanya di buffer mini.

Jawaban yang diterima menyebutkan perintah berikut:

C-c p s g

Ini tidak akan berfungsi, kecuali jika Anda mengkonfigurasi Proyektil dengan awalan keymap ini. Tapi saya mengkonfigurasinya untuk menggunakan Cc Cp sebagai perintah untuk Project di .emacs:

(projectile-mode +1)
(define-key projectile-mode-map (kbd "C-c C-p") 'projectile-command-map)

Sekarang, saya dapat melakukan pencarian teks dalam file dalam suatu proyek menggunakan grep:

C-c C-p f # switch to a project first
C-c C-p s g # perform grep search in project

Untuk memecahnya, C-c C-pakan memanggil Proyektil, dan s gakan melakukan pencarian grep. Anda akan mendapatkan hasil yang indah seperti ini, dengan anggapan pencarian Anda adalah visit_contactdan Anda mencari rspec Ruby dalam sebuah proyek:

./spec/support/capybara_classification_code_helper.rb:21:  def visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:8:    visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:33:    visit_contact
./spec/features/user_views_global_filters_from_line_item_spec.rb:9:      visit_contact
Donato
sumber