06 Vim 기본 - 복사하기와 붙여넣기 그리고 레지스터

Ctrl + C, Ctrl + V 의 아버지 래리 테슬러 (1945 ~ 2020), 1970 중반에 복붙 단축키 발명

컴퓨터의 세계에서 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 가 복사-붙여넣기가 아닌지는 이해가 된다.

 WordPerfect 6.0 on DOS - https://www.youtube.com/watch?v=ML_GoEUhs4A 에서 캡쳐(3분 50초경)

아무튼, 궁금하지 않았을지도 모르지만 왜 vi 의 복사 붙여넣기는 괴상하고 이상하고 다른건지 알아보았다. 

Vim 에서의 복사와 붙여넣기

` `

y - Vim 모션 명령으로 복사하기

  • y + {모션} 명령어로 복사하여 레지스터(라고 불리는 공간)에 저장한다.

y 는 복사하기 명령이다. Vim Normal Mode 에서 y 를 누르면 vim 은 다음 모션이 무엇인지 대기한다. 앞선 포스팅에서 살펴본 motion 들을 입력하여 복사를 수행할 수 있다.

 

y 는 yank 의 첫글자인데, pull 과 동의어이다. 해당 부분을 '뜯어내어' 어딘가에 저장해두기 때문에 이런 용어를 사용했을 것 같다.

Y - Vim 한 줄 복사하기

  • Y(shift + y) 명령어로 현재 라인을 복사하여 레지스터(라고 불리는 공간)에 저장한다.
  • yy 명령어로 현재 라인을 복사하여 레지스터(라고 불리는 공간)에 저장한다.(Y 와 동일)

현재 커서가 위치한 라인 전체를 복사한다.

p - Vim 복사한 내용 붙여넣기

  • p - 현재 커서 다음에 복사된 내용을 붙여넣는다.
    • 복사된 단어들은 커서 오른쪽에 붙여넣어진다.
    • 복사된 문장들은 커서 아래줄에 붙여넣어진다.

p는 간단히 put 의 첫글자이다.

 

Vim 에서는 복사한 대상에 따라 붙여넣어지는 위치가 다르다. 줄 단위로 복사한 경우 커서의 아래줄에 붙여넣어지고, 단어들을 복사한 경우 커서 오른쪽에 복사한 내용이 붙여넣어진다. 이는 스크린샷을 통해 자세히 확인하자.

Vim 단어 복사(<code>ya`</code>)하여 커서 오른쪽에 붙여넣기(<code>p</code>)
줄 복사(<code>yy</code> 또는 <code>Y</code>)하여 커서 아래에 붙여넣기(<code>p</code>)

P - Vim 복사한 내용 이전에 붙여넣기

  • P(shift + p) - 현재 커서 이전에 복사된 내용을 붙여넣는다.
    • 복사된 단어들은 커서 왼쪽에 붙여넣어진다.
    • 복사된 문장들은 커서 윗줄에 붙여넣어진다.

p(붙여넣기)와 반대 방향에 해당하는 부분에 붙여넣어진다. 스크린샷을 보도록 하자.

괄호 안의 내용을 복사하여 P(shift + p) 기능을 이용하여 커서 왼쪽에 붙여넣기를 수행했다.
한 줄을 복사하여 특정 라인에서 <code>P</code>(<code>shift</code> + <code>p</code>) 기능을 이용하여 줄 위에 붙여넣기를 수행했다.

(심화) Vim 복사와 레지스터

이 부분부터는 심화된 내용으로, [The Vim Way] 여정을 마친 후에 다시 돌아와서 봐도 되는 내용이다. 다만, vim 의 복사가 정확히 어떻게 동작하는지 이해하고, 사용하고 싶다면 한번쯤 읽고 가도 좋다. (추후에 이 챕터는 별도의 포스팅으로 분리될 수도 있습니다.)

붙여넣는 진짜 대상

p 는 사실, 일반적인 복사-붙여넣기의 '붙여넣기'와는 그 기능이 조금 다르다. 물론 y 명령어로 수행되어 레지스터에 저장된 데이터를 붙여넣어주는 의미는 동일하지만, p 는 그 이상의 의미를 갖는다.

 

다음 스크린샷을 보면 알 수 있듯이, yy 를 통해 복사한 내용이 붙여넣어지는 것이 아니라, dd 를 통해 삭제된 내용이 붙여넣어지는 것을 확인할 수 있다. 즉, p 에 의해 붙여넣어지는 것은 '특정 공간에 저장된 데이터'인 것이다. 

 

이 '특정 공간'은 '이름없는 레지스터'이다. 실제로 이름이 저렇다. 영어로는 unnamed register.

 

복사를 한 데이터도 '이름없는 레지스터'에 저장되고, 삭제가 수행된 데이터도 '이름없는 레지스터'에 저장된다. 따라서 복사가 된 이후에 삭제를 해버렸기 때문에 삭제된 데이터가 '이름없는 레지스터'에 저장되어 최종적으로 붙여넣기를 수행할 때, 삭제했던 데이터가 붙여넣어지는 것이다.

'이름없는 레지스터'를 공유하는 vim 의 y(yank) 명령어와 d 명령어

Vim register 엿보기

사실, 복사(y), 삭제, 교체 등의 명령을 수행할 때 명령어 이전에 레지스터 이름을 지정할 수 있다. 다음 스크린샷의 구조를 따른다. y 앞에 레지스터를 지정할 수 있다. 레지스터 지정은 쌍따옴표(")로 시작하고 바로 뒤에 레지스터 이름을 지정할 문자를 입력한다. 이러한 구조를 따를 수 있는 명령어는 y, d, D, s, S, c, C, x 이 대표적이다.

vim 복사(<code>y</code>), 붙여넣기(<code>p</code>), 수정형(<code>d</code>, <code>s</code>, <code>c</code> 등) 명령어 앞 생략할 수 있는 레지스터 이름 지정부

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)

  1. The unnamed register ""
  2. 26 Named registers "a to "z (or "A to "Z)
  3. The small delete register "-
  4. 10 numbered registers "0 to "9
  5. The selection and drop registers "*, "+, and "~
  6. Three read-only registers ":, "., and "%
  7. The alternate file register "#
  8. The expression register "=
  9. Last search pattern register "/
  10. The black hole register "_

혹시 관심이 있다면 다음 글을 참고하자. 필자도 다음 글을 통해 도움이 많이 얻었다.

 

Vim - 레지스터에 관해 · Wireframe

vim에서 문자열을 복사하는 것을 매뉴얼에서는 copy가 아니라 yank로 설명한다. 이는 전통적인 이유가 있긴한데, 어쨌든 보통의 응용프로그램에서의 ‘복사’는 클립보드에 콘텐츠를 써 넣는 것을

soooprmx.com

레지스터에 대한 자세한 이야기는 나중에 별도로 다루도록 하고, 우리가 알아야 하는 부분만 간략히 짚고 넘어가도록 하자. 

  • 레지스터는 [쌍따옴표(") + 문자] 로 지정할 수 있는 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 에 대해서 알아본다.

 

반응형

Designed by JB FACTORY