๐งฉ tmux ํ๋ฌ๊ทธ์ธ์ ์ด๋ป๊ฒ ๋ง๋๋ โ CLI๊ฐ ๊ณง API
tmux ํ๋ฌ๊ทธ์ธ์ ๋ฐํ์๋ SDK๋ ์๋ค. TPM์ด ์คํํ๋ .tmux ์ ธ ์คํฌ๋ฆฝํธ๊ฐ tmux CLI๋ฅผ ํธ์ถํ๋ ๊ฒ ์ ๋ถ. ์ง์ ์คํฌ๋ฆฝํธ ๊ตฌ์กฐยท์ค์ ํ/์ํธ์์ฉํยทhooksยท๋ฐฐํฌ๊น์ง.
์ด ๊ธ์ ํ๋ฌ๊ทธ์ธ์ ์ง์ ๋ง๋๋ ๋ฒ์ด๋ค. ๊ธฐ์กด ํ๋ฌ๊ทธ์ธ์ ์ฐ๋ ๋ฒ(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 ์ ์ ์ ๋ฆฌ๋ผ ์๋ค.
๋ง๋ค์ด์ ๋ฐฐํฌํ๊ธฐ
~/dev/my-plugin/my-plugin.tmux์์ฑ ํchmod +x.- ๋ก์ปฌ ํ
์คํธ โ ์ ์ฅ์๋ก ์ฌ๋ฆฌ๊ธฐ ์ ์,
.tmux.conf์ ์๋ ํ ์ค๋ก ์ง์ ์คํํด ๋ณธ๋ค.1
run-shell ~/dev/my-plugin/my-plugin.tmux
- GitHub ์ ์ฅ์๋ก ์ฌ๋ฆฌ๊ณ , README์ ์ค์น๋ฒ์ ์๋ดํ๋ค.
1
set -g @plugin 'your-name/my-plugin'
- ์ฌ์ฉ์๋ ๊ทธ ์ค์ ์ถ๊ฐํ ๋ค
prefix + I(TPM install)๋ฅผ ๋๋ฅด๋ฉด TPM์ด ์ ์ฅ์๋ฅผ ํด๋ก ํ๊ณ*.tmux๋ฅผ ์คํํ๋ค.
์ ๋ฆฌ
- tmux ํ๋ฌ๊ทธ์ธ = tmux CLI๋ฅผ ๋์ ํธ์ถํ๋ ์ ธ ์คํฌ๋ฆฝํธ. ํน๋ณํ ๋ฐํ์/SDK๋ ์๋ค.
- TPM์
~/.tmux/plugins/*/์*.tmuxํ์ผ์ ์คํ ํ์ผ๋ก ๋๋ฆฌ๋ ๊ด๋ก์ผ ๋ฟ. - ์ค์ ํ์ ๋ก๋ ์
set/bind๋ง, ์ํธ์์ฉํ์ ํค์display-popup/run-shell๋ฑ์ ๊ฑด๋ค. - ์์ ์ด ์๋๋ผ ์ด๋ฒคํธ์ ๋ฐ์ํ๋ ค๋ฉด
set-hook. - ๊ทธ๋์ ํ๋ฌ๊ทธ์ธ ์ ์์ ์ค์ฒด๋
man tmux๋ช ๋ น์ ์ ธ์์ ์กฐํฉํ๋ ๊ฒ์ด๋ค.
์ค์ ์ฌ๋ก โ themepack์ด
message-style์์fill=์์ฑ์ ๋น ๋จ๋ ค ๋ช ๋ น ํ๋กฌํํธ๊ฐ ์ํ๋ฐ์ ๊ฒน์น๋ ๋ฒ๊ทธ.setํ ์ค์ด ์์ธ์ด์๋ค.ย ↩︎