ํฌ์ŠคํŠธ

๐Ÿงฉ tmux ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋‚˜ โ€” CLI๊ฐ€ ๊ณง API

tmux ํ”Œ๋Ÿฌ๊ทธ์ธ์—” ๋Ÿฐํƒ€์ž„๋„ SDK๋„ ์—†๋‹ค. TPM์ด ์‹คํ–‰ํ•˜๋Š” .tmux ์…ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ tmux CLI๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒŒ ์ „๋ถ€. ์ง„์ž… ์Šคํฌ๋ฆฝํŠธ ๊ตฌ์กฐยท์„ค์ •ํ˜•/์ƒํ˜ธ์ž‘์šฉํ˜•ยทhooksยท๋ฐฐํฌ๊นŒ์ง€.

๐Ÿงฉ tmux ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋‚˜ โ€” CLI๊ฐ€ ๊ณง API

์ด ๊ธ€์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง์ ‘ ๋งŒ๋“œ๋Š” ๋ฒ•์ด๋‹ค. ๊ธฐ์กด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์“ฐ๋Š” ๋ฒ•(TPM์œผ๋กœ sensibleยทresurrectยทthemepack ์„ค์น˜ยท์„ค์ •)์€ tmux ์„ค์ • & ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค๋ช…์—, ์ž…๋ฌธ๋ถ€ํ„ฐ ์ž๋™ํ™”๊นŒ์ง€ ์ „์ฒด ๊ฒฝ๋กœ๋Š” tmux ๋กœ๋“œ๋งต์— ์žˆ๋‹ค.

ํ•ต์‹ฌ ํ•œ ์ค„

tmux ํ”Œ๋Ÿฌ๊ทธ์ธ์—” ๋Ÿฐํƒ€์ž„๋„ SDK๋„ ์—†๋‹ค. โ€œํ”Œ๋Ÿฌ๊ทธ์ธโ€์ด๋ž€ ๊ฑด ์‚ฌ์‹ค tmux CLI(๋ช…๋ น์ค„)๋ฅผ ๋Œ€์‹  ํ˜ธ์ถœํ•ด ์ฃผ๋Š” ์…ธ ์Šคํฌ๋ฆฝํŠธ + ๊ทธ๊ฑธ ๋‹ด์€ git ์ €์žฅ์†Œ์ผ ๋ฟ์ด๋‹ค. tmux ์ž์‹ ์€ โ€œํ”Œ๋Ÿฌ๊ทธ์ธโ€์ด๋ผ๋Š” ๊ฐœ๋…์กฐ์ฐจ ๋ชจ๋ฅธ๋‹ค โ€” ์ด ์ƒํƒœ๊ณ„๋Š” ์ „๋ถ€ TPM(Tmux Plugin Manager, tmux ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ด€๋ฆฌ์ž) ์ด๋ผ๋Š” ๊ด€๋ก€ ์œ„์— ์–นํ˜€ ์žˆ๋‹ค.

์ด ์‚ฌ์‹ค์„ ์•Œ๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ์ž‘์ด โ€œ์ƒˆ๋กœ์šด ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐฐ์šฐ๊ธฐโ€๊ฐ€ ์•„๋‹ˆ๋ผ man tmux์˜ ๋ช…๋ น์„ ์…ธ์—์„œ ์ž˜ ๋ถ€๋ฆฌ๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ”๋€๋‹ค.

๋™์ž‘ ์‚ฌ์Šฌ

.tmux.conf ๋งจ ์•„๋ž˜ ํ•œ ์ค„์—์„œ ์‹œ์ž‘ํ•œ๋‹ค.

1
run '~/.tmux/plugins/tpm/tpm'

์ด ์ค„์ด TPM์„ ๋ถ€ํŠธ์ŠคํŠธ๋žฉํ•˜๊ณ , ๊ทธ๋‹ค์Œ์€ ์ด๋ ‡๊ฒŒ ํ๋ฅธ๋‹ค.

1
2
3
4
5
6
7
8
9
run '~/.tmux/plugins/tpm/tpm'
      โ”‚
      โ–ผ
