Practical Vim 팁 요약 시리즈 - Register

05 Feb 2017

Vim 3D

  1. Part IV. Registers
  2. CHAPTER 10. Copy and Paste
    1. Tip 60. Delete, Yank, and Put with Vim’s Unnamed Register
      1. Transposing Characters
      2. Transposing Lines
      3. Duplicating Lines
      4. Oops! I Clobbered My Yank
    2. Tip 61. Grok Vim’s Registers
      1. Addressing a Register
      2. Vim’s Terminology Versus the World
      3. The Unnamed Register (“”)
      4. The Yank Register (“0)
      5. The Named Registers (“a–”z)
      6. The Black Hole Register (“_)
    3. 시리즈 포스트를 한 장의 페이지로도 정리합니다.

Part IV. Registers

Vim의 레지스터는 단순히 텍스트를 담는 보관함이다. 클립보드처럼 텍스트를 자르고, 복사하고 붙여 넣을 수 있으며, 일련의 키 입력을 저장하여 하나의 매크로로 기록할 수 있다.

CHAPTER 10. Copy and Paste

Tip 60. Delete, Yank, and Put with Vim’s Unnamed Register

보통 잘라내기, 복사하기, 붙여넣기에 대해 이야기할 때는 클립보드에 텍스트를 넣는 것을 이야기한다. 하지만 Vim에서는 클립보드 대신에 레지스터 를 사용한다.

Transposing Characters

오타를 내는 최대 이유는 문자 두 개의 순서가 바뀌는 것이다. Vim에서는 이런 실수를 쉽게 고칠 수 있다.

두 글자 바꾸기

F␣ 명령으로 바꾸길 원하는 두 문자의 처음으로 이동한다. x 명령으로 커서 밑의 문자를 잘라내서 무명 레스트로 복사한다. p 명령으로 커서 다음에 무명 레지스터의 내용을 붙여넣는다. 함께 사용하면 xp 명령은 “다음 두 문자 서로 바꾸기”로 생각할 수 있다.

Transposing Lines

두 줄 바꾸기

x 명령으로 현재 문자를 잘라내는 대신 dd 명령으로 줄을 잘라낼 수 있다. 이번에는 p 명령은 줄 단위로 텍스트를 다루어야 한다는 것을 안다. 현재 줄 아래에 무명 레지스터 내용을 붙여넣는다.

ddp는 :현재 줄과 다음 줄의 순서를 서로 바꾸기”로 생각할 수 있다.

Duplicating Lines

yyp는 줄 단위 복사하고 붙여넣기 기능으로 동작하고 줄 단위로 복제하는 데 유용하다.

Oops! I Clobbered My Yank

copy_and_paste/collection.js:

collection = getCollection();
process(somethingInTheWay, target);

yiw 를 입력해서 collection을 무명 레지스터에 복사한다. 이제 jww로 복사한 단어를 넣을 위치인 somethungIhTheWay로 이동한다. diw 명령으로 somethungIhTheWay를 지운다. P를 눌러 무명 레지스터에 있는 내용을 커서 앞에 붙여넣는다. 하지만 collection이 아니라 somethungIhTheWay가 나타난다.

diw 명령은 단어를 단순히 지우기만 하는 게 아니라 지운 단어를 무명 레지스터에 복사하기도 한다. 익숙한 표현으로는 diw는 단어를 잘라낸다(cut the word).

이 문제를 해결하려면 Vim 레지스터가 어떻게 동작하는지 더 깊이 이해해야 한다.

Tip 61. Grok Vim’s Registers

보통 잘라하기(cut), 복사하기(copy), 붙여넣기(paste)는 한 개의 클립보드와 동작하지만, Vim에는 여러 레지스터가 있다.

Addressing a Register

Vim의 지우기(cut), 복사하기(yank), 넣기(pu) 명령을 사용할 때 명령 앞에 "{register}를 붙이면 어느 레지스터를 사용할지 지정할 수 있다. 레지스터를 지정하지 않으면 무명 레지스터를 사용한다.

Vim’s Terminology Versus the World

잘라내기(cut), 복사하기(copy), 붙여넣기(paste)는 대부분의 데스크탑 운영 체제와 소프트웨어 프로그램에서 보편적으로 사용할 수 있다. Vim에서도 제공되지만, 용어가 다르다: 제거하기(delete), 복사하기(yank), 붙여넣기(put)

Vim의 붙여넣기(put) 명령은 일반적인 붙여넣기(paste)와 동일하게 동작한다. 다행히 두 단어 모두 p 문자로 시작하기 때문에 어느 용어를 사용해도 된다.

Vim의 복사하기(yank) 명령은 일반적인 복사하기(copy)처럼 동작하는데, 역사적인 이유가 있다. c 명령이 이미 교체하기(change) 동작에 배정되어 있어 복사하기(copy)를 대체할 이름을 찾아야 했다. y 키가 있어서 복사하기 동작이 yank 명령이 되었다.

Vim의 제거하기(delete) 명령은 표준 잘라내기(cut) 동작과 같다. 이 명령은 특정 텍스트를 레지스터에 저장한 다음 문서에서 제거한다.

