vi에서의 복사/붙이기

오랜만에 vi 글.

우분투를 쓸 때 vi는 정말 요긴한 도구이기는 하나 매우 긴 줄을 웹페이지에서 복사해서 붙이는 방법을 모르면 대략 난감한 상황이 오고, 아주 긴 내용을 붙여넣어야 할 때는 대략 정신이 멍해지기도 한다.

vi 안에서 복사하기 붙이기

vi안에서 글자를 복사하고 붙일 때는 문자열을 “레지스터”라는 곳에 복사하고, 이를 붙여넣는다. 그런데 이 레지스터는 우리가 흔히 생각하는 클립보드와 완전히 다른 공간이다. (vi 프로그램에서 사용하는 메모리 공간의 일부이다.)

레지스터에 문자열을 복사하는 동작을 vi에서는 “yank”라고 표현하고 명령 모드에서 y키를 사용한다. <횟수>y<대상>의 형태로 y w는 커서의 현재 위치에서 해당 단어의 끝까지를 복사한다. y y는 현재 라인을 복사한다. Y도 마찬가지로 현재 라인 전체를 복사한다.

이렇게 복사한 내용은 p 키를 눌러 붙여 넣을 수 있다. 만약 라인 단위로 복사하였다면 커서의 현재위치가 아닌 다음줄에 붙게 된다.

레지스터를 사용한 복사/붙여넣기

재밌는 점은 vi의 레지스터는 한 개가 아니다. 즉 여러 개의 레지스터에 각각 다른 내용을 복사해서 이를 붙일 수 있다. 레지스터를 지정하기 위해서는 겹따옴표를 사용하며, 레지스터 이름은 a~z까지 26개를 사용할 수 있다.

  • “aY : 현재라인을 레지스터 a에 복사한다.
  • “bp : 레지스터 b로부터 붙여넣는다.

클립보드에 복사하기/붙여넣기

하지만 이런 레지스터도 시스템의 클립보드와는 다른 공간이기 때문에 외부에서 복사해온 텍스트를 vi내에 붙여넣거나 vi에서 복사한 내용을 외부 프로그램에서 붙여넣기 위해서는 다른 방법을 써야 한다.

+(더하기 부호문자)는 시스템의 클립보드를 나타내는 좀 특별한 레지스터 기호이다. 따라서 다른 프로그램과 복사/붙여넣기를 호환하게 하려면 이를 사용하면 된다.

  • “+Y : 클립보드에 현재 라인을 복사
  • “+gP : 클립보드로부터 텍스트를 붙여넣고, 붙여넣은 위치 뒤로 커서 이동 (보통 붙여 넣으면 붙여 넣은 내용 뒤로 이동하니까)

그리고 이는 좀 더 간편히 사용하기 위해 따로 맵핑해두면 편리하다. .vimrc  파일에 다음 내용을 추가한다. 개인적으로 복사는 F3, 붙여넣기는 F4를 이용한다.

map <F3> "+Y
map <F4> "+gP
vmap <F3> "+y
vmap <F4> "+gP
imap <F4> <ESC>"+gPi

vmap은 비주얼모드 (블럭선택)시의 동작을 따로 정의하는 것이며 imap은 입력모드시의 동작이다. 당연히 입력모드에서는 복사를 할 수 없다.

이 방법은 윈도 및 우분투에서 사용이 가능하며, 윈도용 gVim 과 macVim(맥용 gVim)에서 사용이 가능하다. 단 OSX의 터미널에서 구동되는 vi에서는 페이스트보드(OSX의 클립보드)는 이 방법과 호환되지 않는다. (이 기능을 사용하기 위해서는 vi를 clipboard가 사용 가능하도록 새로 컴파일해서 쓰면 된다.)

추가(2012.09.24)

클립보드를 적용하는지 확인하고 싶다면 vim 명령 :echo has(‘clipboard’) 를 실행해서 그 결과가 1이면 (혹은 0이 아닌 다른 값) 사용가능하고 0이면 되지 않는다.

레지스터는 단지 복사/붙여넣기에만 사용하는 것이 아니라 파일의 특정 위치를 따로 기록할 때도 사용할 수 있다. 예를 들어 편집 중 m a 라고 하면 a라는 레지스터에 현재 위치를 저장해 둔다. 해당 위치로 이동하려면 a 를 누른다.