Vim의 모든 프로젝트 파일에서 검색 및 바꾸기 (확인 포함)를 수행하는 가장 좋은 방법을 찾고 있습니다. “프로젝트 파일”이란 현재 디렉토리에있는 파일을 의미하며 일부는 열지 않아도됩니다.
이를 수행하는 한 가지 방법은 현재 디렉토리에있는 모든 파일을 여는 것입니다.
:args ./**
그런 다음 열려있는 모든 파일을 검색하고 바꿉니다.
:argdo %s/Search/Replace/gce
그러나 이렇게하면 Vim의 메모리 사용량이 수십 MB에서 2GB 이상으로 증가하여 저에게 적합하지 않습니다.
또한 EasyGrep 플러그인이 설치되어 있지만 거의 작동하지 않습니다. 모든 항목을 찾지 못 하거나을 누를 때까지 중단 CtrlC됩니다. 지금까지이 작업을 수행하기 위해 선호하는 방법 은 검색어에 대해 ack-grep하는 것 입니다. quickfix 창을 사용하여 이전에 열지 않은 용어가 포함 된 파일을 열고 마지막으로 :bufdo %s/Search/Replace/gce
.
나는 이것을 위해 사용할 수있는 훌륭하고 작동하는 플러그인을 찾고 있거나, 아니면 내가 지금 사용하고있는 것보다 더 쉬운 명령 / 시퀀스를 찾고있다.
답변
답변
여기서 또 다른 큰 옵션은 단순히 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
하여이를 수행하기 위해 실행할 명령의 양을 크게 줄입니다 ( 각 파일에서 명령 cdo
을 cfdo
실행 하는 동안 각 요소에서 명령을 실행 하기 때문에 ).
최근에 추가 된 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
플래그)
- 같은 줄에 여러 번 (
:cnf
⇒vim
명령에 의해 생성 된 목록에서 다음 파일로 이동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 .`
그런 다음 :argdo
OP에 설명 된대로 사용할 수 있습니다 .
:argdo %s/pattern/replacement/gce
:args
빠른 수정 목록에서 채우기
또한 현재 빠른 수정 목록에서 arglist를 채우는 간단한 사용자 정의 명령을 설명하는 관련 질문에 대한 nelstrom의 대답 을 확인 하십시오. 이는 출력이 퀵 픽스 목록 ( :vimgrep
, :Ack
3 , :Ggrep
4 )에 포함 되는 많은 명령 및 플러그인에서 잘 작동합니다 .
프로젝트 전체 검색을 수행하는 순서는 다음을 사용하여 수행 할 수 있습니다.
:vimgrep /pattern/ **/*
:Qargs
:argdo %s/findme/replacement/gc
여기서는 :Qargs
빠른 수정 목록에서 arglist를 채우는 사용자 정의 명령에 대한 호출입니다.
이 워크 플로우를 2 개 또는 3 개의 명령으로 낮추는 간단한 플러그인 에 대한 후속 토론 에서도 링크를 찾을 수 있습니다 .
연결
- : h {arglist} -vimdoc.sourceforge.net/htmldoc/editing.html# {arglist }
- ACK – betterthangrep.com/
- ack.vim – github.com/mileszs/ack.vim
- 도망자 – github.com/tpope/vim-fugitive