TPM ์ด ~/.tmux/plugins/ ์•ˆ์˜ ๊ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ํด๋”์—์„œ
  *.tmux ํŒŒ์ผ์„ ์ฐพ์•„ "์‹คํ–‰ ํŒŒ์ผ๋กœ" ๋Œ๋ฆฐ๋‹ค  (๋‚ด๋ถ€์ ์œผ๋กœ run-shell)
      โ”‚
      โ–ผ
๊ทธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€  tmux set-option / tmux bind-key / tmux source-file  ๊ฐ™์€
  CLI ๋ช…๋ น์œผ๋กœ "์‹คํ–‰ ์ค‘์ธ tmux ์„œ๋ฒ„"๋ฅผ ์„ค์ •ํ•œ๋‹ค

์ฆ‰ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•˜๋Š” ์ผ์€ ๋‹น์‹ ์ด ์†์œผ๋กœ ์น  tmux ... ๋ช…๋ น์„ ๋Œ€์‹  ์ณ ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. bind-key, set-option, display-popup, set-hook, run-shell โ€” ์ด ์ปค๋งจ๋“œ๋“ค์ด ๊ณง ํ”Œ๋Ÿฌ๊ทธ์ธ API๋‹ค.

์ตœ์†Œ ๊ตฌ์กฐ

ํ”Œ๋Ÿฌ๊ทธ์ธ ํ•˜๋‚˜ = ํด๋” + <์ด๋ฆ„>.tmux ์ง„์ž… ์Šคํฌ๋ฆฝํŠธ ํ•˜๋‚˜. ์ด๊ฒŒ ์ „๋ถ€๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env bash
# my-plugin.tmux โ€” TPM์ด ์ด ํŒŒ์ผ์„ ์‹คํ–‰ ํŒŒ์ผ๋กœ ๋Œ๋ฆฐ๋‹ค

# 1) ์ž๊ธฐ ์œ„์น˜ ํŒŒ์•… (ํ—ฌํผ ์Šคํฌ๋ฆฝํŠธ๋ฅผ sourcing ํ•˜๋ ค๊ณ )
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# 2) ์‚ฌ์šฉ์ž ์„ค์ • ์ฝ๊ธฐ
#    ์‚ฌ์šฉ์ž๊ฐ€ .tmux.conf ์— `set -g @foo 'bar'` ๋กœ ์ค€ ๊ฐ’์„ ์ฝ์–ด์˜จ๋‹ค
get_opt() { tmux show-option -gqv "$1"; }   # -g ์ „์—ญ  -q ์กฐ์šฉํžˆ(์—†์–ด๋„ ์—๋ŸฌX)  -v ๊ฐ’๋งŒ

# 3) ์‹ค์ œ ๋™์ž‘: tmux CLI ํ˜ธ์ถœ๋กœ ์„œ๋ฒ„๋ฅผ ์„ค์ •
tmux bind-key C-g display-popup -E "echo hello"   # ํ‚ค ๋ฐ”์ธ๋”ฉ ์ถ”๊ฐ€
tmux set-option -g status-right "custom"          # ์˜ต์…˜ ์„ค์ •

ํŒŒ์ผ์— ์‹คํ–‰ ๊ถŒํ•œ(chmod +x my-plugin.tmux)์„ ์ฃผ๋Š” ๊ฒƒ๋งŒ ์žŠ์ง€ ๋ง์ž. TPM์ด ์‹คํ–‰ ํŒŒ์ผ๋กœ ๋Œ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์‹ค์ฆ: themepack

์œ ๋ช…ํ•œ tmux-themepack๋„ ์ •ํ™•ํžˆ ์ด ํŒจํ„ด์ด๋‹ค. ์ง„์ž… ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•˜๋Š” ์ผ์€ ๋”ฑ ๋‘ ๊ฐ€์ง€ โ€” ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ํ…Œ๋งˆ ์ด๋ฆ„์„ ์ฝ๊ณ , ํ•ด๋‹น ํ…Œ๋งˆ ํŒŒ์ผ์„ source-file๋กœ ๋กœ๋“œํ•œ๋‹ค.

1
2
3
4
5
# themepack.tmux (์š”์•ฝ)
main() {
  theme="$(get-tmux-option "@themepack" "basic")"   # @themepack ๊ฐ’ ์ฝ๊ธฐ
  tmux source-file "$CURRENT_DIR/powerline/${theme}.tmuxtheme"
}

๊ทธ๋ฆฌ๊ณ  ๊ทธ .tmuxtheme ํŒŒ์ผ์€ set -g status-left ..., set -g message-style ... ๊ฐ™์€ set ๋ช…๋ น ์ˆ˜๋ฐฑ ์ค„์ผ ๋ฟ์ด๋‹ค. โ€œํ…Œ๋งˆ ํ”Œ๋Ÿฌ๊ทธ์ธโ€์˜ ์ •์ฒด๊ฐ€ ๊ฒฐ๊ตญ ์…ธ์ด ๋Œ€์‹  ์ณ ์ฃผ๋Š” set ๋ช…๋ น ๋ฌถ์Œ์ด๋ผ๋Š” ๊ฒƒ โ€” ๊ทธ๋ž˜์„œ ํ…Œ๋งˆ์˜ ๋ฒ„๊ทธ ํ•˜๋‚˜๊ฐ€ ์‹ค์€ set ํ•œ ์ค„์˜ ๋ฌธ์ œ๋กœ ํ™˜์›๋˜๊ธฐ๋„ ํ•œ๋‹ค.1

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํฌ๊ฒŒ ๋‘ ์ข…๋ฅ˜

์ข…๋ฅ˜๋กœ๋“œ ์‹œ์  ๋™์ž‘์˜ˆ์‹œ
์„ค์ •ํ˜•๋กœ๋“œํ•  ๋•Œ set/bind๋งŒ ํ•˜๊ณ  ๋ (์ผํšŒ์„ฑ)themepack, tmux-sensible
์ƒํ˜ธ์ž‘์šฉํ˜•ํ‚ค์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉ โ†’ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ์‹คํ–‰tmux-resurrect, tmux-continuum, fzf ๋ฉ”๋‰ด๋ฅ˜

์„ค์ •ํ˜•์€ ์œ„ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋กœ๋“œ ์‹œ ์˜ต์…˜ยท๋ฐ”์ธ๋”ฉ๋งŒ ๊ฑธ๊ณ  ๋๋‚œ๋‹ค.

์ƒํ˜ธ์ž‘์šฉํ˜•์€ bind-key๋กœ ํ‚ค๋ฅผ ์žก๊ณ , ๊ทธ ํ‚ค๊ฐ€ ๋ˆŒ๋ฆฌ๋ฉด display-popup(ํŒ์—… ์ฐฝ)ยทdisplay-menu(๋ฉ”๋‰ด)ยทcommand-prompt(์ž…๋ ฅ ํ”„๋กฌํ”„ํŠธ)ยทrun-shell(์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰) ๊ฐ™์€ ๋ช…๋ น์œผ๋กœ ์‹ค์ œ ์ž‘์—…์„ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด tmux-continuum์€ ์ƒํƒœ๋ฐ”์— #(save-script.sh)๋ฅผ ์‹ฌ์–ด, ์ƒํƒœ๋ฐ”๊ฐ€ ๊ฐฑ์‹ ๋  ๋•Œ๋งˆ๋‹ค ์ €์žฅ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋Œ๋ฆฌ๋Š” ์‹์œผ๋กœ โ€œ์ž๋™ ์ €์žฅโ€์„ ๊ตฌํ˜„ํ•œ๋‹ค.

1
2
3
# ์ƒํ˜ธ์ž‘์šฉํ˜• ์˜ˆ: prefix + G ๋กœ ์„ธ์…˜ ๋ชฉ๋ก์„ fzf ํŒ์—…์— ๋„์šฐ๊ธฐ
tmux bind-key G display-popup -E \
  "tmux list-sessions -F '#S' | fzf --reverse | xargs -r tmux switch-client -t"

์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•˜๋ ค๋ฉด: hooks

