Tüm faydalı dosyaları tek bir projede aramanın en kolay yolu nedir?


28

Geçerli projedeki tüm dosyaları içeriğinde bir regexp aramanın ve yararlı olmayan dosyaları atlamanın en kolay yolu nedir?

İşe yaramaz dosyalar derlenmiş dosyalar, içe aktarılan kütüphaneler, sürüm kontrol dosyaları vb.

Farkındayım rgrep, ama sadece her şeyi arar. 'Akıllıca' arama yapan ve birkaç farklı programlama dilini bilen bir paket var mı, bu yüzden her proje için yapılandırmam gerekmeyecek mi?


"Sadece her şeyi arar" yorumunuz rgrep, varsayılan olarak "işe yaramaz dosyalar" ölçütlerinizle eşleşen tüm dosyaları hariç tuttuğu için, biraz kafa karıştırıcıdır.
phils

Yanıtlar:


32

Emacs içerisinde proje bazlı arama, mermi kullanılarak yapılabilir .

Yok sayılan dosyaların proje başına yapılandırılmasını (bir <projectroot>\.projectiledosyada) veya diğerlerini izlemek ve yok saymak için alt dizinler belirlemenizi sağlar.

Bu çalıştırabilir grep, ack(gerektirir ack-and-a-half.el) ve ag( ag.el) tanımlı proje içinde dosyalarda (ya dayalı .projectiledosyası veya proje kök tanımlamak için desteklenen bir VC dosyasını bularak).

Faydalı Komutlar

(Kullanışlı dosyalar arasında arama yapmak için)

Mermi başına Benioku

  • C-c p s g :: grepProjedeki dosyaları çalıştır .
  • C-c p s a :: ackProjede çalışır . Ack ve bir buçuk varlığı gerektirir.
  • C-c p s s :: agProjede çalışır . Ag.el'in varlığını gerektirir.
  • C-c p f :: Projedeki tüm dosyaların bir listesini göster.
  • C-c p d :: Projedeki tüm dizinlerin listesini görüntüle.
  • C-c p a :: Projede aynı isimde fakat farklı uzantıya sahip dosyalar arasında geçiş yap.
  • C-c p o:: multi-occurAçık olan tüm proje tampon belleklerinde çalışır .

Bunlar sadece projenin bir parçası olarak tanımlanan (veya önbellek oluşturulduğunda / yenilendiğinde bulunur) dosyalara etki eder.


Teşekkürler, bunun için kullanabileceğim mermi komutu nedir?
Malabarba

Komutların bir alt kümesini (arama, dosya bulma ve yönlendirmeyle ilgili olanlar) içerecek şekilde düzenlenmiştir. Tam liste, benioku paketinde.
Jonathan Leech-Pepin

13

Sadece ilgili dosyaların proje genelinde aranması agaka the_silver_searcher kullanılarak yapılabilir .

Neden ag?

  • , . .gitignore, Dosya dosyalarınızı yok sayar . Anahtarlarınızı kullanarak aramalarınız için sürüm denetimi yoksayma listelerindeki yoksayma listesini KULLANMAMANIZI seçebilirsiniz ..hgignoresvn:ignore-U
  • Kaynak deponuzda arama yapmak istemediğiniz dosyalar varsa, desenlerini bir .agignoredosyaya eklemeniz yeterlidir .
    • Genel bir .agignoredosya içine koyulabilir $HOMEve daha sonra .agignoreproje köklerinize projeye özgü dosyalar koyabilirsiniz .

Kurulum agve emacs

  • Sisteminize agaka the_silver_searcher yükleyin .
  • .agignoreDosyayı ayarlayın . İçimde sadece global bir .agignoredosya olmasını tercih ederim $HOME.
  • agPaketi kurun (Melpa'da mevcuttur).
  • Daha sonra proje çapında dosya aramaları yapmak için ag-projectveya paketini ag-project-regexp( agpaketle birlikte verilir) kullanabilirsiniz.
    • Varsayılan olarak, bu işlevler VCS deposunun kökünü aranacak dizin olarak kullanır. Bunu ayarlayarak veya özelleştirerek geçersiz kılabilirsiniz ag-project-root-function.
    • Projeniz git kontrol altında olmasa bile, proje kökünüze boş bir klasör koyarak ag-project/ ag-project-regexptabanlı aramalar .gitiçin bir proje kökünü işaretleyebilirsiniz. Daha sonra kişiselleştirmek zorunda değilsiniz ag-project-root-function.

4

Projeniz Git kullanıyorsa, sadece https://github.com/abo-abo/swiper adresine ihtiyacınız var.counsel

  • counsel-git dosyayı bulmak

  • counsel-git-grep grep etmek

Tek bağımlılık git

Metin grepping gümüş arayıcı (ag) daha hızlı

Danışman ayrıca diğer güçlü araçlar sunar. Örneğin, çalıştırdıktan sonra , proje kapsamındaki metni kolayca değiştirmek için girmek için ve counsel-git-greptuşlarına basabilirsiniz .C-c C-oC-x C-qwgrep-mode

Detayları anlatan bir makale var https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/ . Bu makale kullanır counsel-ag(avukatın içine yerleştirilmiş başka bir komut) ancak cousnel-git-greptamamen aynı iş akışını kullanır.


Fakat metin grepping nasıl ag'dan daha hızlı oluyor? Lütfen detaylandırır mısın?
denis631

1
aggibi bir grep programıdır git-grep. Hangisinin daha hızlı olduğunu söyleyemem. Popüler grep programlarının performansını ( ve dahil ) karşılaştıran github.com/BurntSushi/ripgrep'e bakınaggit-grep
chen bin

1

İlk cevap çok güzel fakat Emacs'in modern versiyonları hakkında bazı eleştirel detaylar bırakıyor. Kendimi Emacs'la tanıyordum, bu yüzden yeni başlayanlar bunun farkında olmayabilir. Amacınız bir PROJE içindeki bir dosyadaki metni aramak olduğu için, önce MELPA deposunu kullanarak Projectile'i yükleyeceksiniz.

Bu, paketi .emacs.d içine yükler ve $ USER dizininizdeki (.emac dosyasını oluşturmuş olduğunuz varsayılarak) .emacs'a bazı temel yapılandırmalar ekler (Emacs yüklemenizde Projectile isteme gibi).

Ancak yine de etkinleştirmeniz ve keymap öneklerini ilişkilendirmeniz gerekir, böylece mini arabelleğe davet edebilirsiniz.

Kabul edilen cevap aşağıdaki komutu belirtir:

C-c p s g

Bu keymap önekiyle Projectile yapılandırmadıysanız, bu işe yaramaz. Ancak Cc Cp'yi .emacs içindeki Project komutu olarak kullanacak şekilde yapılandırdım:

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

Şimdi bu verildiğinde, grep kullanarak bir projedeki dosyalarda metin aramaları yapabiliyorum:

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

Onu yıkmak için C-c C-pmermi çağıracağı ve s ggrep araması gerçekleştirir. Aramanızın visit_contactve bir projede Ruby'nin rspec'ini aradığınızı varsayarak, bunun gibi güzel bir çıktı alacaksınız :

./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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.