내가 Vim에서 대량 텍스트 변경을 처리하는 방법
Source: Dev.to
(번역할 텍스트가 제공되지 않았습니다. 번역을 원하시는 본문을 알려주시면 한국어로 번역해 드리겠습니다.)
Source:
외부 명령어(!)로 텍스트 파이프하기
Vim의 ! 연산자는 텍스트를 셸 명령으로 전달하고, 그 명령의 출력으로 교체합니다.
:%!{cmd}– 전체 버퍼에 대해 명령을 실행합니다.:5,20!{cmd}– 5‑20줄에만 실행합니다.- 비주얼 선택 후
!를 사용하면 자동으로 범위:'가 적용됩니다.
명령이 비정상 종료하거나 출력이 없을 경우 Vim은 원래 버퍼를 복원하므로 안전하게 실험할 수 있습니다. 명령이 중간에 충돌하면 여전히 u(undo)로 되돌려야 합니다.
예시
:%!jq .
터미널에서 복사한 한 줄짜리 JSON 응답을 포맷합니다.
:%!sort -u
목록에서 중복을 제거합니다.
:%!column -t
값들의 표를 정렬합니다.
:5,20!indent
5‑20줄만 포맷합니다.
치환에서 대소문자 변환 원자
Vim의 교체 문자열은 대소문자 변환 원자를 지원합니다:
| 원자 | 효과 |
|---|---|
\U | 뒤에 오는 모든 문자를 대문자로 변환 |
\L | 뒤에 오는 모든 문자를 소문자로 변환 |
\u | 다음 문자만 대문자로 변환 |
\l | 다음 문자만 소문자로 변환 |
\E | 이전 \U/\L 변환을 종료 |
캡처 그룹과 결합하면, 이 원자들을 사용해 외부 스크립트 없이 식별자를 정규화할 수 있습니다.
예시
:%s/\v/\u\L\1/g
각 단어의 첫 글자를 대문자로, 나머지는 소문자로 변환합니다.
:%s/\v(\w+)/\U\1/g
모든 환경 변수 이름을 대문자로 변환합니다 (예: SCREAMING_SNAKE, screaming_snake).
:%s/_\(\w\)/\u\1/g
snake_case를 각 언더스코어 뒤의 문자를 대문자로 바꿔 SnakeCase로 변환합니다.
:%s/\U\1\E-\2/\U\1-\2/g
첫 번째 캡처 그룹만 대문자로 변환하고 두 번째는 그대로 둡니다.
인터랙티브 검색 네비게이션 (incsearch)
incsearch(Vim 8+ 및 Neovim에서 기본적으로 활성화됨)와 함께 와 를 사용하면 검색 프롬프트에 머물면서 앞으로와 뒤로 매치를 이동할 수 있어, 커밋하기 전에 정확한 위치를 미리 볼 수 있습니다.
사용 방법
- 일반 모드에서
/pattern을 입력합니다. 를 눌러 다음 매치로 이동하고, 다시를 눌러 그 다음 매치로 이동합니다.- “ 를 눌러 뒤로 이동합니다.
- 원하는 매치가 강조 표시되면 “ 를 눌러 선택합니다.
예시: 파일에서 user 의 세 번째 발생 위치로 이동하려면:
/user
이렇게 하면 특히 큰 파일에서 눈에 보이지 않는 n/N 탐색을 피할 수 있습니다. incsearch가 설정되어 있을 때만 작동합니다 (:set incsearch).
전역 명령(:g)으로 구조화된 블록 삭제하기
:g(global) 명령은 범위에 대해 작동할 수 있어, 생성된 HTML 스캐폴딩이나 로그 섹션과 같이 표시된 블록을 제거하는 데 이상적입니다.
구문
:g/{start_pattern}/,/{end_pattern}/{cmd}
예시
:g//,//d
HTML 주석 와 사이의 모든 블록을 삭제합니다.
:g/DEBUG START/,/DEBUG END/d
크래시 로그에서 모든 디버그 덤프를 제거합니다.
삭제 전 미리 보기
:g//,//p
삭제될 줄을 출력하여 범위를 확인할 수 있습니다.
참고: :g는 매치를 위에서 아래로 처리하면서 진행 중에 줄 번호를 업데이트하므로 연속된 블록이 올바르게 처리됩니다. 종료 마커가 시작 마커보다 먼저 나타나면 범위가 의도치 않게 확장될 수 있으니, 항상 p를 사용해 미리 확인하세요.
Refactoring Across a Project with Quickfix (:cdo)
:cdo 명령은 quickfix 리스트의 각 항목에 대해 지정된 Ex 명령을 실행하여 개별 발생에 대한 정밀 제어를 제공합니다. 이는 :vimgrep(또는 유사 명령)으로 quickfix 리스트를 채운 뒤, 코드베이스 전체에서 특정 패턴의 모든 인스턴스를 찾을 때 유용합니다.
Workflow
-
quickfix 채우기:
:vimgrep /deprecatedCall/ **/*.go -
모든 매치에 대해 치환을 적용하고 파일 저장:
:cdo s/deprecatedCall/replacementCall/ | update| update은 치환 후 파일을 기록합니다.- 정규식만으로는 충분하지 않을 때는
:cdo norm @q를 사용해 각 위치에서 기록된 매크로를 재생할 수 있습니다.
Alternatives
:cfdo는 파일당 한 번씩 명령을 실행합니다(파일 전체에 걸친 변경에 유용).:cdo는 동일한 라인이 여러 검색 결과에 나타날 경우 중복 항목을 포함합니다.
:cdo 는 파일을 자동으로 저장하지 않으므로 항상 | update(또는 | w) 를 추가해야 하며, 변경 사항을 먼저 검토하고 싶다면 이를 생략할 수 있습니다.
Closing Thoughts
이 다섯 가지 Vim 명령—외부 파이핑, 대소문자 변환 치환, 인터랙티브 검색 탐색, 전역 블록 삭제, 그리고 quickfix‑기반 리팩터링—은 플러그인 없이도 다양한 대량 편집 시나리오를 포괄합니다. Vim과 Neovim 모두에서 동일하게 작동합니다.
더 실용적인 Vim 트릭을 보려면 방문하세요 .
Vim에서 아직도 느리게 느껴지는 대량 편집 작업은 무엇인가요?