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 을 Ctrl-h/j/k/l 로 split navigate 하게 설정 (트랙 4). tmux 를 prefix + h/j/k/l 로 pane navigate 하게 설정 (트랙 6). tmux 안에 셸 pane 옆에 Vim split 갖는 순간 손가락이 어떤 prefix 적용할지 몰라. 두 시스템, 두 머슬 메모리, 경계 가로지를 때마다 마찰.

해법: vim-tmux-navigator

christoomey/vim-tmux-navigator 가 두 레이어에서 Ctrl-h/j/k/l 매끄럽게 작동하게 하는 tiny 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 분에 읽기 충분히 짧아.

두 반 다 install

lazy.nvim 통해 Vim plugin 추가. tmux 스니펫을 ~/.tmux.conf 에 추가하고 reload. 그게 셋업 전체; 박히면 navigation 이 마법처럼 느껴져.

통합은 레이어를 제거하지, 추가하지 않아. vim-tmux-navigator 없는 Vim+tmux 는 끊임없이 번역하는 두 도구. 함께면 한 워크스페이스로 collapse. 최고의 통합 plugin 은 더 많은 버튼 주는 게 아니라 정신 부하 줄여.

Caveat

감지 regex 가 Vim 프로세스 이름이 vim, nvim, view 같은 거 포함한다고 가정. 일부 sandbox 된 터미널이나 특이한 프로세스 (fzf, lazygit) 가 헷갈릴 수 있어. Plugin 의 README 가 edge-case 오버라이드 커버. 99% 사용자에 아래 스니펫 그냥 작동.

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 안에서 세로 split 열기 (prefix + |).
2. 한 pane 에서 nvim 실행.
3. Vim 안에서 :vsp 다른 파일 (Vim 내부 split 갖게).
4. Ctrl-h / Ctrl-l 반복 누름.
   걸어가야 함: 왼 tmux pane ←→ 왼 Vim split ←→
   오른 Vim split ←→ 오른 tmux pane.
5. 순수 흐름.  Prefix 불필요, 레이어 생각 X.

External links

Exercise

vim-tmux-navigator (Vim plugin) install 하고 매칭 tmux 스니펫 추가. 위 검증 루틴 실행. 처음 작동할 때 잠깐 인지 — 그게 이 트랙 전체의 목표야. Ctrl-h/j/k/l 가 나중에 레이어 가로지르기 멈추면 regex 가 여전히 Vim 프로세스 인식하는지 체크 (드물지만 커스텀 빌드 경로로 일어나).

Progress

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

댓글 0

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

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