All Articles

Vim & Tmux에서 Mac/리눅스 클립보드(clipboard)로 copy & paste 하기

Vim을 처음 사용하는 유저들은 몇가지 불편한점들이 있는데 그 중 가장 자주 언급되는것이 바로 vim에서 다른 프로그램(예를 들어, 크롬 브라우저)으로 텍스트 복사나 붙이기가 안된다는 것이다. Vim에서 y키로 yank를 해도 크롬 브라우저에서 paste가 안되거나 크롬 브라우저에서 코드를 복사해도 vim상에서 p로 paste가 안되는것이다. (Macvim 이나 Gvim 처럼 해당 OS 호환성을 높인 vim에서는 command+ccommand+c 같은 해당 OS의 복사나 붙이기 키를 사용하는 우회적인 방법이 있기는 하다.)

Vim에서 다른 프로그램으로 복사 및 붙이기가 안되는 이유는 vim이 자체 레지스터를 가지고 있기 때문이다. 즉, vim에서 카피를 하면 vim의 자체 버퍼에 등록이 되고 OS 클립보드에는 등록이 안되기 때문에 다른 프로그램에 복사나 붙이기가 되지 않는것이다. 하지만 몇가지 셋팅만 설정해놓으면 vim도 OS의 클립보드를 사용하게 할 수 있다.

Mac에서 vim 클립보드를 OS 클립보드로 설정하기

Vim 7.4 버젼 부터는 Mac OS X의 clipboard를 지원한다. 그럼으로 .vimrc 파일에서 아래 설정만 추가해주면 된다.

set clipboard=unnamed " use OS clipboard

Vim 버젼이 7.4 이상이여야 함으로 vim 버젼에 7.4 이하이면 vim의 버젼을 업그래이드 해주도록 하자.

단순히 vim만 사용한다면 위의 설정만 해주만 충분하지만, 만일 Tmux와 vim을 같이 사용한다면(사실 대부분의 vim 유저들이 tmux를 같이 사용하지 않을까?) vim에서 yank와 paste를 할때 아래와 같은 에러가 발생할수도 있다.

E353: Nothing in register *  

tmux도 자체 copy 버퍼를 가지고 있어서 생기는 문제인데, vim과 Mac OS만 연결시키주면 안되고 vim 과 tmux 그리고 mac을 전부 다 연결시켜줘야 한다. 다행히 이 문제를 해결해주는 reattach-to-user-namespace 것이 있음으로 설치하면 된다.

먼저 homebrew를 사용해서 인스톨 하자.

brew install reattach-to-user-namespace

그 후 .tmux.conf 파일에서 아래 설정을 추가해서 tmux가 실행될때 reattach-to-user-namespace 도 실행하도록 해줘야 한다.

set -g default-command "reattach-to-user-namespace -l zsh"

나는 zsh을 사용해서 위에 설정을 zsh로 해주었는데, 각자가 사용하는 shell에 맞게 변경해주면 된다.

TMUX & OS X Clipboard with vi key bindings

Tmux 2.4 버젼 이후로 tmux config 파일 문법이 크게 바뀌었다 (tmux를 만들어서 오픈소스로 배포한 tmux의 저자는 대단하다고 생각하지만, major 버젼이 아닌 minor 버젼 출시에 breaking change를 넣다니…) Tmux 2.4 이상의 버젼에서 vi key를 사용하여 copy를 하려면 아래와 같은 설정을 해주어야 한다.

setw -g mode-keys vi
unbind -Tcopy-mode-vi Enter
bind-key -T copy-mode-vi 'v' send -X begin-selection
bind-key -T copy-mode-vi 'V' send -X select-line
bind-key -T copy-mode-vi 'r' send -X rectangle-toggle
bind -Tcopy-mode-vi 'y' send -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy"

Linux 클립보드로 복사 및 붙이기 설정

먼저 vim --version 커맨드를 사용하여 +xterm_clipboard 옵션이 설정되어 있는지 확인하자. 만일 설정되어 있지 않다면 +xterm_clipboard 설정이 되어있는 vim을 설치해서 사용해야 한다. Ubuntu에서는 vim-gnome을 사용하면 된다.

sudo apt install vim-gnome

Mac OS 와 다르게 리눅스는 시스템 클립보드 이외에도 X11 카피 버퍼가 따로 있다(사실 linux가 정석이고 mac이 다른거다). 그리고 vim 의 + 레지스터는 시스템 클립보드와 연결되어 있고 * 레지스터는 X11와 연결되어 있다. 그래서 시스템으로 직접 복사할려면 +y 키를 사용해야 하고 X11로 복사 할려면 *y를 키를 사용해야 한다. 물론 매번 +* 키를 기억하여 사용하는것은 불편하다. 그럼으로 아래 설정으로 바꾸어주자.

set clipboard=unnamedplus

clipboard를 unnamedplus로 설정해주면 + 레지스터를 디포트로 사용하도록 한다. 위에서 이야기 한대로 + 레지스터는 시스템 클립보드와 연결되어 있음으로 기본 yp 커맨드를 사용하여 복사와 붙이기를 하면 CTRL+VCTRL+C를 사용하여 다른 프로그램에서 복사와 붙이기가 가능해진다. vim 버젼이 7.3이상이여야 위에 설정이 가능하므로 만일 복사와 붙이기가 제대로 안된다면 vim 버젼을 확인 하도록 하자.

자, 이제 tmux 카피 버퍼와 시스템 클립보드만 연결하면 된다. Mac에서는 reattach-to-user-namespace 를 사용했는데 리눅스에서는 xclip을 사용해야 한다.

먼저 xclip을 인스톨 하자.

sudo apt install xclip

인스톨 되면 .tmux.conf 파일에 아래 설정을 추가하자.

bind -t vi-copy y copy-pipe "xclip -sel clip -i"

그리고 tmux 세션을 종료하고 다시 시작하면 된다!