실제 제거하기(delete) 기능은 Vim에 없을까? Vim에는 블랙 홀이라 부르는 특별한 레지스터가 있다. 이 레지스터는 아무 것도 반환하지 않는다. 블랙 홀 레지스터는 _ 기호로 참조할 수 있다(:h quote_). "_d{motin}으로 진짜로 제거(delete)할 수 있다.

현재 단어를 a 레지스터에 복사하려면 "ayiw를 입력하면 된다. 현재 행을 레지스터 b에 잘라내려면 "bdd라고 입력한다. 레지스터 a에 저장한 단어를 문서에 붙여넣으려면 "ap 명령을, 레지스터 b에 저장한 행을 붙여넣으려면 "bp 명령을 사용한다.

일반 모드 명령뿐 아니라, Ex 명령으로도 사용할 수 있다. 현재 행을 잘라내서 c 레지스터에 저장하 려면 :delete c를 실행하면 된다. 현재 행 밑에 붙여 넣으려면 :put c를 입력한다. 일반 모드 명령에 비해서 거창하게 느껴질 수 있지만 Vim 스크립트에서 다른 Ex 명령과 함께 조합하면 유용하다.

The Unnamed Register (“”)

레지스터를 지정하지 않으면, Vim은 무명 레지스터를 사용한다. 이 무명 레지스터는 “ 기호로 참조할 수 있다(:h quote_quote). 이 레지스터를 명시적으로 참조하려면 두 개의 큰 따옴표를 사용해야한다. 예를 들면, ""pp와 같다.

x, s, d{motion}, c{motion}, y{motion} 명령(대문자 명령도 같다)은 모두 무명 레지스터를 사용한다. 명령 앞에 "{register}를 붙이면 해당 레지스터를 사용하지만, 무명 레지스터를 기본 값이다. 무명 레지스터의 내용을 쉽게 덮어쓸 수 있으니, 주의해야 한다.

사실 Vim이 선택한 용어는 적절하지 않다. xd{motion} 명령은 일반적으로 “지우기(delete)” 명령이라고 하는데 잘못된 명칭이다. “잘라내기(cut)” 명령으로 생각하는 게 더 낫다. 무명 레지스터는 종종 우리가 기대하는 텍스트를 가지고 있지 않다. 그러나 다행히도 복사하기(yank) 레지스터는 더 신뢰할 수 있다.

The Yank Register (“0)

y{motion} 명령을 사용하면 선택한 텍스트가 무명 레지스터 뿐만 아니라 복사하기 레지스터에도 저장한다. 복사하기 레지스터는 0 기호로 참조할 수 있다(:h quote0).

레지스터 이름처럼 이 레지스터는 y{motion} 명령을 사용했을 때만 저장한다. 다시 말해서 x, s, c{motion}, d{motion} 명령은 저장하지 않는다. 텍스트를 복사하면, 다른 텍스트를 복사해서 명시적으로 덮어 쓸 때까지 레지스터 0에 계속 보관된다. 무명 레지 스터는 쉽게 날아가지만 복사하기 레지스터는 신뢰할 수 있다.

앞에서의 문제를 해결하기 위해 복사하기 레지스터를 사용할 수 있다.

단어 복사하고 단어 대체하기

아직도 diw 명령은 무명 레지스터를 덮어쓰지만, 복사하기 레지스터는 건드리지 않는다. "OP 명령으로 복사하기 레지스터에서 안전하게 붙여넣을 수 있다. 원하는 대로 동작했다.

무명 레지스터와 잘라내기 레지스터의 내용을 확인하면, 어떤 본문을 제거하고 복사 했는지 확인할 수 있다:

:reg "0
--- Registers ---
""  somethingInTheWay
"0  collection

The Named Registers (“a–”z)

Vim에서는 알파벳 모든 문자에 해당하는 이름(named) 레지스터를 제공한다(:h quote_alpha). 26 조각의 텍스트를 잘라내기("ad{motion}), 복사하기("ay{motion}), 붙여넣기("ap)할 수 있다는 것을 말한다.

이름 레지스터를 사용하려면 추가적인 키 입력이 있어야 하니 간단한 상황에서는 복사하기 레지스터(“0)가 더 낫다. 이름 레지스터는 하나 이상의 텍스트 조각을 여러 위치에서 붙여넣기를 원할 때 아주 유용하다.

이름 레지스터를 소문자로 참조하면 지정된 레지스터를 덮어쓰지만, 대문자로 참조하면 지정한 레지스터에 추가한다.

The Black Hole Register (“_)

블랙홀 레지스터는 아무 내용도 반환하지 않는다. 이 레지스터는 밑줄 기호로 참조한다(:h quote_). "_d{motion} 명령을 실행하면 Vim은 복사본을 하나도 저장하지 않고 지정한 텍스트를 제거한다. 이 기능은 무명 레지스터의 내용을 덮어쓰지 않고 텍스트를 지우고 싶을 때 유용할 수 있다.

시리즈 포스트를 한 장의 페이지로도 정리합니다.

Share this:

comments powered by Disqus