๋กœ๋“œ ์‹œ์  ๋ง๊ณ  โ€œ์ƒˆ ์ฐฝ์ด ์ƒ๊ฒผ์„ ๋•Œโ€, โ€œํŒฌ์— ํฌ์ปค์Šค๊ฐ€ ๊ฐ”์„ ๋•Œโ€ ๊ฐ™์€ ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•˜๋ ค๋ฉด set-hook์„ ์“ด๋‹ค.

1
tmux set-hook -g after-new-window 'run-shell "~/.tmux/plugins/my-plugin/on-new-window.sh"'

after-new-window, pane-focus-in, client-attached ๋“ฑ tmux๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ›… ์ข…๋ฅ˜๋Š” man tmux์˜ HOOKS ์ ˆ์— ์ •๋ฆฌ๋ผ ์žˆ๋‹ค.

๋งŒ๋“ค์–ด์„œ ๋ฐฐํฌํ•˜๊ธฐ

  1. ~/dev/my-plugin/my-plugin.tmux ์ž‘์„ฑ ํ›„ chmod +x.
  2. ๋กœ์ปฌ ํ…Œ์ŠคํŠธ โ€” ์ €์žฅ์†Œ๋กœ ์˜ฌ๋ฆฌ๊ธฐ ์ „์—, .tmux.conf์— ์•„๋ž˜ ํ•œ ์ค„๋กœ ์ง์ ‘ ์‹คํ–‰ํ•ด ๋ณธ๋‹ค.
    1
    
    run-shell ~/dev/my-plugin/my-plugin.tmux
    
  3. GitHub ์ €์žฅ์†Œ๋กœ ์˜ฌ๋ฆฌ๊ณ , README์— ์„ค์น˜๋ฒ•์„ ์•ˆ๋‚ดํ•œ๋‹ค.
    1
    
    set -g @plugin 'your-name/my-plugin'
    
  4. ์‚ฌ์šฉ์ž๋Š” ๊ทธ ์ค„์„ ์ถ”๊ฐ€ํ•œ ๋’ค prefix + I(TPM install)๋ฅผ ๋ˆ„๋ฅด๋ฉด TPM์ด ์ €์žฅ์†Œ๋ฅผ ํด๋ก ํ•˜๊ณ  *.tmux๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์ •๋ฆฌ

  • tmux ํ”Œ๋Ÿฌ๊ทธ์ธ = tmux CLI๋ฅผ ๋Œ€์‹  ํ˜ธ์ถœํ•˜๋Š” ์…ธ ์Šคํฌ๋ฆฝํŠธ. ํŠน๋ณ„ํ•œ ๋Ÿฐํƒ€์ž„/SDK๋Š” ์—†๋‹ค.
  • TPM์€ ~/.tmux/plugins/*/์˜ *.tmux ํŒŒ์ผ์„ ์‹คํ–‰ ํŒŒ์ผ๋กœ ๋Œ๋ฆฌ๋Š” ๊ด€๋ก€์ผ ๋ฟ.
  • ์„ค์ •ํ˜•์€ ๋กœ๋“œ ์‹œ set/bind๋งŒ, ์ƒํ˜ธ์ž‘์šฉํ˜•์€ ํ‚ค์— display-popup/run-shell ๋“ฑ์„ ๊ฑด๋‹ค.
  • ์‹œ์ ์ด ์•„๋‹ˆ๋ผ ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•˜๋ ค๋ฉด set-hook.
  • ๊ทธ๋ž˜์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ์ž‘์˜ ์‹ค์ฒด๋Š” man tmux ๋ช…๋ น์„ ์…ธ์—์„œ ์กฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  1. ์‹ค์ œ ์‚ฌ๋ก€ โ€” themepack์ด message-style์—์„œ fill= ์†์„ฑ์„ ๋น ๋œจ๋ ค ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์ƒํƒœ๋ฐ”์— ๊ฒน์น˜๋Š” ๋ฒ„๊ทธ. set ํ•œ ์ค„์ด ์›์ธ์ด์—ˆ๋‹ค.ย ↩︎

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.