동작하는 코드
아래 코드가 Vim에 열려 있다고 생각해 보세요.
const userName = "Alice";
const userAge = 25;
const userEmail = "alice@example.com";
function getUserName() {
return userName;
}
function getUserAge() {
return userAge;
}
/user를 입력하고 Enter를 누르면, 파일에서 user가 포함된 첫 번째 위치로 커서가 이동해요. n을 누르면 다음 결과, N을 누르면 이전 결과로 이동해요.
이제 :%s/user/account/g를 입력하고 Enter를 누르면, 파일 전체에서 모든 user가 account로 바뀌어요.
직접 수정하기
위 코드를 Vim에 붙여넣고 직접 해 보세요.
/userName을 입력해서 첫 번째userName을 찾아보세요.n을 여러 번 눌러서 모든userName을 순회해 보세요.*을 눌러서 커서 아래 단어를 즉시 검색해 보세요.n으로 이동도 가능해요.:%s/userName/accountName/gc를 입력해서 하나씩 확인하며 바꿔 보세요.y를 누르면 바꾸고,n을 누르면 건너뛰어요.
"왜?"
검색
| 명령어 | 동작 |
|---|---|
/패턴 | 아래 방향으로 검색 |
?패턴 | 위 방향으로 검색 |
n | 같은 방향으로 다음 결과 |
N | 반대 방향으로 다음 결과 |
* | 커서 아래 단어를 아래 방향으로 검색 |
# | 커서 아래 단어를 위 방향으로 검색 |
*은 특히 유용해요. 변수 이름 위에 커서를 놓고 *만 누르면, 그 변수가 어디에서 사용되는지 바로 확인할 수 있어요.
검색 하이라이트
검색 결과를 하이라이트로 표시하면 눈에 잘 들어와요.
:set hlsearch " 검색 결과 하이라이트 켜기
:nohlsearch " 현재 하이라이트 끄기 (줄여서 :noh)
:set nohlsearch " 하이라이트 기능 자체를 끄기
:noh는 현재 하이라이트만 임시로 끄는 거예요. 다음 검색을 하면 다시 하이라이트가 켜져요. 설정 파일에 :set hlsearch를 넣어두면 항상 켜져 있어요.
치환 (substitute)
치환 명령어의 기본 형태는 이래요.
:[범위]s/찾을패턴/바꿀텍스트/[플래그]
범위:
| 범위 | 의미 |
|---|---|
| (없음) | 현재 줄만 |
% | 파일 전체 |
1,10 | 1번째~10번째 줄 |
'<,'> | 비주얼 모드로 선택한 영역 |
플래그:
| 플래그 | 의미 |
|---|---|
g | 줄에서 모든 일치 항목을 바꿈 (없으면 첫 번째만) |
c | 바꾸기 전에 하나씩 확인 |
i | 대소문자 무시 |
실전 예시
:s/foo/bar/ " 현재 줄의 첫 번째 foo를 bar로
:s/foo/bar/g " 현재 줄의 모든 foo를 bar로
:%s/foo/bar/g " 파일 전체의 모든 foo를 bar로
:%s/foo/bar/gc " 파일 전체에서 하나씩 확인하며 바꾸기
:%s/foo/bar/gi " 대소문자 무시하고 전체 치환
:5,20s/foo/bar/g " 5~20번째 줄에서만 치환
확인 모드(c 플래그)에서의 선택지
gc 플래그를 사용하면 매 항목마다 선택할 수 있어요.
| 키 | 동작 |
|---|---|
y | 이 항목을 바꿈 |
n | 이 항목은 건너뜀 |
a | 이 항목과 나머지 전부 바꿈 |
q | 치환 중단 |
l | 이 항목만 바꾸고 중단 |
검색과 오퍼레이터 조합
검색 결과를 모션처럼 사용할 수도 있어요.
d/function → "function"이라는 단어가 나올 때까지 삭제
c/end → "end"가 나올 때까지 삭제하고 입력 모드 진입
심화 학습
정규식 기초
Vim의 검색은 정규식을 지원해요. 자주 쓰는 패턴을 알아두면 편리해요.
/\d\+ " 숫자 하나 이상
/\<word\> " 정확히 'word'만 (부분 일치 제외)
/^const " 줄 시작이 const인 경우
/;$ " 줄 끝이 ;인 경우
*로 검색할 때는 자동으로 \<word\> 형태로 검색돼서 정확한 단어만 찾아요.
변수 이름 리팩토링
아래 코드에서 data를 response로 이름을 바꿔 보세요.
function fetchData() {
const data = fetch("/api/users");
const dataList = data.json();
console.log("data loaded:", dataList);
return data;
}
1단계: *로 data를 검색해서 몇 군데에서 쓰이는지 확인하세요.
2단계: :%s/data/response/gc로 하나씩 확인하며 바꿔 보세요.
주의: dataList의 data도 바뀌나요? "data loaded:"의 data는요? gc 플래그로 선택적으로 바꿀 수 있어요.
도전: :%s/\<data\>/response/gc로 정확한 단어 매칭을 시도해 보세요.
question: ":%s/old/new/g에서 %는 무엇을 의미하나요?" options:
question: "커서 아래의 단어를 즉시 검색하는 키는?" options:
question: ":%s/foo/bar/gc에서 c 플래그의 역할은?" options: