단일 프로젝트 내에서 모든 유용한 파일을 검색하는 가장 쉬운 방법은 무엇입니까?


28

현재 프로젝트의 모든 파일에서 내용 전체에서 정규 표현식을 검색하는 가장 쉬운 방법은 무엇입니까?

쓸모없는 파일은 컴파일 된 파일, 가져온 라이브러리, 버전 제어 파일 등입니다.

나는 알고 rgrep있지만 모든 것을 검색합니다. '지능적으로'검색하고 여러 가지 다른 프로그래밍 언어에 대해 알고있는 패키지가 있습니까? 따라서 각 프로젝트마다 구성 할 필요가 없습니까?


rgrep기본적으로 "쓸모없는 파일"기준과 일치하는 모든 파일을 제외한다는 점에서 "모든 것을 검색합니다"라는 설명은 약간 혼란 스럽습니다.
phils

답변:


32

Emacs 내 프로젝트 기반 검색은 projectile을 사용하여 수행 할 수 있습니다 .

무시 파일 ( <projectroot>\.projectile파일) 의 프로젝트 별 구성을 허용 하거나 서브 디렉토리를 지정하여 다른 모든 파일을 모니터하고 무시할 수 있습니다.

정의 된 프로젝트 내의 파일에서 grep, ack(필수 ack-and-a-half.el) 및 ag( ag.el)를 실행할 수 있습니다 ( 파일을 기반으로 .projectile하거나 프로젝트 루트를 정의하기 위해 지원되는 VC 파일을 찾음).

유용한 명령

(유용한 파일을 통한 검색과 관련하여)

발사체 추가 정보

  • C-c p s g :: grep프로젝트의 파일에서 실행하십시오 .
  • C-c p s a :: ack프로젝트에서 실행 됩니다. ack-and-a 절반의 존재가 필요합니다.
  • C-c p s s :: ag프로젝트에서 실행 됩니다. ag.el이 있어야합니다.
  • C-c p f :: 프로젝트의 모든 파일 목록을 표시합니다.
  • C-c p d :: 프로젝트의 모든 디렉토리 목록을 표시합니다.
  • C-c p a :: 프로젝트에서 이름은 같지만 확장자가 다른 파일간에 전환합니다.
  • C-c p o:: multi-occur현재 열려있는 모든 프로젝트 버퍼에서 실행 됩니다.

이들은 프로젝트의 일부로 정의 된 (또는 캐시가 생성 / 재생 될 때 발견 된) 파일에서만 작동합니다.


고마워, 이것에 사용할 수있는 발사체 명령은 무엇입니까?
Malabarba

명령의 서브 세트를 포함하도록 편집했습니다 (검색, 파일 찾기 및 삭제 처리). 전체 목록은 패키지 읽어보기에 있습니다.
Jonathan Leech-Pepin

13

관련 파일 만 프로젝트 전체에서 검색 할 수 있습니다 ( ag일명 the_silver_searcher) .

왜 그래?

  • 그것은 당신의에서 파일 패턴을 무시 .gitignore, .hgignore, svn:ignore. 스위치 를 사용하여 버전 제어 무시 목록에서 무시 목록을 사용하지 않도록 검색을 선택할 수 있습니다 -U.
  • 소스 리포지토리에 파일이있는 경우 검색하지 않으려면 해당 패턴을 .agignore파일에 추가 하십시오.
    • 전역 .agignore파일을 넣을 수 있으며 프로젝트 루트에 $HOME더 많은 프로젝트 특정 .agignore파일을 넣을 수 있습니다 .

설정 ag및 이맥스

  • ag일명 the_silver_searcher 를 시스템에 설치 하십시오.
  • .agignore파일을 설정 하십시오. 전역 .agignore파일을 선호합니다 $HOME.
  • ag패키지를 설치하십시오 (Melpa에서 사용 가능).
  • 그런 다음 패키지 와 함께 제공 되는 ag-project또는 ag-project-regexp기능 을 사용하여 ag프로젝트 전체 파일 검색을 수행 할 수 있습니다.
    • 기본적으로이 함수는 VCS 저장소의 루트를 검색 할 디렉토리로 사용합니다 ag-project-root-function.를 설정하거나 사용자 정의하여이를 무시할 수 있습니다 .
    • 프로젝트가 자식 제어되지 않더라도 프로젝트 루트에 빈 폴더를 넣어 ag-project/ ag-project-regexp기반 검색에 대한 프로젝트 루트를 표시 할 수 있습니다 .git. 그런 다음을 사용자 정의 할 필요가 없습니다 ag-project-root-function.

4

프로젝트에서 Git을 사용하는 경우 https://github.com/abo-abo/swiper 만 있으면 counsel 됩니다.

  • counsel-git 파일을 찾기 위해

  • counsel-git-grep 잡다

유일한 의존성은 git입니다

텍스트 검색이 은색 검색기보다 빠릅니다 (ag)

변호인은 다른 강력한 도구도 제공합니다. 예를 들어을 실행 한 counsel-git-grepC-c C-oC-x C-q을 눌러 wgrep-mode프로젝트 범위의 텍스트를 쉽게 바꿀 수 있습니다.

자세한 내용을 설명 하는 기사 https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/ 가 있습니다 . 이 기사에서는 counsel-ag(고문에 내장 된 다른 명령)을 cousnel-git-grep사용 하지만 정확히 동일한 작업 흐름을 사용합니다.


그러나 텍스트 그 리핑은 어떻게 ag보다 빠릅니까? 좀 더 자세히 설명해 주시겠습니까?
denis631

1
ag또한 grep 프로그램 git-grep입니다. 나는 어느 것이 더 빠르다고 말할 수 없다. 인기있는 grep 프로그램 ( 및 포함 )aggit-grep
chen bin

1

첫 번째 대답은 아름답지만 현대 버전의 Emacs에 대한 중요한 세부 정보는 생략합니다. 나는 이맥스에 대해 잘 알고 있기 때문에 다른 새로운 이민자들은 이것을 알지 못할 수도 있습니다. PROJECT에서 파일 내에서 텍스트를 검색하는 것이 목표라면 먼저 MELPA 리포지토리를 사용하여 Projectile을 설치합니다.

이 패키지는 .emacs.d에 패키지를 설치하고 Emacs 설치에서 Projectile을 요구하는 것과 같이 $ USER 디렉토리의 .emacs에 .emacs에 몇 가지 기본 구성을 추가합니다.

그러나 여전히이를 활성화하고 키맵 접두사를 연관시켜야하므로 미니 버퍼에서이를 호출 할 수 있습니다.

허용 된 답변은 다음 명령을 언급합니다.

C-c p s g

이 키맵 접두어로 Projectile을 구성하지 않으면 작동하지 않습니다. 그러나 Cc Cp를 .emacs의 Project 명령으로 사용하도록 구성했습니다.

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

이제 이것을 주면 grep을 사용하여 프로젝트의 파일에서 텍스트 검색을 수행 할 수 있습니다.

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

이를 분해하려면 C-c C-pProjectile을 호출 s g하고 grep 검색을 수행합니다. 검색이 visit_contact있고 프로젝트에서 Ruby의 rspec을 검색한다고 가정하면 다음과 같이 아름다운 결과를 얻을 수 있습니다.

./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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.