가장 흔한 Vim+tmux 프로젝트 배치는 워낙 한결같아서 거의 기본값 취급을 받아. window 세 개야. editor, server, shell. 가끔 네 번째로 logs가 붙고. window마다 pane은 그 작업이 얼마나 시끄러운지에 따라 한두 개, 많아야 세 개야. 일주일만 써보면 프로젝트를 갈아타는 게 세션 이름 바꾸는 정도의 일이 돼.
Window 1 — editor
전체 화면 Vim이거나, 같은 프로젝트 최상위에서 도는 Python REPL이나 터미널을 옆 pane에 둔 Vim이야. 실제 코드 작업은 Vim 안의 buffer와 split과 LSP가 다 해. 옆 pane은 코드 몇 줄을 보내보거나 (vim-slime 같은 걸로) 에디터에서 부르는 pytest path/to/test.py 같은 명령을 돌리는 데 써.
Window 2 — server
개발 서버 자리야. npm run dev, uvicorn app.main:app --reload, cargo watch, 스택이 뭘 돌리든. 보통 pane 하나면 되고, 서버가 자기 상태를 잘 안 보여주면 로그를 따라가는 pane을 옆에 하나 더 열어.
Window 3 — shell
범용 자리야. git 작업, 임시 스크립트, docker exec, psql, 뭐든. 한쪽에 lazygit이나 tig를 띄워두고 git을 대화형으로 다루는 사람도 많아.
Window 4 — logs (선택)
로그를 많이 뱉는 서비스를 다룬다면, 로그 파일에 tail -f를 걸거나 pod에 kubectl logs -f를 걸어둘 window를 따로 두는 게 좋아. 늘 열어두고, 뭔가 이상해 보일 때 그쪽으로 넘어가면 돼.
REPL 워크플로우
Vim에서 코드를 고치고, 고른 범위나 단락을 옆 tmux pane의 Python/Node/SQL REPL로 보내는 방식이야. 도와주는 도구들이 있어.
vim-slime — Vim에서 고른 걸 지정한 tmux pane으로 보내줘. 어떤 REPL에서든 통해.
vim-tmux-runner — slime이랑 비슷한데 "테스트 파일 보내기" 같은 명령이 처음부터 들어 있어.
iron.nvim — 언어를 아는 전송 명령을 갖춘 Lua 기반 REPL 연동.
Git 워크플로우
둘 다 좋은 방식이 있어.
Vim 안에서 gitsigns.nvim으로: gutter에서 바뀐 부분(hunk)을 보고, leader 키로 하나씩 stage 하거나 되돌리거나 미리 봐. "이 hunk는 넣고 저건 빼고" 같은 세밀한 작업에 최고야.
옆 pane의 lazygit으로: 자기 pane에서 도는 git TUI야. 브랜치 작업, commit 기록 훑기, "아무래도 rebase를 해야겠는데" 싶은 순간에 최고고.
손에 익은 사람들은 대개 둘 다 써. 서로 경쟁하는 게 아니라 빈자리를 메워주거든.
영구 개발 환경의 최종 형태
리모트 작업용 머신 (성능 좋은 데스크톱이든, 클라우드 VM이든, 데이터센터에 둔 서버든) 에 SSH로 들어가. 거기서 tmux를 띄우고, window 세 개짜리 배치를 한 번 잡아둬. 그다음부터는 이렇게 돼.
집에서는 노트북 터미널로 붙어서 일해.
카페에서는 태블릿으로 SSH로 붙고.
모임에서는 빌린 머신으로 SSH로 붙어.
매번 같은 세션이야. 같은 buffer, 같은 프로세스, 같은 스크롤백.
리모트를 기본으로 두는 개발 환경이 해자야. 일상 작업이 리모트 머신의 tmux 세션 안에서 일어나면, 앞에 놓인 기계가 뭐든 상관없어져. 노트북이든, 키보드 붙인 아이패드든, 친구 컴퓨터든 전부 진짜 작업 공간으로 가는 창일 뿐이야.
실제로 작업하는 프로젝트를 하나 골라. pippa-up.sh를 본으로 시작 스크립트를 쓰되 window 세 개짜리 배치로 잡아. lazy.nvim spec에 gitsigns.nvim을 넣고, 수정된 파일에서 확인해봐. ]c와 [c로 hunk 사이를 오가고, <leader>hp로 미리 보고, <leader>hs로 하나 stage 하는 것까지. 그다음 시작 스크립트를 프로젝트에 같이 commit 해두면, 나중의 내가 매일 아침 제자리에서 시작할 수 있어.
Progress
Progress is local-only — sign in to sync across devices.