C.W.K.
Stream
Lesson 02 of 03 · published

프로젝트 레이아웃과 진짜 워크플로우

~15 min · vim, tmux, workflow, remote-development

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

한 프로젝트, 세 window, 평생 리듬

가장 흔한 Vim+tmux 프로젝트 레이아웃이 일관돼서 거의 기본이야. 세 window: editor, server, shell. 가끔 네 번째: logs. 각 window 가 작업이 얼마나 chatty 한지에 따라 1–3 pane. 일주일 쓰면 프로젝트 전환이 그냥 세션 이름 바꾸는 거.

Window 1 — editor

풀스크린 Vim, 또는 같은 프로젝트 root 의 Python REPL / 터미널을 위한 사이드 pane 과 함께 Vim. Vim 안에 buffer + split + LSP 가 실제 코드 작업. 오른쪽 pane 은 코드 라인 보내기 (vim-slime 또는 비슷한 거로) 또는 에디터에서 발동시키는 pytest path/to/test.py 같은 명령 실행용.

Window 2 — server

Dev 서버. npm run dev, uvicorn app.main:app --reload, cargo watch, 스택이 실행하는 뭐든. 보통 한 pane. 가끔 서버가 자체로 안 보이면 로그 tail 과 함께 split.

Window 3 — shell

범용. Git operation, 임시 스크립트, docker exec, psql, 뭐든. 종종 한쪽에 lazygit 또는 tig 와 split 해서 대화형 git 작업.

Window 4 — logs (옵션)

많은 로그 출력 만드는 서비스에 대해, 로그 파일에 tail -f 또는 pod 에 kubectl logs -f 위한 window 전용. 항상 열어둠; 뭔가 이상해 보이면 그쪽으로 flip.

REPL 워크플로우

Vim 에서 코드 편집; 인접 tmux pane 의 Python/Node/SQL REPL 에 영역이나 단락 보냄. 자동화 도구:

  • vim-slime — Vim 선택을 타깃 tmux pane 에 보냄. 어떤 REPL 에든 작동.
  • vim-tmux-runner — slime 같지만 "테스트 파일 보내기" 명령이 first-class.
  • iron.nvim — 언어 인식 send 명령 가진 Lua-native REPL 통합.

Git 워크플로우

똑같이 좋은 두 패턴:

  • gitsigns.nvim 으로 Vim 안에서: gutter 에 hunk 보고, leader 바인딩으로 hunk stage / reset / preview. 미세한 "이 hunk 응, 저 hunk 안 됨" 작업에 최고.
  • 인접 pane 에 lazygit: 자체 pane 의 TUI git 클라이언트. 브랜치 operation, commit 히스토리 브라우징, "사실 interactive-rebase 원해" 순간에 최고.

대부분 숙련자가 둘 다 써. 패턴이 보완적이지 경쟁적 X.

영구 dev 환경 endgame

리모트 워크스테이션 (강력한 데스크톱, 클라우드 VM, colocate 된 서버) 에 SSH. 거기서 tmux 시작. 세 window 레이아웃 한 번 셋업. 이제부터:

  • 집에서 노트북 터미널로 작업.
  • 커피숍에서 태블릿으로 SSH.
  • 밋업에서 빌린 머신으로 SSH.
  • 매번 같은 세션 — 같은 buffer, 같은 프로세스, 같은 스크롤백.
리모트-퍼스트 dev 환경이 해자야. 일상 작업이 리모트 워크스테이션의 tmux 세션 안에서 일어나면, 앞에 앉은 디바이스가 중요해지지 않아. 노트북, 키보드 있는 iPad, 친구 머신 — 다 진짜 워크스페이스로 가는 thin 클라이언트야.

Code

Three-window 프로젝트 스크립트 — 빠른 변형·bash
#!/usr/bin/env bash
# pippa-up.sh — cwk-pippa 워크스페이스 열기
set -e

S="pippa"
D="$HOME/projects/cwkPippa"

tmux has-session -t $S 2>/dev/null && exec tmux attach -t $S

tmux new -d -s $S -c $D -n editor
tmux send-keys -t $S:editor 'nvim .' C-m

tmux new-window -t $S -n server -c $D
tmux send-keys -t $S:server 'pippa serve' C-m

tmux new-window -t $S -n shell -c $D
tmux split-window -h -t $S:shell -c $D
tmux send-keys -t $S:shell.0 'lazygit' C-m

tmux select-window -t $S:editor
exec tmux attach -t $S
vim-slime — Vim 영역을 tmux pane 에 보냄·lua
-- lazy.nvim spec 에서
{
  "jpalardy/vim-slime",
  init = function()
    vim.g.slime_target = "tmux"
    vim.g.slime_default_config = {
      socket_name = "default",
      target_pane = "{last}",   -- 현재 window 의 last-active pane 에 보냄
    }
    vim.g.slime_dont_ask_default = 1
  end,
}
gitsigns.nvim — gutter 의 git hunk·lua
{
  "lewis6991/gitsigns.nvim",
  event = { "BufReadPost", "BufNewFile" },
  opts = {
    signs = {
      add          = { text = "┃" },
      change       = { text = "┃" },
      delete       = { text = "_" },
      topdelete    = { text = "‾" },
      changedelete = { text = "~" },
    },
    on_attach = function(bufnr)
      local gs = package.loaded.gitsigns
      local map = function(mode, lhs, rhs, desc)
        vim.keymap.set(mode, lhs, rhs, { buffer = bufnr, desc = desc })
      end
      map("n", "]c", gs.next_hunk,            "Next git hunk")
      map("n", "[c", gs.prev_hunk,            "Prev git hunk")
      map("n", "<leader>hs", gs.stage_hunk,   "Stage hunk")
      map("n", "<leader>hr", gs.reset_hunk,   "Reset hunk")
      map("n", "<leader>hp", gs.preview_hunk, "Preview hunk")
      map("n", "<leader>hb", function() gs.blame_line({ full = true }) end, "Blame line")
    end,
  },
}

External links

Exercise

실제 작업하는 프로젝트 하나. pippa-up.sh 모델로 시작 스크립트 작성, 세 window 레이아웃과 함께. lazy.nvim spec 에 gitsigns.nvim 추가. 수정된 파일에서 검증: ]c[c 가 hunk 사이 점프; <leader>hp 가 hunk 미리보기; <leader>hs 가 stage. 그 다음 시작 스크립트를 프로젝트와 함께 commit 해서 미래의 너가 매 아침 옳은 상태에서 시작.

Progress

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

댓글 0

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

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