DaleSchool

텍스트 오브젝트

입문20분

학습 목표

  • iw, aw 등 텍스트 오브젝트를 사용할 수 있다
  • ci", di(, ya{ 같은 조합으로 구조적 편집을 할 수 있다
  • inner와 around의 차이를 설명할 수 있다

동작하는 코드

아래 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>
  1. 오래된 내용입니다. 위에 커서를 놓고 cit를 입력하세요. 태그 안의 텍스트만 바뀌어요.
  2. "container" 안에 커서를 놓고 ci"를 입력하세요. 클래스 이름만 바꿀 수 있어요.
  3. style="color: red" 위에서 da"를 입력하면 따옴표까지 통째로 삭제돼요.

"왜?"

inner와 around

텍스트 오브젝트는 i(inner)와 a(around) 두 가지 버전이 있어요.

  • i (inner): 내용물만 — 족집게로 안쪽만 쏙 빼내는 느낌
  • a (around): 내용물 + 감싸는 것까지 — 통째로 집어내는 느낌
"Hello, World!"

di"  →  ""              (따옴표 안 내용만 삭제)
da"  →                   (따옴표까지 통째로 삭제)

diw  →  주변 공백은 유지   (단어만 삭제)
daw  →  주변 공백도 삭제   (단어 + 공백 삭제)

주요 텍스트 오브젝트

텍스트 오브젝트inner (i)around (a)설명
단어iwaw공백으로 구분된 단어
큰따옴표i"a""..." 안의 내용
작은따옴표i'a''...' 안의 내용
소괄호i( 또는 iba( 또는 ab(...) 안의 내용
중괄호i{ 또는 iBa{ 또는 aB{...} 안의 내용
대괄호i[a[[...] 안의 내용
HTML 태그itat<tag>...</tag> 안의 내용
문단ipap빈 줄로 구분된 문단
문장isas.으로 끝나는 문장

실전 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...");
}

목표:

  1. API URL을 "https://new-api.example.com"으로 변경하세요 (ci" 사용)
  2. Content-Type을 "application/json"으로 변경하세요 (ci" 사용)
  3. fetchData의 인자를 모두 삭제하세요 (di( 사용)
  4. console.log 안의 문자열을 바꿔보세요 (ci" 사용)

question: "ci\"와 ca\"의 차이는 무엇인가요?" options:

question: "함수 getData(id, name, email)에서 커서가 name 위에 있을 때, di(를 입력하면 결과는?" options:

question: "HTML 태그 <p>안녕하세요</p> 안의 텍스트만 바꾸려면 어떤 명령어를 사용해야 하나요?" options: