grep / ack / ag 출력 모드에서 query-replace를 사용하는 방법이 있습니까?


31

나는 알고 있어요 find-grep-dired해당 파일을 표시 한 다음 Enter 키를 눌러, Q실행 dired-do-query-replace-regexp표시된 파일에. 불행히도 grep을 다시 시작해야하고 더 이상 git-grep, ack 또는 ag를 사용하지 않고 find-grep검색을위한 다른 구문을 가진 사용으로 전환해야합니다 .

나는 또한 알고 있어요 multi-occur하고 occur-edit-mode있지만,이 발생할 사용하여 검색을 다시 시작해야합니다. 마지막으로 ag-dired파일 내용이 아닌 파일 이름과 일치하는 것으로 보입니다.

현재 접근 방식은 grep 출력을 생성 한 다음 grep 버퍼에서 시작하여 각 일치 항목을 방문하여 변경하는 매크로를 실행하는 것입니다. query-replace찾은 일치 항목을 직접 사용하는 것이 좋습니다 .

내가하고 싶은 것은 적절한 파일을 표시하고 query-regexp를 호출 할 수 있도록 기존 grep 출력에서 ​​dired 버퍼를 신속하게 작성하거나 grep 출력을 버퍼 목록으로 변환 multi-occur하여 사용할 수 있도록 occur-edit-mode하는 것입니다. 그 자리에서 편집하고 query-replace해당 버퍼에서 실행하십시오 .

이 기능이 존재합니까, 아니면이 문제를 해결하는 다른 워크 플로우가 있습니까?

답변:


28

@Malabarba는 wgrepgrep / ack / ag 결과 편집을위한 패키지 사용을 언급했습니다 .

ag패키지와 wgrep-ag패키지를 사용하여 multiple-cursors패키지 를 사용하여 '응답 된 결과'를 편집 하는 방법에 대한 자세한 연습을 작성하고 싶습니다 .

이 패키지는 Melpa를 통해 제공됩니다. 또한 시스템에 ag일명 the_silver_searcher가 설치되어 있어야합니다.

이 연습은 찾은 모든 / 선택된 위치에서 한 줄 편집을 수행하려는 방법에 적용됩니다 ag.

  • ag시스템과 위에 언급 된 emacs 패키지에 설치 하십시오.

  • ag지정된 정규식과 일치하는 내용을 가진 파일 검색을 지원합니다. ag프로젝트 루트 위치 를 알려주는 가장 간단한 방법 은 빈 .git폴더를 저장하는 것입니다. 그런 다음을 사용하여 검색하십시오 M-x ag-project-regexp.

  • ag 검색의 결과 버퍼는 기본적으로 편집 할 수 없습니다. 편집 가능하게하려면 -default binding을 M-x wgrep-change-to-wgrep-mode사용하거나 사용하십시오 .wgrepC-c C-p

  • 이제 모든 파일에서 'abcdef'를 'ghijkl'로 변경해야하는 경우 'abcdef'를 검색하면 ag 결과 버퍼에 해당 문자열이 포함 된 모든 행이 표시됩니다. 그런 다음 해당 버퍼를 편집 가능하게 만들고 해당 문자열을 수동으로 변경하면 이러한 변경 사항은 M-x wgrep-finish-edit기본 바인딩 수행 또는 사용시 실제 파일 버퍼에 반영됩니다 C-c C-e. query-replace-regexp해당 검색 바꾸기를 수행하는 데 사용할 수도 있습니다 .

  • multiple-cursors여러 번의 편집 작업이 동시에 진행되는 위치에 대한 실시간 피드백을 볼 수 있도록 빠른 리팩토링을 사용 하는 것이 좋습니다. 해당 ag 결과 버퍼에서 바꾸려는 문자열을 강조 표시하고 M-x mc/mark-all-like-this동시에 여러 지점에서 편집되는 내용을 보면서 경외감을 편집하십시오.

  • 위에서 언급했듯이 편집 C-c C-e내용에 만족하면 실제 버퍼의 변경 사항을 "반영"합니다. 버퍼가 아직 저장되지 않았습니다.

  • 모든 버퍼를 저장하기 위해 보통 emacs 기본 C-x s !바인딩을 사용하여 한 번에 처리 합니다.

다음은 스크린 샷과 함께 사용 사례의 예입니다.

그것은 모든 인스턴스를 교체하는 과정을 보여줍니다 bind-to-modi-mapbind-to-my-map내에서가 ~/.emacs.d/.

bind-to-modi-mapemacs 설정 폴더에서 검색 하면 아래의 'ag'ged 결과가 나타납니다.수정되지 않은 결과

이 버퍼는 읽기 전용입니다.

후에 M-x wgrep-change-to-wgrep-mode내가 강조,, -modi-map, 사용하여 해당 선택의 모든 인스턴스를 선택 M-x mc/mark-all-like-this하고 그 선택을 편집 한 후를 -my-map, 그것은 다음과 같이 보입니다 : 다중 커서를 사용하여 수정 한 결과

파란색 강조 표시는을 누를 때 수정 될 행을 나타냅니다 C-c C-e.

타격에 C-c C-e,이 스크린 샷에있는 실제 파일에 반영 변화를 볼 수 있습니다 편집을 마친 후 결과

그런 다음를 사용하여 수정 된 모든 파일을 저장합니다 C-x s !.


이것은 실제로 문자열 바꾸기를 수행하는 가장 좋은 방법입니다. ag-exclude를 염두에두고 배치를 수행하기 쉬운 프로젝트에 포함되어 있지만 여전히 올바른 것을 교체하고 있는지 확인할 수 있습니다.
PascalVKooten

13

내가하고 싶은 것은 기존 grep 출력 [...]에서 dired 버퍼를 빠르게 빌드하거나 grep 출력을 다중 발생 [...]에 대한 버퍼 목록으로 변환하는 것입니다.

grep 결과 버퍼를 어떤 것으로 변환 할 필요가 없습니다. grep 출력을 편집하기위한 모드가 이미 있습니다 (물론 파일의 변경 사항도 반영).

  1. Melpa 에서 wgrep 패키지를 설치하십시오 .
  2. (require 'wgrep) init 파일에.
  3. 그렙 검색을 한 후에는 적중 C-c C-p하고 편집하십시오!
  4. 로 수정 사항 저장 C-c C-e

ack 및 ag에서도 작동합니다.


2
그것이 내가하는 일입니다 (ag.el 사용). magnars 멀티 커서 편집과 함께 간단한 리팩토링은 정말 쉽습니다.
Tom Regner

4

이 기능은 발사체 ( projectile-replace) 안에 있습니다 . 가능한 경우 (그 순서대로) ag / ack / git grep / grep를 사용하여 발생을 찾고 tags-query-replacequery-replace를 실행합니다.


find-grep-dired와 동일한 문제가 발생합니다. 기존 grep 출력을 사용하지 않습니다. 발사체-다중 발생과 비슷한 문제가 있습니다. 일치하는 목록을보고 쿼리 교체를 시작하고 기본 검색 방법을 변경하지 않는 것이 좋습니다. 그래도 대체 워크 플로입니다.
20:53에

설명하는 내용은 매우 빠른 매크로를 만들어 텍스트를 대체하고 반복해서 호출하여 M-g n C-x e(즉, next-error발생을 스크롤 하는 데 사용) 쉽게 수행 할 수 있습니다 .
shosti

1

차가워 요를 사용하는 또 다른 접근법이 있습니다.

Emacs *grep*출력 버퍼에서 Cc`(Cc backquote)를 누르십시오. 이것은 고드름 모드에서 buffer *grep*to command 바인딩됩니다 icicle-compilation-search. 이를 통해 선택한 검색 히트 ( grep적중)를 원하는 순서대로 빠르게 탐색 할 수 있습니다 .

미니 버퍼에 입력 한 입력은 일련의 검색 적중을 동적으로 필터링 (좁히기)하고 점진적 완료 를 사용 하여 여러 패턴 (예 : 하위 문자열, 정규 표현식)을 연속적으로 일치시켜 범위를 좁힐 수 있습니다 .

검색 조회를 탐색 할 때 필요에 따라 전체 조회 (라인) 또는 현재 미니 버퍼 입력과 일치하는 부분을 대체 할 수 있습니다.

차가워 요 검색-컴파일 또는 Grep를 참조하십시오 . 차가워 요 검색 소개 가 여기 에 있으며, 차가워 요 검색 중 일치를 교체하는 방법에 대한 정보 는 여기에 있습니다 .


0

xah_find.el을 쓴이 유틸리티를 사용합니다.

내가 쓴 이유는 다음과 같습니다.

  • 순수 제거. Windows에서 grep이나 emacs에서 운영 체제로의 유니 코드 전송에 대해 더 이상 걱정하지 않아도됩니다. 이맥스 grep 문제
  • 유니 코드 사용자가 많은 경우 유닉스 도구에는 몇 가지 세미 버그가 있습니다. 리눅스 유니크 문제
  • 매주 5k 파일을 찾거나 교체합니다. 나는 몇 년 동안 dired-do-query-replace-regexp를 사용하고있었습니다. 대화 형 특성이 실제로 시간을 허비했지만 변경 결과를 확인해야합니다. 따라서 내 솔루션은 이제 일괄 처리로 실행되지만 파일에 쓰기 옵션을 사용하여 모든 찾기 / 바꾸기 결과에서 스캔 할 수 있다는 멋진 보고서가 있습니다.

이 elisp 유틸리티는 아마도 emacs에서 유닉스 grep을 호출하는 것보다 5-10 배 느리지 만, 나에게는 잘 작동했습니다.

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