본문 바로가기
C.W.K.
Stream
Lesson 01 of 03 · published

vim-tmux-navigator로 매끄러운 navigation

~12 min · vim, tmux, integration, plugins

Level 0갇힌 자
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

아무도 미리 안 알려주는 마찰

Vim에서 split을 Ctrl-h/j/k/l로 오가게 설정했어 (트랙 4). tmux에서 pane을 prefix + h/j/k/l로 오가게 설정했고 (트랙 6). 그런데 tmux 안에서 셸 pane 옆에 Vim split이 놓이는 순간, 손가락이 어느 쪽 규칙을 써야 할지 몰라 헤매. 시스템 둘, 머슬 메모리 둘, 그리고 경계를 넘을 때마다 걸리는 마찰이야.

해법: vim-tmux-navigator

christoomey/vim-tmux-navigator는 두 층 모두에서 Ctrl-h/j/k/l이 통하게 만들어주는 아주 작은 plugin이야. Vim에서 Ctrl-l을 누르면, 오른쪽에 split이 있으면 그리로 가고, 없으면 tmux가 오른쪽 pane으로 옮겨줘. 경계가 사라지는 거지.

어떻게 동작하냐면

절반씩 두 조각이야. Vim plugin 하나와 tmux config 조각 하나. tmux 쪽이 지금 포커스된 pane에서 Vim 프로세스가 도는지 확인해서, 그렇다면 Ctrl-h/j/k/l을 Vim으로 넘겨주고 Vim plugin이 받아 처리해. 아니면 tmux가 직접 select-pane을 돌리고. 영리하고, 튼튼하고, 조각도 1분이면 읽을 만큼 짧아.

양쪽 다 깔기

Vim plugin은 lazy.nvim으로 넣고, tmux 조각은 ~/.tmux.conf에 넣고 다시 읽히면 돼. 설정은 이게 전부야. 손에 붙고 나면 pane 사이를 오가는 게 마법처럼 느껴져.

통합은 층을 더하는 게 아니라 없애는 거야. vim-tmux-navigator가 없는 Vim+tmux는 끊임없이 서로를 번역하는 도구 두 개야. 얹고 나면 하나의 작업 공간으로 합쳐지고. 좋은 통합 plugin은 버튼을 더 주는 게 아니라 머리 쓸 일을 줄여줘.

한 가지 주의할 점

Vim을 알아보는 정규식이 프로세스 이름에 vim, nvim, view 같은 게 들어 있다고 가정해. 그래서 격리된 터미널이나 좀 특이한 프로세스 (fzf, lazygit) 에서는 헷갈릴 수 있어. plugin README에 예외를 덮어쓰는 방법이 나와 있고, 거의 모든 경우엔 아래 조각이 그냥 잘 돌아가.

Code

lazy.nvim plugin spec에 추가·lua
{
  "christoomey/vim-tmux-navigator",
  cmd = {
    "TmuxNavigateLeft", "TmuxNavigateDown",
    "TmuxNavigateUp",   "TmuxNavigateRight",
    "TmuxNavigatePrevious",
  },
  keys = {
    { "<C-h>", "<cmd>TmuxNavigateLeft<CR>",     desc = "Go to left split/pane" },
    { "<C-j>", "<cmd>TmuxNavigateDown<CR>",     desc = "Go to lower split/pane" },
    { "<C-k>", "<cmd>TmuxNavigateUp<CR>",       desc = "Go to upper split/pane" },
    { "<C-l>", "<cmd>TmuxNavigateRight<CR>",    desc = "Go to right split/pane" },
    { "<C-\\>", "<cmd>TmuxNavigatePrevious<CR>", desc = "Go to previous split/pane" },
  },
}
~/.tmux.conf에 추가 — 짝 스니펫·tmux
# vim-tmux-navigator — Ctrl-h/j/k/l 가 Vim 과 tmux 사이 가로지름
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
    | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|l?n?vim?x?|fzf)(diff)?$'"
bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h' 'select-pane -L'
bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j' 'select-pane -D'
bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k' 'select-pane -U'
bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l' 'select-pane -R'
bind-key -n 'C-\\' if-shell "$is_vim" 'send-keys C-\\' 'select-pane -l'

# Vim 의 copy-mode-vi 에서도 키 포워드
bind-key -T copy-mode-vi 'C-h' select-pane -L
bind-key -T copy-mode-vi 'C-j' select-pane -D
bind-key -T copy-mode-vi 'C-k' select-pane -U
bind-key -T copy-mode-vi 'C-l' select-pane -R
테스트 — 검증 루틴·text
1. tmux 안에서 pane 을 좌우로 나누기 (prefix + |).
2. 한 pane 에서 nvim 실행.
3. Vim 안에서 :vsp 로 다른 파일 열기 (Vim 내부 split 만들기).
4. Ctrl-h / Ctrl-l 반복해서 누르기.
   이렇게 걸어가야 함: 왼 tmux pane ←→ 왼 Vim split ←→
   오른 Vim split ←→ 오른 tmux pane.
5. 흐름이 끊기지 않음.  prefix 도 필요 없고, 층을 의식할 일도 없음.

External links

Exercise

vim-tmux-navigator (Vim plugin) 를 깔고 짝이 되는 tmux 조각을 넣어. 위 검증 루틴을 그대로 해봐. 처음 제대로 동작하는 순간을 잠깐 음미해 — 그게 이 트랙 전체의 목표야. 나중에 Ctrl-h/j/k/l이 층을 못 넘어가기 시작하면 정규식이 여전히 Vim 프로세스를 알아보는지 확인해봐 (드물지만 직접 빌드한 Vim이나 특이한 설치에서 이런 일이 생겨).

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.