06 Vim 기본 - 복사하기와 붙여넣기 그리고 레지스터
- vim
- 2021. 11. 14.
컴퓨터의 세계에서 Copy & Paste 의 개념만큼 대중적인 것도 없을테다. ctrl
+ c
, ctrl
+ v
는 마치 대명사처럼 우리에게 흔한 일상이 되어버렸다. copy & paste 라는 개념이 래리 테슬러가 1973~1976 년 무렵에 발명했고, 이게 유명해진게 1978년 발매된 WordPerfect덕분이라고 한다(참조, 글에서 소개한 WordStar 는 복붙이 다른키인듯 하다). , Vim 의 아버지격인 Vi 에디터가 1976 년에 개발되었기에, ctrl
+ c
, ctrl
+ v
를 활용한 복붙 개념이 대중화되지 않은 시점이라 왜 vi 에디터에서 ctrl
+ c
, ctrl
+ v
가 복사-붙여넣기가 아닌지는 이해가 된다.
아무튼, 궁금하지 않았을지도 모르지만 왜 vi 의 복사 붙여넣기는 괴상하고 이상하고 다른건지 알아보았다.
Vim 에서의 복사와 붙여넣기
` `
y
- Vim 모션 명령으로 복사하기
y
+{모션}
명령어로 복사하여 레지스터(라고 불리는 공간)에 저장한다.
y
는 복사하기 명령이다. Vim Normal Mode 에서 y
를 누르면 vim 은 다음 모션이 무엇인지 대기한다. 앞선 포스팅에서 살펴본 motion 들을 입력하여 복사를 수행할 수 있다.
y
는 yank 의 첫글자인데, pull 과 동의어이다. 해당 부분을 '뜯어내어' 어딘가에 저장해두기 때문에 이런 용어를 사용했을 것 같다.
Y
- Vim 한 줄 복사하기
Y
(shift
+y
) 명령어로 현재 라인을 복사하여 레지스터(라고 불리는 공간)에 저장한다.y
y
명령어로 현재 라인을 복사하여 레지스터(라고 불리는 공간)에 저장한다.(Y
와 동일)
현재 커서가 위치한 라인 전체를 복사한다.
p
- Vim 복사한 내용 붙여넣기
p
- 현재 커서 다음에 복사된 내용을 붙여넣는다.- 복사된 단어들은 커서 오른쪽에 붙여넣어진다.
- 복사된 문장들은 커서 아래줄에 붙여넣어진다.
p
는 간단히 put 의 첫글자이다.
Vim 에서는 복사한 대상에 따라 붙여넣어지는 위치가 다르다. 줄 단위로 복사한 경우 커서의 아래줄에 붙여넣어지고, 단어들을 복사한 경우 커서 오른쪽에 복사한 내용이 붙여넣어진다. 이는 스크린샷을 통해 자세히 확인하자.
P
- Vim 복사한 내용 이전에 붙여넣기
P
(shift
+p
) - 현재 커서 이전에 복사된 내용을 붙여넣는다.- 복사된 단어들은 커서 왼쪽에 붙여넣어진다.
- 복사된 문장들은 커서 윗줄에 붙여넣어진다.
p(붙여넣기)와 반대 방향에 해당하는 부분에 붙여넣어진다. 스크린샷을 보도록 하자.
(심화) Vim 복사와 레지스터
이 부분부터는 심화된 내용으로, [The Vim Way] 여정을 마친 후에 다시 돌아와서 봐도 되는 내용이다. 다만, vim 의 복사가 정확히 어떻게 동작하는지 이해하고, 사용하고 싶다면 한번쯤 읽고 가도 좋다. (추후에 이 챕터는 별도의 포스팅으로 분리될 수도 있습니다.)
붙여넣는 진짜 대상
p
는 사실, 일반적인 복사-붙여넣기의 '붙여넣기'와는 그 기능이 조금 다르다. 물론 y
명령어로 수행되어 레지스터에 저장된 데이터를 붙여넣어주는 의미는 동일하지만, p
는 그 이상의 의미를 갖는다.
다음 스크린샷을 보면 알 수 있듯이, y
y
를 통해 복사한 내용이 붙여넣어지는 것이 아니라, d
d
를 통해 삭제된 내용이 붙여넣어지는 것을 확인할 수 있다. 즉, p
에 의해 붙여넣어지는 것은 '특정 공간에 저장된 데이터'인 것이다.
이 '특정 공간'은 '이름없는 레지스터'이다. 실제로 이름이 저렇다. 영어로는 unnamed register.
복사를 한 데이터도 '이름없는 레지스터'에 저장되고, 삭제가 수행된 데이터도 '이름없는 레지스터'에 저장된다. 따라서 복사가 된 이후에 삭제를 해버렸기 때문에 삭제된 데이터가 '이름없는 레지스터'에 저장되어 최종적으로 붙여넣기를 수행할 때, 삭제했던 데이터가 붙여넣어지는 것이다.
Vim register 엿보기
사실, 복사(y
), 삭제, 교체 등의 명령을 수행할 때 명령어 이전에 레지스터 이름을 지정할 수 있다. 다음 스크린샷의 구조를 따른다. y
앞에 레지스터를 지정할 수 있다. 레지스터 지정은 쌍따옴표("
)로 시작하고 바로 뒤에 레지스터 이름을 지정할 문자를 입력한다. 이러한 구조를 따를 수 있는 명령어는 y
, d
, D
, s
, S
, c
, C
, x
이 대표적이다.
vim 에서는 일단 화면에서 사라지는 데이터는 레지스터에 저장되도록 설계되어 있다. 그리고 해당 데이터가 담길 레지스터를 미리 지정할 수 있다. 물론 위 그림처럼 생략도 가능한데, 생략했다는 것은 레지스터를 지정하지 않았다는 의미이고, 그렇게 지정되지 않은 레지스터를 '이름없는 레지스터 - unnamed register'라고 부르는 것이다. 이 레지스터는 사실 이름이 있는데 쌍따옴표("
)이다. ""
에서 첫번째 쌍따옴표는 레지스터 지정자, 두 번째 쌍따옴표는 레지스터 이름이 되는 것이다. 보통 레지스터 이름은 "
k
와 같이 알파벳으로 지정할 수도 있다.
다음 스크린샷에서는, 레지스터를 활용하여 데이터를 미리 저장해놓고 필요할 때마다 꺼내쓸 수 있는 방법을 보여준다.
클립보드를 지시하는 Vim 레지스터: "
*
일반적인 운영체제에서 복사된 데이터는 '클립보드'라는 이름의 저장공간에 저장된다. 이는 Vim 의 레지스터와는 별도의 공간이기 때문에 Vim 의 일반적인 p
명령으로는 운영체제에서 복사한 내용을 붙여넣을 수 없으며, 일반적인 y
명령으로는 운영체제의 클립보드로 복사할 수도 없다.
하지만 똑똑한 vim 은 운영체제의 클립보드에 해당하는 클립보드를 가리킬 수 있도록 레지스터 이름을 할당해두었다. 바로 *
과 +
레지스터이다. 운영체제에서 복사를 수행하면 클립보드에 해당 데이터가 저장되고, Vim 의 *
, +
레지스터는 해당 클립보드를 가리킨다. 따라서 우리는 다음과 같은 방법으로 운영체제의 클립보드에 있는 데이터를 제어할 수 있다.
운영체제 클립보드에서 Vim으로 붙여넣기
- Normal Mode 에서
"
*
p
를 순차적으로 입력하면 클립보드의 내용이 커서 다음에 붙여넣어진다. - Normal Mode 에서
"
*
P
를 순차적으로 입력하면 클립보드의 내용이 커서 이전에 붙여넣어진다. - Insert Mode 에서
ctrl
+r
을 입력 후"
*
를 순차적으로 입력하면 클립보드의 내용이 커서를 기점으로 붙여넣어진다.
레지스터를 지정하는 방법이 쌍따옴표("
)와 레지스터 이름을 나타내는 문자를 연결시키는 것이었다. 위 명령들에서 "
*
는 클립보드를 지시하는 레지스터다. 마찬가지로 레지스터명으로 "
+
을 입력해도 동일한 결과를 볼 수 있다.
Vim에서 운영체제 클립보드로 복사하기
"
*
y
{모션}
명령 또는"
*
Y
명령을 활용하여 클립보드로 원하는 내용을 복사한다.y
대신 삭제 관련 명령을 활용하여 지워진 내용이 클립보드에 복사되도록 할 수도 있다.
Vim 의 레지스터
Vim 에서 레지스터 공간은 특정 문자로 지정할 수 있다. 주요한 레지스터들은 다음과 같다. (https://www.baeldung.com/linux/vim-registers)
- The unnamed register
"
"
- 26 Named registers
"
a
to"
z
(or"
A
to"
Z
) - The small delete register
"
-
- 10 numbered registers
"
0
to"
9
- The selection and drop registers
"
*
,
"
+
, and"
~
- Three read-only registers
"
:
,"
.
, and"
%
- The alternate file register
"
#
- The expression register
"
=
- Last search pattern register
"
/
- The black hole register
"
_
혹시 관심이 있다면 다음 글을 참고하자. 필자도 다음 글을 통해 도움이 많이 얻었다.
레지스터에 대한 자세한 이야기는 나중에 별도로 다루도록 하고, 우리가 알아야 하는 부분만 간략히 짚고 넘어가도록 하자.
- 레지스터는 [쌍따옴표(
"
) + 문자] 로 지정할 수 있는 Vim 의 저장공간이다. - 일반적인 삭제(
d
,D
,x
,X
), 교체(s
,S
), 복사(y
) 명령어는 명령어 키 전에 레지스터 이름을 입력받을 수 있다. 이 레지스터에 삭제된 정보, 복사된 정보가 저장된다. - 위 명령어들이 레지스터가 지정되지 않은 채로 수행되면 해당 내용은 '이름없는 레지스터(
"
"
)' 에 저장된다. - 운영체제의 클립보드와 공유되는 레지스터는 "+ 레지스터이다. 윈도우의 경우
"
*
도 동일한 역할을 수행한다. - 일반 알파벳에 해당하는 레지스터는 사용자가 임의로 사용할 수 있는 사용자 전용 레지스터이다.
- 이외의 레지스터는 지정된 데이터를 담는 특수한 저장공간이다.
vim 에서의 복사와 붙여넣기와 더불어 Vim 의 레지스터까지 그 내용을 간략히 살펴보았다. 필자도 이번에 포스팅을 준비하면서 레지스터에 관해서 더욱 명확히 이해할 수 있는 시간이었다. 복사와 붙여넣기는 그 이름의 명성만큼 흔한 기능이기 때문에, vim 을 사용함에 있어서도 기본적으로 숙지하고 있어야 할 기능이다. 다만, 붙여넣기 같은 경우에는 ctrl
+ v
를 별도로 매핑하지 않고 그대로 사용하는 것도 나쁜 선택지는 아니라고 생각한다. (사실 이는 Vim Visual Block Mode 로 진입하는 단축키이다.) 마찬가지로, Vim 에서는 ctrl
+ c
가 Normal Mode 로 빠져나가는 일종의 Esc 키와 동일한 기능을 하는데, 이 기능은 이미 Esc 로 대체가 가능하고, 또한 ctrl
+ [
키로 대체가 가능하다. 이렇게 Ctrl
+C
, Ctrl
+V
를 굳이 Vim 의 기능으로 사용할 필요가 없기도 한데, IDE, 텍스트 에디터에서 Vim 을 플러그인 형태로 사용하는 것이라면 Ctrl
+C
, Ctrl
+V
기능을 그대로 복사, 붙여넣기 기능으로 두는 것도 좋다고 생각한다.
다음 시간에는 Vim 의 Visual Mode 에 대해서 알아본다.
'vim' 카테고리의 다른 글
08 Vim 기본 - 특정 문자로 커서 이동 (0) | 2021.11.19 |
---|---|
07 Vim 기본 - Visual Mode(블록 씌우기) (0) | 2021.11.14 |
05 Vim 기본 - 수정, 삭제 그리고 오퍼레이터 (0) | 2021.11.13 |
04 Vim 기초 - Insert Mode 진입과 문자 입력하기 (0) | 2021.11.09 |
03 Vim 기초 - Normal Mode 에서의 커서 이동 (2) | 2021.11.08 |