๐ sesh โ fzfยทzoxide๋ก ์ฆ์ tmux ์ธ์ ์ ํ (๋ถํธ์คํธ๋ํผ์์ ํผ์ปค๋ก)
sesh๋ ์ ์ธํ ์ธ์ ๋งค๋์ (smugยทtmuxp)์ ๋ค๋ฅธ ๋ฒ์ฃผ๋ค โ ๋ ์ด์์์ ๋ง๋๋ ๊ฒ ์๋๋ผ ๋๋ ํ ๋ฆฌยทgit repo์์ ์ธ์ ์ ์ฆ์์ผ๋ก ์ด๊ณ ์ ํํ๋ ํผ์ปค. ์ค์นยทprefix+T ๋ฐ์ธ๋ฉยทํต์ฌ CLI์, smug์์ ์ฎ๊ธฐ๋ฉฐ ๋ฐฐ์ด '๋ฒ์ฃผ ์ค์ ํ'๊น์ง.
sesh(session์ ์ถ์ฝ)๋ tmux ์ธ์
๋งค๋์ ์ง๋ง, smugยทtmuxp ๊ฐ์ ์ ์ธํ ๋ถํธ์คํธ๋ํผ์๋ ๋ค๋ฅธ ๋ฒ์ฃผ๋ค. ์ ๋ค์ด โ์ด๋ฐ ๋ ์ด์์์ ์ธ์
์ ๋ง๋ค์ด๋ผโ๋ผ๋ฉด, sesh๋ โ์ง๊ธ ์๋(๋๋ ํ์ํ) ์ธ์
์ผ๋ก ๋น ๋ฅด๊ฒ ๋์ด๊ฐ๋ผโ๋ค. fzf(fuzzy finder)์ zoxide(์์ฃผ ๊ฐ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ํ์ตํด ์ ํ)๋ฅผ ์ฎ์ด, ๋๋ ํ ๋ฆฌยทgit repo์์ ์ธ์
์ ์ฆ์์ผ๋ก ์ด๊ณ ์ ํํ๋ ๋ฐ ํนํ๋ผ ์๋ค.
์ด ๊ธ์ tmux ์ธ์ ๋ถํธ์คํธ๋ฉ ๊ธ์ด โ์ค์ฝํ ๋ฐ์ด์ง๋ง ๋ฐฉํฅ์ ์์๋ ๊ฒโ์ด๋ผ๋ฉฐ ์๊ณ ํ๋ ์จ๋๋งจ๋ ์ธ์ ์ค์์ฒ์ ๋ณธํธ์ด๋ค. ๊ณ ์ ๋ ์ด์์์ ์ ์ธํ๋ ๊ทธ ๊ธ๊ณผ ๋ชฉ์ ์ด ๋ค๋ฅด๋ค. ์ ์ฒด ํ์ต ์์๋ tmux ๋ก๋๋งต.
๋ ๋ฒ์ฃผ โ ๋ถํธ์คํธ๋ํผ vs ํผ์ปค
์ธ์ ์๋ํ๋ฅผ ์๊ธฐํ ๋ ํํ ํ ๋ฉ์ด๋ฆฌ๋ก ๋ฌถ์ง๋ง, ์ค์ ๋ชฉ์ ์ด ๋ค๋ฅธ ๋ ์ถ์ด๋ค.
| ย | ๋ถํธ์คํธ๋ํผ (smugยทtmuxpยทtmuxinator) | ํผ์ปค/์ค์์ฒ (sesh) |
|---|---|---|
| ํ๋ ์ผ | ์ธ์ ยท์๋์ฐยทํจ๋ ๋ ์ด์์์ ์ ์ธ โ ์์ฑ | ๋๋ ํ ๋ฆฌยท์ธ์ ์ฌ์ด๋ฅผ ์ฆ์ ์ ํ |
| ์ ๋ ฅ | YAML config (ํ์ผ ํ๋ = ์ธ์ ํ๋) | fzf ๋ชฉ๋ก์์ ๊ณ ๋ฅด๊ธฐ (config ์์ด๋ ๋จ) |
| ๋ํ ๋์ | smug start dev โ 3-pane ๋ ์ด์์ ๋ถํ
| prefix+T โ ํด๋ ๊ณ ๋ฅด๋ฉด ๊ทธ ์ธ์
์ผ๋ก ์ ํ |
| ๊ฐ์ | ๋ณต์กํ ๋ค์ค ํจ๋ ๋ฐฐ์น์ ์ฌํ | ํ๋ก์ ํธ ์์ญ ๊ฐ๋ฅผ ์ค๊ฐ ๋์ ์๋ |
๋์ ๊ฒฝ์์ด ์๋๋ผ ์ํธ ๋ณด์์ด๋ค. โ์ ํด์ง ๋ ์ด์์์ ๋ฐ๋ณต ๋ก๋โ๊ฐ ํ์ํ๋ฉด ๋ถํธ์คํธ๋ํผ, โ์ฌ๋ฌ ํ๋ก์ ํธ๋ฅผ ๋น ๋ฅด๊ฒ ์๋ณตโ์ด ํ์ํ๋ฉด ํผ์ปค๋ค. sesh๋ ์ฌ์ง์ด ์ ์ธํ์ด ํ์ํ ์ธ์ ์ tmuxp/tmuxinator ์คํฌ๋ฆฝํธ์ ์์ํ ์๋ ์์ด์, ํผ์ปค๋ฅผ ์๋จ์ ๋๊ณ ๋ค์ ๋ถํธ์คํธ๋ํผ๋ฅผ ๋ถ์ด๋ ์กฐํฉ๋ ๋๋ค.
์ค์น + tmux ๋ฐ์ธ๋ฉ
Homebrew ํ ์ค์ด๋ฉด ๋๋๋ค. sesh๋ Go ๋จ์ผ ๋ฐ์ด๋๋ฆฌ๋ผ ๋ฐํ์ ์์กด์ด ์๋ค.
1
brew install sesh
ํต์ฌ ์์กด์ fzf(ํผ์ปค UI)์ zoxide(๋๋ ํ ๋ฆฌ ์ ํ)๋ค. ๋ ๋ค ์ด๋ฏธ ๊น๋ ค ์๋ค๋ฉด sesh๋ ๋ฐ๋ก ํ ๊ธฐ๋ฅ์ผ๋ก ๋๋ค. ํผ์ปค๋ฅผ ํ์
์ผ๋ก ๋์ฐ๋ ค๋ฉด fzf์ ๋ธ๋ ค ์ค๋ fzf-tmux, ๋๋ ํ ๋ฆฌ ๊ฒ์ ์์ค์ fd๊ฐ ์ฐ์ธ๋ค.
sesh์ ์ผ์์ ์ฌ์ค์ tmux ํค ํ๋๋ก ์๋ ดํ๋ค. ~/.tmux.conf(๋๋ Oh my tmux! ์ฌ์ฉ์๋ .tmux.conf.local)์ ํผ์ปค๋ฅผ prefix + T์ ๋ฐ์ธ๋ฉํ๋ค.
# sesh session picker โ prefix+T; ํ์
์: ^a ์ ์ฒด ^t tmux ^g ์ค์ ^x zoxide ^f ๋๋ ํ ๋ฆฌ, ^d kill
bind-key T run-shell "sesh connect \"$(
sesh list --icons | fzf-tmux -p 80%,70% \
--no-sort --ansi --border-label ' sesh ' --prompt 'โก ' \
--header ' ^a all ^t tmux ^g configs ^x zoxide ^d kill ^f find' \
--bind 'tab:down,btab:up' \
--bind 'ctrl-a:change-prompt(โก )+reload(sesh list --icons)' \
--bind 'ctrl-t:change-prompt(๐ช )+reload(sesh list -t --icons)' \
--bind 'ctrl-g:change-prompt(โ๏ธ )+reload(sesh list -c --icons)' \
--bind 'ctrl-x:change-prompt(๐ )+reload(sesh list -z --icons)' \
--bind 'ctrl-f:change-prompt(๐ )+reload(fd -H -d 2 -t d -E .Trash . ~)' \
--bind 'ctrl-d:execute(tmux kill-session -t {2..})+change-prompt(โก )+reload(sesh list --icons)' \
--preview-window 'right:55%' \
--preview 'sesh preview {}'
)\""
prefix+T๋ฅผ ๋๋ฅด๋ฉด ํ์
์ด ๋จ๊ณ , ํ์
์์์ ์์ค๋ฅผ ์ ํํ๋ค โ ^a ์ ์ฒด, ^t ์ด๋ ค ์๋ tmux ์ธ์
, ^g sesh ์ค์ ์ธ์
, ^x zoxide ๋๋ ํ ๋ฆฌ, ^f fd๋ก ํ ์๋ ๋๋ ํ ๋ฆฌ ๊ฒ์, ^d๋ก ์ธ์
kill. ๊ณ ๋ฅด๋ฉด ๊ทธ ํด๋๋ก ์ธ์
์ ๋ง๋ค๊ฑฐ๋(์์ผ๋ฉด) ์ ํํ๋ค(์์ผ๋ฉด).
tmux ์ค์ ์์
$(...)๋ ์ด์ค์ผ์ดํํ์ง ๋ง ๊ฒ.run-shell์ด ๋ฌธ์์ด์/bin/sh์ ๋๊ฒจ ๊ฑฐ๊ธฐ์ ํ๊ฐํ๋ฏ๋ก\$(๋ก ์ฐ๋ฉด ๊นจ์ง๋ค. ๋ ์ด ์ค๋ํซ์ chezmoi ๊ฐ์ ํ ํ๋ฆฟ ๋๊ตฌ๋ก ๊ด๋ฆฌํ๋ค๋ฉด,{2..}ยท$()๊ฐ ํ ํ๋ฆฟ ๋ฌธ๋ฒ๊ณผ ์ถฉ๋ํ์ง ์๋๋ก ํด๋น ํ์ผ์ ํ ํ๋ฆฟ(.tmpl) ๋ฐ์ ๋๋ ๊ฒ ์์ ํ๋ค.
์์ฃผ ์ฐ๋ CLI
ํผ์ปค๊ฐ 90%์ง๋ง, ํฐ๋ฏธ๋์์ ์ง์ ๋ถ๋ฅด๋ ๋ช ๋ น ๋ช ๊ฐ๊ฐ ์์ ๋ถ์ผ๋ฉด ๋ ๋น ๋ฅด๋ค.
1
2
3
4
5
sesh connect <์ด๋ฆ/๊ฒฝ๋ก> # ์ธ์
์ ์ฐ๊ฒฐ(์์ผ๋ฉด ์์ฑ). ๋ถ๋ถ ๊ฒฝ๋ก๋ ๋จน์
sesh last # ์ง์ ์ธ์
์ผ๋ก ํ ๊ธ โ ๋ ํ๋ก์ ํธ ์๋ณต์ ์ต๊ณ
sesh clone <git-url> # repo ํด๋ก + ๊ทธ ์ธ์
์ผ๋ก ๋ฐ๋ก ์ง์
sesh list # ์ธ์
๋ชฉ๋ก (-t tmux๋ง, -z zoxide, -c ์ค์ ๋ ๊ฒ)
sesh connect -c "<๋ช
๋ น>" <๊ฒฝ๋ก> # ์ ์ธ์
์ด๋ฉฐ ๋ช
๋ น ์คํ(๊ธฐ์กด ์ธ์
์ด๋ฉด ๋ฌด์)
ํนํ sesh last๋ tmux ์์ฒด์ โ์ด์ ์ธ์
(prefix + L)โ๊ณผ ๋น์ทํ์ง๋ง, sesh๊ฐ ๋ง๋ ๋๋ ํ ๋ฆฌ ๊ธฐ๋ฐ ์ธ์
๊น์ง ํฌํจํด ํ ๊ธํ๋ค. ํ๋ก์ ํธ ๋ ๊ฐ๋ฅผ ๋ถ์ก๊ณ ์ค๊ฐ ๋ ์ฒด๊ฐ์ด ํฌ๋ค.
์ค์ ํ์ผ์ ์ ํ์ด๋ค
์ฌ๊ธฐ์ ๋ถํธ์คํธ๋ํผ์์ ์ฐจ์ด๊ฐ ๋ค์ ๋๋ฌ๋๋ค. sesh๋ config ํ์ผ ์์ด๋ ์์ ํ ๋์ํ๋ค. ๋๋ ํ ๋ฆฌยทzoxideยท์ด๋ฆฐ tmux ์ธ์ ์ ์์ค๋ก ์ผ์ ํผ์ปค๊ฐ ์ฑ์์ง๊ธฐ ๋๋ฌธ์ด๋ค. smug์ฒ๋ผ โconfig๋ฅผ ๋จผ์ ์จ์ผ ์ธ ์ ์๋โ ๋๊ตฌ๊ฐ ์๋๋ค.
~/.config/sesh/sesh.toml์ ์๋๊ฐ ํ์ํด์ง ๋ ๋์
ํ๋ฉด ๋๋ค.
1
2
3
4
5
6
7
8
9
# ์ด๋ฆ ๋ถ์ ์ธ์
+ ์ธ์
๋ณ ์์ ๋ช
๋ น
[[session]]
name = "dotfiles"
path = "~/dotfiles"
startup_command = "nvim ."
# ํผ์ปค์์ ํน์ ๋๋ ํ ๋ฆฌ ์จ๊ธฐ๊ธฐ
[blacklist]
paths = ["~/Downloads"]
์ฆ ํ์๊ฐ ์๊ธด ๋ค์ ์ค์ ์ ๋ถ์ด๋ ๋ฐฉํฅ์ด๋ค. ์ฒ์๋ถํฐ ์ธ์ ์ ๋ค ์ ์ธํด๋๋ ๋ถํธ์คํธ๋ํผ์ ์ ๋ฐ๋์ ์ํฌํ๋ก๋ค.
smug์์ ์ฎ๊ธด ์ด์ โ ๋ฒ์ฃผ๋ฅผ ์๋ชป ๊ณจ๋์๋ค
๋ด๊ฐ ์๋ ์ฐ๋ smug config๋ ์ด๊ฒ ์ ๋ถ์๋ค.
1
2
3
4
5
6
7
8
# ~/.config/smug/dev.yml
session: dev
root: ~/
windows:
- name: dev
layout: even-horizontal
commands:
- claude # ์ผ์ชฝ pane์์ ์๋ ์คํ
์ข์ฐ๋ก ๋๋๊ณ ์ผ์ชฝ์์ ๋ช ๋ น ํ๋ ์คํ โ ์ด๊ฑด ๋ ์ด์์์ ์ฌํํ๋ ๋ถํธ์คํธ๋ฉ์ด ์๋๋ผ, ๊ทธ๋ฅ โ๊ทธ ํด๋๋ก ์ธ์ ํ๋ ์ฌ๋โ ์ ํ์ ๊ฐ๊น์ ๋ค. smug์ ์ง์ง ๊ฐ์ (๋ณต์กํ ๋ค์ค ํจ๋ ๋ฐฐ์น๋ฅผ layout ๋ฌธ์์ด๊น์ง ์จ์ ๊ณ ์ ํ๋ ๊ฒ)์ ํ๋๋ ์ ์ฐ๊ณ ์์๋ ์ ์ด๋ค. ๋๊ตฌ๋ฅผ ๋ฒ์ฃผ๋ถํฐ ์๋ชป ๊ณ ๋ฅธ ๊ฒ์ด๋ค.
๊ทธ๋์ sesh๋ก ์ฎ๊ธฐ๋ฉด์ ์ด config๋ ๋ฒ๋ ธ๋ค. pane ๋ถํ ๊ณผ ๋ช
๋ น ์๋ ์คํ์ด๋ผ๋ โ๋ ์ด์์โ์ ์ฌ๋ผ์ง์ง๋ง, ์ ์ด์ ๋ด๊ฐ ์ํ ๊ฑด ๋ ์ด์์์ด ์๋๋ผ ๋น ๋ฅธ ์ธ์
์ ํ์ด์์ผ๋ ์ํด๊ฐ ์๋๋ผ ์ ๋ฆฌ๋ค. ๋ช
๋ น ์๋ ์คํ์ด ํน์ ํด๋์๋ง ๋ค์ ํ์ํด์ง๋ฉด ๊ทธ๋ sesh.toml์ startup_command ํ ์ค์ด๋ sesh connect -c๋ก ๋์ด๋ฆฌ๋ฉด ๋๋ค โ YAML์ ๋ฏธ๋ฆฌ ์ ์งํ ์ด์ ๊ฐ ์๋ค.
๊ตํ์ ๋๊ตฌ ๋น๊ตํ๋ณด๋ค ๋ฒ์ฃผ ์ ํ์ด ๋จผ์ ๋ผ๋ ๊ฒ์ด๋ค. โ์ธ์ ๋งค๋์ ๋ญ ์ฐ์งโ์ ๋ต์ smug๋ tmuxp๋ ์ด์ ์, ๋ ์ด์์์ ์ ์ธํ๊ณ ์ถ์๊ฐ(๋ถํธ์คํธ๋ํผ) vs ์ธ์ ์ ๋น ๋ฅด๊ฒ ์ค๊ฐ๊ณ ์ถ์๊ฐ(ํผ์ปค)๋ฅผ ๋จผ์ ๊ฐ๋ฅด๋ ๋ฐ ์๋ค.
์ ๋ฆฌ
- sesh๋ ์ ์ธํ ๋ถํธ์คํธ๋ํผ๊ฐ ์๋๋ผ fzfยทzoxide ๊ธฐ๋ฐ ํผ์ปค/์ค์์ฒ๋ค. ๋ค๋ฅธ ์ถ์ด๊ณ , ๋ถํธ์คํธ๋ํผ์ ๋ณํ๋ ๋๋ค.
- ์ผ์์
prefix + Tํ๋. CLI๋connect/last/clone์ ๋๋ฉด ์ถฉ๋ถํ๋ค. - config๋ ์ ํ โ ์์ด๋ ๋๊ณ , ์ด๋ฆ ์ธ์
ยท์์ ๋ช
๋ นยทblacklist๊ฐ ํ์ํด์ง๋ฉด ๊ทธ๋
sesh.toml์ ๋ถ์ธ๋ค. - โ์ธ์ ๋งค๋์ ๋ญ ์ฐ์งโ๋ณด๋ค โ๋ถํธ์คํธ๋ฉ์ด ํ์ํ๊ฐ, ์ ํ๊ฐ ํ์ํ๊ฐโ๋ฅผ ๋จผ์ ๋ฌผ์ด๋ผ. ๋ฒ์ฃผ๊ฐ ๋ง์์ผ ๋๊ตฌ ๋น๊ต๊ฐ ์๋ฏธ ์๋ค.
๋ฐ๋ ๋ฒ์ฃผ โ ๋ณต์กํ ๋ค์ค ํจ๋ ๋ ์ด์์์ ์ ์ธํด ์ฌํํ๋ ์ชฝ์ smug ์ฌํ ๊ธ๊ณผ ์ธ์ ๋ถํธ์คํธ๋ฉ์์. ์ธ ๋๊ตฌ(smugยทtmuxpยทtmuxinator) ๋น๊ต์ ์กฐ๊ฑด๋ถ ์์๋ ๊ทธ ๊ธ์ ์๋ค.