동작하는 코드
아래 JavaScript 코드가 Vim에 열려 있다고 생각해 보세요.
const greeting = "Hello, World!";
function add(a, b) {
return a + b;
}
커서가 Hello 위 어디에든 있을 때 이 명령어를 입력해 보세요.
ci" → 따옴표 안의 내용이 삭제되고 입력 모드 진입
결과: const greeting = "|"; (|는 커서 위치)
di( → 괄호 안의 내용만 삭제
결과: function add() {
daw → 커서가 위치한 단어 + 주변 공백 삭제
텍스트 오브젝트는 족집게와 같아요. 커서가 어디에 있든, 구조를 인식해서 정확한 범위를 잡아줘요.
직접 수정하기
이 HTML 코드를 수정해 봅시다.
<div class="container">
<p>오래된 내용입니다.</p>
<span style="color: red">경고 메시지</span>
</div>
오래된 내용입니다.위에 커서를 놓고cit를 입력하세요. 태그 안의 텍스트만 바뀌어요."container"안에 커서를 놓고ci"를 입력하세요. 클래스 이름만 바꿀 수 있어요.style="color: red"위에서da"를 입력하면 따옴표까지 통째로 삭제돼요.
"왜?"
inner와 around
텍스트 오브젝트는 i(inner)와 a(around) 두 가지 버전이 있어요.
i(inner): 내용물만 — 족집게로 안쪽만 쏙 빼내는 느낌a(around): 내용물 + 감싸는 것까지 — 통째로 집어내는 느낌
"Hello, World!"
di" → "" (따옴표 안 내용만 삭제)
da" → (따옴표까지 통째로 삭제)
diw → 주변 공백은 유지 (단어만 삭제)
daw → 주변 공백도 삭제 (단어 + 공백 삭제)
주요 텍스트 오브젝트
| 텍스트 오브젝트 | inner (i) | around (a) | 설명 |
|---|---|---|---|
| 단어 | iw | aw | 공백으로 구분된 단어 |
| 큰따옴표 | i" | a" | "..." 안의 내용 |
| 작은따옴표 | i' | a' | '...' 안의 내용 |
| 소괄호 | i( 또는 ib | a( 또는 ab | (...) 안의 내용 |
| 중괄호 | i{ 또는 iB | a{ 또는 aB | {...} 안의 내용 |
| 대괄호 | i[ | a[ | [...] 안의 내용 |
| HTML 태그 | it | at | <tag>...</tag> 안의 내용 |
| 문단 | ip | ap | 빈 줄로 구분된 문단 |
| 문장 | is | as | .으로 끝나는 문장 |
실전 before/after 비교
ci" — 문자열 내용 변경:
Before: const name = "Alice";
커서가 여기 ──^
ci"World 입력 후 Esc
After: const name = "World";
di( — 함수 인자 삭제:
Before: calculateTotal(price, tax, discount)
커서가 여기 ──^
di(
After: calculateTotal()
dap — 문단 통째로 삭제:
Before:
첫 번째 문단입니다.
여러 줄로 되어 있어요.
두 번째 문단입니다.
커서가 첫 번째 문단 위에 있을 때 dap →
After:
두 번째 문단입니다.
커서 위치는 상관없다
텍스트 오브젝트의 가장 큰 장점은 커서가 범위 안 어디에 있든 동작한다는 거예요. ci"를 입력하면 따옴표 안 어디에 커서가 있든 전체 내용을 바꿀 수 있어요. 모션처럼 시작 위치를 신경 쓸 필요가 없어요.
심화 학습
오퍼레이터와 조합하기
텍스트 오브젝트는 이전 레슨에서 배운 오퍼레이터와 자유롭게 조합할 수 있어요.
diw → 단어 삭제
ciw → 단어 변경 (입력 모드 진입)
yiw → 단어 복사
di" → 따옴표 안 삭제
ci( → 괄호 안 변경
ya{ → 중괄호 포함해서 복사
공식: 오퍼레이터 + i/a + 오브젝트
코드 리팩토링 연습
아래 코드를 Vim에서 열고, 텍스트 오브젝트를 활용해 수정해 보세요.
const config = {
apiUrl: "https://old-api.example.com",
timeout: 3000,
headers: { "Content-Type": "text/plain" },
};
function fetchData(url, options, callback) {
console.log("Fetching data...");
}
목표:
- API URL을
"https://new-api.example.com"으로 변경하세요 (ci"사용) - Content-Type을
"application/json"으로 변경하세요 (ci"사용) fetchData의 인자를 모두 삭제하세요 (di(사용)console.log안의 문자열을 바꿔보세요 (ci"사용)
question: "ci\"와 ca\"의 차이는 무엇인가요?" options:
question: "함수 getData(id, name, email)에서 커서가 name 위에 있을 때, di(를 입력하면 결과는?" options:
question: "HTML 태그 <p>안녕하세요</p> 안의 텍스트만 바꾸려면 어떤 명령어를 사용해야 하나요?" options: