vim 레지스터 가이드
vim은 클립보드가 나타나기 전부터 존재했는데, 그럼 복사는 어떻게?
복사와 붙여넣기에 대해서 크게 고민하면서 사용해 본 경험들은 거의 없을 겁니다. 우리는 이 기능들을 마치 물과 공기처럼 당연한 것으로 생각하고 사용하고 있습니다. 특히 반복적인 편집에 복사와 붙여넣기 기능은 꼭 필요한 기능이기도 하죠.
대부분의 프로그램들은 복사/붙여넣기 기능을 ‘클립보드’를 통해서 구현합니다. 클립보드를 사용하면 복사한 내용을 같은 프로그램 뿐만 아니라 다른 프로그램에서도 붙여넣어서 사용할 수 있죠. 사실 클립보드는 프로그램 사이에서 데이터를 주고 받는 메커니즘을 포함하기 때문에, OS에서 제공하는 기반 기술을 사용합니다. 그런데, 동시에 여러 프로그램이 실행되고 사용자가 이 프로그램 사이를 오가면서 사용하는 환경은 비교적 최근의 일입니다.
이 말은 vi/vim의 초창기에는 OS에서 클립보드와 같은 기능을 제공하지 않았다는 것을 의미합니다. 그러면 클립보드가 없을 때, vim에서는 어떻게 복사와 붙여넣기가 가능했을까요?
레지스터란?
텍스트를 조작할 수 있는 많은 고전(?) 프로그램들은 보통 자신만의 저장 공간을 따로 정의해놓고 쓰는 경우가 많은데, vim 역시 레지스터라는 공간들을 정의해놓고 있습니다. vim의 레지스터는 여러 개가 있고, 각각 이름으로 구분합니다.
복사나 붙여넣기 동작에서 레지스터를 사용할 때에는 복사, 붙여넣기 명령 앞에 사용할 레지스터를 지정합니다. 레지스터를 지정하는 키는 "입니다. y나 p 명령 바로 앞에 "x와 같이 레지스터를 지정해줄 수 있습니다.
" a 레지스터에 현재 줄 복사
"ayy
" a 레지스터 내용 붙여넣기
"ap
vim에서 레지스터는 사실 알게 모르게 상당히 여러 용도로 사용되고 있습니다. 레지스터의 종류는 대략 다음과 같은 것들이 있습니다.
- 무명 레지스터
- 숫자 레지스터 (0-9)
- 알파벳 레지스터 (a-z)
- 클립보드 레지스터
- 검색 및 명령 레지스터
- 읽기 전용 레지스터
- 특수 레지스터
각 레지스터의 특징과 사용법을 자세히 알아보겠습니다.
무명 레지스터 ("")
""는 이름이 없는 레지스터(unnamed register)로, 명시적으로 레지스터를 지정하지 않았을 때 기본적으로 사용되는 레지스터입니다. d, c, s, x 명령으로 삭제하거나 y 명령으로 복사할 때 레지스터를 지정하지 않으면 이 레지스터에 내용이 저장됩니다.
" 무명 레지스터에 복사 (""yy와 동일)
yy
" 무명 레지스터에서 붙여넣기 (""p와 동일)
p
무명 레지스터는 실제로 자체 저장 공간을 가지며, 가장 최근의 복사 또는 삭제 내용을 담고 있습니다.
숫자 레지스터 (“0-”9)
숫자 레지스터는 복사 및 삭제 히스토리를 자동으로 관리해줍니다.
”0 레지스터
"0은 가장 최근에 복사(yank)한 내용이 자동으로 기록됩니다. 단, 복사 명령에서 명시적으로 특정한 레지스터를 지정했다면 "0에는 기록되지 않습니다.
" 현재 줄 복사 (무명 레지스터와 "0에 동시 저장)
yy
" 현재 줄 삭제 (무명 레지스터와 "1에 저장, "0는 변경 없음)
dd
" "0에서 붙여넣기 (이전 복사 내용이 유지됨)
"0p
활용 팁: 어떤 내용을 복사한 후 다른 내용을 여러 번 삭제하더라도 "0에는 복사한 내용이 그대로 남아있습니다. 이는 매우 유용한 기능입니다!
“1-”9 레지스터
"1 ~ "9는 최근에 삭제한 텍스트의 히스토리를 순서대로 저장합니다.
"1: 가장 최근에 삭제한 내용 (1줄 이상의 텍스트)"2~"9: 이전 삭제 내용들 (새로운 삭제가 발생하면 순차적으로 밀려남)"9의 내용은 새로운 삭제 시 사라집니다
중요: 한 줄 미만의 삭제는 "1-"9에 기록되지 않으며, 대신 작은 삭제 레지스터("-)에 저장됩니다.
" 첫 번째 줄 삭제 → "1에 저장
dd
" 두 번째 줄 삭제 → "1에 저장, 이전 내용은 "2로 이동
dd
" 가장 최근 삭제 내용 붙여넣기
"1p
" 그 이전 삭제 내용 붙여넣기
"2p
알파벳 레지스터 (“a-”z)
각각의 알파벳 문자를 이름으로 하는 26개의 레지스터가 있고, 이들은 모두 사용자가 자유롭게 사용할 수 있습니다. 이들은 ‘named registers’로 분류됩니다.
알파벳 레지스터는 26개이지만, 레지스터에 쓸 때에는 레지스터 이름을 소문자나 대문자로 쓸 수 있습니다.
- 소문자 (a-z): 기존에 레지스터에 들어있는 값을 지우고 새로운 값으로 대체
- 대문자 (A-Z): 기존에 있는 값에 새로운 값을 추가 (append)
" a 레지스터에 현재 줄 복사 (기존 내용 덮어쓰기)
"ayy
" a 레지스터에 다음 줄도 추가로 복사 (append)
"Ayy
" a 레지스터 내용 붙여넣기 (두 줄이 붙여넣어짐)
"ap
매크로와의 관계: 매크로를 녹화할 때 q를 누른 다음에 이를 저장할 키를 하나 더 누르게 되는데, 이 때에도 해당 키 문자가 가리키는 레지스터에 입력한 키 스트로크를 순서대로 기록하게 됩니다. 즉, 매크로도 레지스터를 사용하는 것입니다!
" a 레지스터에 매크로 녹화
qa
(매크로 동작)
q
" a 레지스터 내용 확인하면 매크로 명령들이 텍스트로 저장되어 있음
:reg a
클립보드 레지스터 (”+, ”*)
vim이 클립보드를 지원하도록 컴파일되었을 때에만 사용할 수 있습니다. +clipboard 기능이 없는 경우에는 무명 레지스터와 똑같이 작동합니다.
”+ 레지스터 (시스템 클립보드)
시스템 클립보드와 연동되며, 다른 프로그램의 Ctrl+C/Ctrl+V와 연동됩니다.
" 시스템 클립보드로 복사
"+yy
" 시스템 클립보드에서 붙여넣기
"+p
" 비주얼 모드에서 선택 영역을 시스템 클립보드로 복사
V"+y
”* 레지스터 (Primary Selection)
X11 primary selection과 연동됩니다. Linux/Unix 환경에서 마우스로 텍스트를 선택하면 자동으로 이 레지스터에 복사되며, 마우스 중간 버튼으로 붙여넣을 수 있습니다.
플랫폼별 차이:
- Linux/Unix:
"+와"*가 다르게 동작 - Windows/Mac:
"+와"*가 동일하게 동작 (둘 다 시스템 클립보드)
" 클립보드 지원 여부 확인
:echo has('clipboard')
" 사용 가능한 레지스터 확인
:reg
검색 및 명령 레지스터
”/ (검색 레지스터)
가장 최근에 사용한 검색어가 저장됩니다.
" 검색 수행
/searchterm
" 검색 레지스터 내용 붙여넣기
"/p
" 검색어를 다시 사용
/<Ctrl-R>/
”: (명령 레지스터)
가장 최근에 실행된 명령줄 명령이 저장됩니다. 이 레지스터는 읽기 전용입니다.
" 명령 실행
:s/old/new/g
" 명령 레지스터 내용 확인
:reg :
" 이전 명령을 텍스트로 붙여넣기
":p
읽기 전용 레지스터
다음 세 레지스터는 유용한 정보를 담고 있지만, 외부에서 변경할 수 없습니다.
”. (마지막 삽입 텍스트)
가장 최근에 추가(insert)된 텍스트를 담고 있습니다.
" 입력 모드에서 텍스트 입력 후
Hello World
" 노멀 모드에서 마지막 입력 내용 붙여넣기
".p
" 결과: Hello World
”% (현재 파일 이름)
현재 편집 중인 파일의 이름을 담고 있습니다.
" 현재 파일 이름 붙여넣기
"%p
" 명령줄에서 현재 파일 이름 사용
:!ls -l <Ctrl-R>%
”# (대체 파일 이름)
이전에 편집했던 파일의 이름을 담고 있습니다. Ctrl-^로 전환할 수 있는 파일입니다.
" 대체 파일 이름 붙여넣기
"#p
" 대체 파일로 전환
:e <Ctrl-R>#
특수 레지스터
”- (작은 삭제 레지스터)
한 줄 미만의 삭제된 텍스트가 저장됩니다. x, s, 또는 한 줄 미만의 d 명령 사용 시 이 레지스터에 저장됩니다.
" 한 단어 삭제 → "- 레지스터에 저장
dw
" 작은 삭제 레지스터에서 붙여넣기
"-p
”_ (블랙홀 레지스터)
내용을 버리고 싶을 때 사용하는 특수 레지스터입니다. 이 레지스터로 삭제하면 다른 어떤 레지스터에도 영향을 주지 않습니다.
" 다른 레지스터에 영향 없이 삭제
"_dd
" 여러 줄을 삭제하되 레지스터는 보존
"_d5j
활용 팁: 복사한 내용을 유지하면서 다른 내용을 삭제하고 싶을 때 유용합니다!
" 시나리오: 단어를 복사한 후 다른 단어를 지우고 붙여넣기
yiw " 단어 복사
w " 다음 단어로 이동
"_diw " 블랙홀로 삭제 (복사한 내용 보존)
P " 복사했던 단어 붙여넣기
표현식 레지스터 (”=)
표현식 레지스터(expression register)는 그 자체로 레지스터라기보다는, vimscript 표현식의 결과를 레지스터 값으로 사용할 수 있게 해주는 특수 기능입니다.
입력 모드에서 Ctrl-R을 누른 후 특정한 레지스터의 이름을 입력하면 해당 레지스터의 내용을 자동으로 입력해줍니다. 이 때 Ctrl-R =을 순서대로 누르면 하단 명령줄이 =로 시작하는 수식 입력줄이 되는데, 이 때 특정한 수식이나 vimscript 함수를 입력하여 그 결과를 삽입할 수 있습니다.
" 입력 모드에서 간단한 계산 결과 삽입
<Ctrl-R>=5*8<Enter>
" 결과: 40
" 입력 모드에서 현재 파일 이름 삽입
<Ctrl-R>=expand('%')<Enter>
" 입력 모드에서 현재 날짜 삽입
<Ctrl-R>=strftime('%Y-%m-%d')<Enter>
" 결과: 2025-10-22
" 노멀 모드에서도 사용 가능
"=5*8<Enter>p
" 결과: 40
레지스터와 Vimscript
각각의 레지스터에 들어있는 값은 vimscript에서도 읽고 쓸 수 있습니다. vim 스크립트에서 각각의 레지스터는 @x와 같이 @ 문자를 앞에 붙여서 참조합니다.
" a 레지스터 값 읽기
echo @a
" a 레지스터에 값 쓰기
let @a = "Hello World"
" a 레지스터 내용을 b 레지스터로 복사
let @b = @a
" 레지스터 내용에 추가
let @a .= " Additional text"
" 클립보드에 값 설정
let @+ = "Copy this to clipboard"
주로 여러 함수 사이에서 값을 직접 전달할 수 없을 때, 미리 약속한 레지스터에 값을 써 두었다가 사용하는 방식으로 활용합니다.
레지스터 확인 및 관리
레지스터 내용 확인
" 모든 레지스터 내용 확인
:reg
:registers
" 특정 레지스터만 확인
:reg a
:reg abc " 여러 개 동시 확인
:reg "0 " 무명, 0번 레지스터 확인
레지스터 초기화
" 특정 레지스터 비우기
:let @a = ''
" 여러 레지스터 초기화
:let @a = '' | let @b = '' | let @c = ''