Vim/Neovim 레지스터 — 복사·삭제·붙여넣기가 지나가는 저장 계층
Vim/Neovim의 yank·delete·change·put이 레지스터와 어떻게 연결되는지 먼저 이해하고 unnamed, numbered, named, clipboard, black hole 등 주요 레지스터를 용도별로 정리한다.
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이 작업 종류에 따라 여러 레지스터를 목적별로 관리한다는 것이다.