포스트

Vim/Neovim 레지스터 — 복사·삭제·붙여넣기가 지나가는 저장 계층

Vim/Neovim의 yank·delete·change·put이 레지스터와 어떻게 연결되는지 먼저 이해하고 unnamed, numbered, named, clipboard, black hole 등 주요 레지스터를 용도별로 정리한다.

Vim/Neovim 레지스터 — 복사·삭제·붙여넣기가 지나가는 저장 계층

Vim/Neovim에서 복사와 삭제를 이해하려면 먼저 레지스터(Register)라는 중간 저장 계층을 알아야 한다. y(yank), d(delete), c(change)는 텍스트를 레지스터에 넣고, p(put)는 레지스터에서 텍스트를 꺼낸다.

1
2
3
4
5
6
7
8
9
텍스트
  ↓
yank / delete / change
  ↓
레지스터
  ↓
put
  ↓
다른 위치의 텍스트

따라서 Vim의 복사·붙여넣기는 단순히 “클립보드 하나”를 쓰는 구조가 아니다. 어떤 작업을 했는지와 어떤 레지스터를 지정했는지에 따라 여러 저장 공간이 함께 갱신된다.

1. 먼저 잡을 큰 그림 — 레지스터는 용도가 다르다

실제로 자주 만나는 레지스터를 역할별로 나누면 다음과 같다.

목적대표 레지스터역할
기본 작업"지정하지 않았을 때 사용하는 unnamed 레지스터
최근 작업 보존"0, "1~"9, "-마지막 yank와 최근 삭제 기록
직접 보관"a~"z사용자가 이름을 정해 텍스트 보관
시스템 연동"+, "*OS 클립보드·selection 연동
버리기"_삭제 내용을 다른 레지스터에 남기지 않음
특수 값"., "%, "#, ":, "/, "=입력·파일명·명령·검색·표현식 등

이 분류를 먼저 기억하면 개별 기호를 외우기가 훨씬 쉽다.

2. Unnamed 레지스터 — 기본 입출력 창구

아무 레지스터도 지정하지 않고 y, d, c를 사용하면 결과는 기본적으로 unnamed 레지스터(")를 통해 접근할 수 있다.

1
2
3
4
5
yy
 ↓
unnamed register
 ↓
p

그래서 그냥 p를 누르면 최근 yank나 delete/change 결과가 붙여넣어진다.

중요한 점은 unnamed가 독립적인 “최근 작업 한 칸”만 의미하는 것이 아니라, 다른 numbered/small-delete 레지스터 갱신 규칙과 함께 동작한다는 것이다.

3. Yank와 Delete를 따로 보존하는 Numbered 레지스터

Vim은 yank와 삭제 기록을 구분해 보존한다.

"0 — 마지막 Yank

"0에는 마지막 yank 내용이 남는다.

1
2
3
yank
 ↓
"0

그 뒤 다른 텍스트를 삭제해서 기본 p 결과가 바뀌었더라도 마지막으로 복사했던 텍스트는 "0p로 다시 꺼낼 수 있다.

"1 ~ "9 — 최근 삭제 기록

큰 삭제·변경은 numbered register에 순차적으로 밀려 들어간다.

1
2
3
4
가장 최근 삭제 → "1
그 이전       → "2
...
더 오래된 것   → "9

"0마지막 yank, "1~"9삭제 이력이라는 대비로 기억하면 된다.

4. Small Delete 레지스터 — 작은 삭제의 별도 경로

작은 단위의 삭제는 "-(small delete register)에 저장될 수 있다.

이 규칙 덕분에 작은 편집을 할 때마다 numbered delete history가 불필요하게 밀리는 것을 줄인다.

따라서 삭제 결과가 어디에 들어가는지는 단순히 “모든 delete가 "1“이라고 외우기보다 삭제 크기와 종류에 따라 규칙이 갈린다고 이해하는 편이 정확하다.

5. Named 레지스터 — 직접 이름을 붙여 보관한다

"a~"z는 사용자가 직접 선택하는 named register다.

1
2
"ayy
"ap

위 예시는 현재 줄을 a에 저장한 뒤 다시 붙여넣는다.

대문자를 사용하면 기존 내용 뒤에 추가할 수 있다.

1
"Ayy

즉 named register는 여러 텍스트 조각을 작업 중에 의도적으로 따로 보관할 때 유용하다.

6. 시스템 클립보드 — "+"*

Vim 내부 레지스터와 운영체제 클립보드는 같은 개념이 아니다. Vim은 특수 레지스터를 통해 외부 clipboard/selection과 연결한다.

1
2
3
4
5
Vim 레지스터
   ↕
"+ / "*
   ↕
운영체제 Clipboard / Selection
  • "+ — 일반적으로 시스템 clipboard와 연결
  • "* — X11의 primary selection과 연결

Windows와 macOS에서는 두 레지스터가 사실상 같은 시스템 클립보드로 연결되는 경우가 많고, Linux X11 환경에서는 의미가 구분될 수 있다.

7. Black Hole 레지스터 — 저장하지 않고 버린다

"_는 black hole register다.

1
"_daw

단어를 삭제하지만 삭제한 내용을 일반적인 yank/delete 레지스터 흐름에 남기지 않는다.

1
2
3
4
5
삭제
 ↓
"_
 ↓
폐기

기존에 복사해둔 내용을 유지하면서 텍스트만 제거하고 싶을 때 유용하다.

8. 특수 레지스터 — 편집 상태 자체를 읽는다

일부 레지스터는 텍스트 보관함이라기보다 Vim의 현재·최근 상태를 노출한다.

레지스터의미
".마지막으로 입력한 텍스트
"%현재 파일 이름
"#alternate 파일 이름
":마지막 Ex 명령
"/마지막 검색 패턴
"=표현식을 평가해 사용하는 expression register

예를 들어 입력 모드나 명령줄에서 Ctrl-r /를 사용하면 마지막 검색 패턴을 불러올 수 있다.

Expression register는 계산 결과를 즉시 삽입할 때 사용할 수 있다.

1
2
3
Ctrl-r =
3 * 7
→ 21

9. 실제 작업 흐름으로 기억하기

개별 기호를 전부 외우기보다 다음 상황을 기준으로 기억하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
그냥 복사·삭제·붙여넣기
→ unnamed (")

마지막 복사본을 다시 꺼내기
→ "0

이전 삭제 내용 찾기
→ "1 ~ "9

여러 조각을 따로 보관하기
→ "a ~ "z

시스템 클립보드 사용
→ "+ / "*

기존 복사본을 보존하고 삭제
→ "_

10. 현재 레지스터 확인

현재 레지스터 상태는 다음 명령으로 확인할 수 있다.

1
:registers

짧게는:

1
:reg

레지스터 규칙이 헷갈릴 때는 작업 직후 :reg를 실행해 어떤 레지스터가 실제로 바뀌었는지 확인하는 것이 가장 빠른 학습 방법이다.

정리

레지스터를 “Vim의 클립보드 목록”으로만 기억하면 yank와 delete가 서로 덮어쓰는 이유가 헷갈린다.

1
2
3
4
5
6
7
편집 동작
   ↓
Vim의 레지스터 선택·갱신 규칙
   ↓
여러 목적의 저장 공간
   ↓
put 또는 외부 Clipboard

핵심은 복사·삭제·변경과 붙여넣기 사이에 레지스터 계층이 있고, Vim이 작업 종류에 따라 여러 레지스터를 목적별로 관리한다는 것이다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.