[vim] Vim에서 모든 프로젝트 파일 검색 및 바꾸기

Vim의 모든 프로젝트 파일에서 검색 및 바꾸기 (확인 포함)를 수행하는 가장 좋은 방법을 찾고 있습니다. “프로젝트 파일”이란 현재 디렉토리에있는 파일을 의미하며 일부는 열지 않아도됩니다.

이를 수행하는 한 가지 방법은 현재 디렉토리에있는 모든 파일을 여는 것입니다.

:args ./**

그런 다음 열려있는 모든 파일을 검색하고 바꿉니다.

:argdo %s/Search/Replace/gce

그러나 이렇게하면 Vim의 메모리 사용량이 수십 MB에서 2GB 이상으로 증가하여 저에게 적합하지 않습니다.

또한 EasyGrep 플러그인이 설치되어 있지만 거의 작동하지 않습니다. 모든 항목을 찾지 못 하거나을 누를 때까지 중단 CtrlC됩니다. 지금까지이 작업을 수행하기 위해 선호하는 방법 은 검색어에 대해 ack-grep하는 것 입니다. quickfix 창을 사용하여 이전에 열지 않은 용어가 포함 된 파일을 열고 마지막으로 :bufdo %s/Search/Replace/gce.

나는 이것을 위해 사용할 수있는 훌륭하고 작동하는 플러그인을 찾고 있거나, 아니면 내가 지금 사용하고있는 것보다 더 쉬운 명령 / 시퀀스를 찾고있다.



답변

Greplace 는 나를 위해 잘 작동합니다.

github 에는 병원체 준비 버전 도 있습니다 .


답변

여기서 또 다른 큰 옵션은 단순히 vim을 사용하지 않는 것입니다.

sed -i 's/pattern/replacement/' <files>

또는 파일 목록을 생성하는 방법이 있다면 다음과 같습니다.

find . -name *.cpp | xargs sed -i 's/pattern/replacement/'
grep -rl 'pattern1' | xargs sed -i 's/pattern2/replacement/'

등등!


답변

편집 : cfdo대신 명령을 사용 cdo하여이를 수행하기 위해 실행할 명령의 양을 크게 줄입니다 ( 각 파일에서 명령 cdocfdo실행 하는 동안 각 요소에서 명령을 실행 하기 때문에 ).

최근에 추가 된 cdo명령 덕분에 이제 grep설치 한 도구를 사용하여 두 개의 간단한 명령으로이 작업을 수행 할 수 있습니다 . 추가 플러그인이 필요하지 않습니다! :

1. :grep <search term>
2. :cdo %s/<search term>/<replace term>/gc
3. (If you want to save the changes in all files) :cdo update

( 명령이 채워지 cdo는 빠른 수정 목록의 각 용어에 대해 주어진 명령을 실행합니다 grep.)

( c매번 확인하지 않고 각 검색어를 바꾸려면 두 번째 명령의 끝에서 제거 )


답변

나는 GNU 하위 집합이 아닌 더 강력한 전체 Perl 정규식을 활용하기 위해이 문제를 해결하기 위해 ack 및 Perl을 사용하기로 결정했습니다.

ack -l 'pattern' | xargs perl -pi -E 's/pattern/replacement/g'

설명

확인

ACK는 (A)의 혼합이다 멋진 명령 줄 도구입니다 grep, find그리고 전체 펄 정규 표현식 (뿐만 아니라 GNU 부분 집합). 순수한 Perl로 작성되었으며 빠르며 구문 강조 기능이 있으며 Windows에서 작동하며 기존 명령 줄 도구보다 프로그래머에게 더 친숙합니다. Ubuntu에 sudo apt-get install ack-grep.

xargs

Xargs 는 오래된 유닉스 명령 줄 도구입니다. 표준 입력에서 항목을 읽고 지정된 명령 다음에 표준 입력을 위해 읽은 항목을 실행합니다. 따라서 기본적으로 ack에 의해 생성 된 파일 목록이 perl -pi -E 's/pattern/replacemnt/g'명령 끝에 추가됩니다 .

펄 -pi

Perl은 프로그래밍 언어입니다. -p 옵션은 Perl이 파일 이름 인수를 반복하는 프로그램 주위에 루프를 생성하도록합니다. -i 옵션은 Perl이 파일을 제자리에서 편집하도록합니다. 이를 수정하여 백업을 생성 할 수 있습니다. -E 옵션은 Perl이 프로그램으로 지정된 한 줄의 코드를 실행하도록합니다. 우리의 경우 프로그램은 Perl 정규식 대체 일뿐입니다. Perl 명령 줄 옵션에 대한 자세한 내용 perldoc perlrun. Perl에 대한 자세한 내용은 http://www.perl.org/를 참조 하십시오 .


답변

아마도 이렇게 :

:noautocmd vim /Search/ **/*
:set hidden
:cfirst
qa
:%s//Replace/gce
:cnf
q
1000@a
:wa

설명:

  • :noautocmd vim /Search/ **/*⇒ 속도를 위해 autocmds ( ) 를 트리거하지 않고 cwd의 모든 하위 디렉토리에있는 모든 파일에서 패턴을 조회 ( vim는 약어 vimgrep임) :noautocmd합니다.
  • :set hidden ⇒ 수정 된 버퍼가 창에 표시되지 않도록 허용 (vimrc에있을 수 있음)
  • :cfirst ⇒ 첫 번째 검색 결과로 이동
  • qa 레지스터에 매크로 기록을 시작 ⇒
  • :%s//Replace/gce⇒ 마지막 검색 패턴의 모든 항목을 ( /Search/그 당시에도) 다음으로 바꿉니다 Replace.
    • 같은 줄에 여러 번 ( g플래그)
    • 사용자 확인 포함 ( c플래그)
    • 패턴을 찾을 수없는 경우 오류없이 ( e플래그)
  • :cnfvim명령에 의해 생성 된 목록에서 다음 파일로 이동
  • q ⇒ 매크로 기록 중지
  • 1000@a ⇒ 레지스터에 저장된 매크로를 1000 번 재생
  • :wa ⇒ 수정 된 모든 버퍼 저장

* 편집 * Vim 8 방법 :

Vim 8부터는 :cfdo빠른 수정 목록의 모든 파일 을 반복 하므로 더 나은 방법이 있습니다 .

:noautocmd vim /Search/ **/*
:set hidden
:cfdo %s//Replace/gce
:wa


답변

:args셸 명령에서 채우기

(일부 운영 체제에서 1 )) :args쉘 명령 을 통해 파일을 제공 할 수 있습니다 .

예를 들어 ack 2가 설치된 경우

:args `ack -l pattern`

ack에게 ‘pattern’이 포함 된 파일 목록을 반환하도록 요청하고이를 인수 목록에 넣습니다.

또는 일반 ol ‘grep을 사용하면 다음과 같습니다.

:args `grep -lr pattern .`

그런 다음 :argdoOP에 설명 된대로 사용할 수 있습니다 .

:argdo %s/pattern/replacement/gce

:args빠른 수정 목록에서 채우기

또한 현재 빠른 수정 목록에서 arglist를 채우는 간단한 사용자 정의 명령을 설명하는 관련 질문에 대한 nelstrom의 대답 을 확인 하십시오. 이는 출력이 퀵 픽스 목록 ( :vimgrep, :Ack3 , :Ggrep4 )에 포함 되는 많은 명령 및 플러그인에서 잘 작동합니다 .

프로젝트 전체 검색을 수행하는 순서는 다음을 사용하여 수행 할 수 있습니다.

:vimgrep /pattern/ **/*
:Qargs
:argdo %s/findme/replacement/gc

여기서는 :Qargs빠른 수정 목록에서 arglist를 채우는 사용자 정의 명령에 대한 호출입니다.

이 워크 플로우를 2 개 또는 3 개의 명령으로 낮추는 간단한 플러그인 에 대한 후속 토론 에서도 링크를 찾을 수 있습니다 .

연결

  1. : h {arglist} -vimdoc.sourceforge.net/htmldoc/editing.html# {arglist }
  2. ACKbetterthangrep.com/
  3. ack.vimgithub.com/mileszs/ack.vim
  4. 도망자github.com/tpope/vim-fugitive

답변

2016 년에 추가 옵션 인 far.vim 플러그인 :

far.vom