동작하는 코드
Vim을 종료하지 않고도 터미널 명령을 실행할 수 있어요.
:!ls ← 현재 디렉토리 파일 목록
:!python3 % ← 현재 파일을 Python으로 실행 (% = 현재 파일)
:!node % ← 현재 파일을 Node.js로 실행
명령의 결과를 파일에 바로 삽입할 수도 있어요.
:read !date ← 현재 날짜/시간을 커서 아래에 삽입
:read !ls ← 파일 목록을 커서 아래에 삽입
여러 줄에 한 번에 명령을 적용하는 것도 가능해요.
:5,10d ← 5~10번째 줄 삭제
:5,10s/foo/bar/g ← 5~10번째 줄에서 foo를 bar로 치환
:'<,'>norm I// ← 선택한 범위의 각 줄 앞에 // 추가
직접 수정하기
아래 코드가 있다고 해보세요. Vim에서 열어서 커맨드라인 명령들을 실습해보세요.
// TODO: 로그인 기능 구현
const name = "dale";
const age = 30;
// TODO: 에러 처리 추가
function greet() {
console.log("hello");
}
// TODO: 테스트 작성
function add(a, b) {
return a + b;
}
외부 명령 실행해보기:
:!wc -l % ← 현재 파일의 줄 수 확인
:!grep TODO % ← TODO가 포함된 줄 찾기
범위 지정 연습:
:1,3d ← 첫 3줄 삭제
:%s/TODO/FIXME/g ← 파일 전체에서 TODO를 FIXME로 치환
:norm 연습 — 여러 줄에 동시 편집:
비주얼 모드로 여러 줄을 선택한 뒤 아래를 입력해보세요.
V로 줄 선택 → :norm I// ← 선택한 줄 앞에 주석 추가
V로 줄 선택 → :norm 0xx ← 선택한 줄 앞의 // 주석 제거
:g (global) 명령 연습:
:g/TODO/d ← TODO가 포함된 줄 모두 삭제
:g/^$/d ← 빈 줄 모두 삭제
:v/function/d ← function이 없는 줄 모두 삭제 (:v는 :g의 반대)
"왜?"
커맨드라인 모드의 진정한 힘은 범위 + 명령의 조합에 있어요.
:!는 Vim과 터미널의 다리예요. 편집기를 벗어나지 않고도 코드를 실행하고, 결과를 확인하고, 심지어 결과를 파일에 삽입할 수 있어요. %는 현재 파일 이름을 뜻하는 특수 기호예요.
범위 지정이 강력한 이유는 "어디에" 명령을 적용할지 정밀하게 제어할 수 있기 때문이에요.
| 범위 | 의미 |
|---|---|
5,10 | 5~10번째 줄 |
% | 파일 전체 |
'<,'> | 비주얼 선택 영역 |
. | 현재 줄 |
$ | 마지막 줄 |
.,$ | 현재 줄부터 마지막 줄까지 |
:norm은 노멀 모드 명령을 여러 줄에 동시에 적용해요. :norm I//는 "각 줄에서 노멀 모드로 I//를 실행하라"는 뜻이에요. 매크로 없이도 반복 편집이 가능해요.
:g/pattern/command는 Vim의 비밀 무기예요. "패턴에 일치하는 모든 줄에 명령을 실행"해요. 사실 grep이라는 이름 자체가 이 명령에서 유래했어요 — global regular expression print의 약자예요.
심화 학습
:g 명령 활용 예제 모음
:g/console.log/d ← 모든 console.log 줄 삭제
:g/^#/norm A. ← 마크다운 제목 줄 끝에 마침표 추가
:g/^$/d ← 빈 줄 모두 삭제
:g/import/t$ ← import 줄을 파일 끝에 복사
:v/return/d ← return이 없는 줄 모두 삭제
:g/TODO/norm 0i[x] ← TODO 줄 앞에 [x] 추가
:g의 반대는 :v (inVerse)예요. :v/pattern/d는 패턴에 일치하지 않는 줄을 삭제해요.
:sort로 줄 정렬하기
:sort ← 전체 파일 알파벳순 정렬
:5,10sort ← 5~10번째 줄만 정렬
:sort! ← 역순 정렬
:sort u ← 정렬 + 중복 제거
:sort n ← 숫자 기준 정렬
CSS 속성을 알파벳순으로 정리하거나, import 문을 정렬할 때 유용해요.
아래 내용을 파일로 만들고 Vim에서 정리해보세요.
banana
apple
cherry
date
apple
elderberry
banana
:g/^$/d로 빈 줄을 모두 삭제하세요:sort u로 정렬하고 중복을 제거하세요:%norm I-로 각 줄 앞에 마크다운 리스트 기호를 추가하세요:read !date로 파일 끝에 날짜를 삽입하세요
최종 결과는 이렇게 돼야 해요:
- apple
- banana
- cherry
- date
- elderberry
(현재 날짜)
question: Vim에서 현재 파일을 Python으로 실행하려면? answers:
question: :g/TODO/d는 어떤 동작을 하나요? answers:
question: 비주얼 선택한 줄들 앞에 주석(//)을 추가하려면? answers: