@kecan0406/ttheme 1.0.4 → 1.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -17
- package/bin/ttheme.js +133 -113
- package/dist/manifest.json +1 -1
- package/package.json +1 -1
- package/shell/adapters/_bg.zsh +1 -1
- package/shell/adapters/_osc.zsh +35 -7
- package/shell/adapters/iterm2.zsh +16 -3
- package/shell/adapters/terminal-app.zsh +35 -0
- package/shell/adapters/wezterm.zsh +19 -0
- package/shell/adapters/windows-terminal.zsh +1 -0
- package/shell/ttheme.zsh +53 -10
package/dist/manifest.json
CHANGED
package/package.json
CHANGED
package/shell/adapters/_bg.zsh
CHANGED
package/shell/adapters/_osc.zsh
CHANGED
|
@@ -1,25 +1,48 @@
|
|
|
1
|
+
__tt_out() {
|
|
2
|
+
if (( TTHEME_TMUX )); then
|
|
3
|
+
printf '\ePtmux;%s\e\\' "${1//$'\e'/$'\e\e'}"
|
|
4
|
+
else
|
|
5
|
+
printf '%s' "$1"
|
|
6
|
+
fi
|
|
7
|
+
}
|
|
8
|
+
|
|
1
9
|
__tt_osc_apply() {
|
|
2
10
|
local -a p=(${=1})
|
|
3
11
|
(( ${#p} >= 20 )) || return 1
|
|
12
|
+
local out i
|
|
4
13
|
|
|
5
14
|
if [[ $p[1] == - ]]; then
|
|
6
|
-
|
|
15
|
+
out=$'\e]111\e\\'
|
|
7
16
|
else
|
|
8
|
-
|
|
17
|
+
out=$'\e]11;'$p[1]$'\e\\'
|
|
9
18
|
fi
|
|
10
|
-
|
|
19
|
+
out+=$'\e]10;'$p[2]$'\e\\\e]12;'$p[3]$'\e\\\e]17;'$p[4]$'\e\\\e]4'
|
|
20
|
+
for i in {0..15}; do out+=";$i;$p[i+5]"; done
|
|
21
|
+
__tt_out "$out"$'\e\\'
|
|
22
|
+
(( TTHEME_TMUX )) && tmux set -q @ttheme_bg "$p[1]" 2>/dev/null
|
|
23
|
+
return 0
|
|
24
|
+
}
|
|
11
25
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
26
|
+
__tt_osc_reset() {
|
|
27
|
+
__tt_out $'\e]104\e\\\e]110\e\\\e]111\e\\\e]112\e\\\e]117\e\\'
|
|
28
|
+
(( TTHEME_TMUX )) && tmux set -qu @ttheme_bg 2>/dev/null
|
|
29
|
+
return 0
|
|
15
30
|
}
|
|
16
31
|
|
|
17
|
-
|
|
32
|
+
__tt_repaint() {
|
|
33
|
+
if [[ -n $TTHEME_SPEC ]]; then
|
|
34
|
+
__tt_apply "$TTHEME_SPEC"
|
|
35
|
+
else
|
|
36
|
+
__tt_osc_reset
|
|
37
|
+
fi
|
|
38
|
+
}
|
|
18
39
|
|
|
19
40
|
__tt_apply() { __tt_osc_apply "$@" }
|
|
20
41
|
|
|
21
42
|
__tt_shown() { return 1 }
|
|
22
43
|
|
|
44
|
+
__tt_unshown() { : }
|
|
45
|
+
|
|
23
46
|
__tt_keepable() { return 1 }
|
|
24
47
|
|
|
25
48
|
__tt_pv_bg_open() { : }
|
|
@@ -47,6 +70,11 @@ __tt_pv_bg_save() { : }
|
|
|
47
70
|
__tt_query_bg() {
|
|
48
71
|
local saved resp="" c fd
|
|
49
72
|
REPLY=""
|
|
73
|
+
if (( TTHEME_TMUX )); then
|
|
74
|
+
REPLY=$(tmux show -qv @ttheme_bg 2>/dev/null)
|
|
75
|
+
[[ $REPLY == \#* ]] && return 0
|
|
76
|
+
REPLY=""
|
|
77
|
+
fi
|
|
50
78
|
exec {fd}<>/dev/tty 2>/dev/null || return 1
|
|
51
79
|
|
|
52
80
|
saved=$(stty -g <&$fd 2>/dev/null)
|
|
@@ -8,7 +8,9 @@ fi
|
|
|
8
8
|
__tt_keepable() { return 0 }
|
|
9
9
|
|
|
10
10
|
__tt_bg_shown() {
|
|
11
|
-
REPLY
|
|
11
|
+
REPLY=""
|
|
12
|
+
(( TTHEME_TMUX )) && REPLY=$(tmux show -qv @ttheme_shown 2>/dev/null)
|
|
13
|
+
[[ -n $REPLY ]] || REPLY=$TTHEME_ITERM_SHOWN
|
|
12
14
|
[[ $REPLY == default ]] && REPLY=$TTHEME_STARTUP
|
|
13
15
|
[[ -n $REPLY ]]
|
|
14
16
|
}
|
|
@@ -18,13 +20,24 @@ __tt_shown() {
|
|
|
18
20
|
__tt_bg_shown
|
|
19
21
|
was=$REPLY
|
|
20
22
|
[[ $2 != force && $was == $1 ]] && return 1
|
|
21
|
-
[[ -r $dir/$1.conf || ( -n $was && -r $dir/$was.conf ) ]] || return 1
|
|
23
|
+
[[ -r $dir/$1.conf || ( -n $was && -r $dir/$was.conf ) ]] || (( TTHEME_MUXED )) || return 1
|
|
22
24
|
(( ${TTHEME_ORDER[(Ie)$1]} )) || return 1
|
|
23
|
-
|
|
25
|
+
__tt_out $'\e]1337;SetProfile=ttheme · '$1$'\a'
|
|
24
26
|
TTHEME_ITERM_SHOWN=$1
|
|
27
|
+
(( TTHEME_TMUX )) && tmux set -q @ttheme_shown $1 2>/dev/null
|
|
25
28
|
return 1
|
|
26
29
|
}
|
|
27
30
|
|
|
31
|
+
__tt_unshown() {
|
|
32
|
+
local want=${TTHEME_STARTUP:+default} was=$TTHEME_ITERM_SHOWN
|
|
33
|
+
(( TTHEME_TMUX )) && was=$(tmux show -qv @ttheme_shown 2>/dev/null)
|
|
34
|
+
[[ $1 != force && $was == "$want" ]] && return 0
|
|
35
|
+
__tt_out $'\e]1337;SetProfile=\a'
|
|
36
|
+
TTHEME_ITERM_SHOWN=$want
|
|
37
|
+
(( TTHEME_TMUX )) && tmux set -q @ttheme_shown "$want" 2>/dev/null
|
|
38
|
+
return 0
|
|
39
|
+
}
|
|
40
|
+
|
|
28
41
|
__tt_bg_cells() {
|
|
29
42
|
local fd saved resp="" c
|
|
30
43
|
local -a p
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
typeset -g TTHEME_TERMINAL_BASE=""
|
|
2
|
+
|
|
3
|
+
__tt_terminal_base() {
|
|
4
|
+
local fd saved resp="" c q=$'\e]11;?\e\\\e]10;?\e\\\e]12;?\e\\\e]17;?\e\\' e v i
|
|
5
|
+
local -a p
|
|
6
|
+
local -A got
|
|
7
|
+
for i in {0..15}; do q+=$'\e]4;'$i$';?\e\\'; done
|
|
8
|
+
exec {fd}<>/dev/tty 2>/dev/null || return 1
|
|
9
|
+
saved=$(stty -g <&$fd 2>/dev/null)
|
|
10
|
+
[[ -n $saved ]] || { exec {fd}>&-; return 1 }
|
|
11
|
+
stty raw -echo min 0 time 3 <&$fd 2>/dev/null
|
|
12
|
+
printf '%s\e[5n' $q >&$fd
|
|
13
|
+
while IFS= read -r -k 1 -u $fd c 2>/dev/null; do
|
|
14
|
+
resp+=$c
|
|
15
|
+
[[ $resp == *$'\e[0n' ]] && break
|
|
16
|
+
(( ${#resp} < 2048 )) || break
|
|
17
|
+
done
|
|
18
|
+
stty "$saved" <&$fd 2>/dev/null
|
|
19
|
+
exec {fd}>&-
|
|
20
|
+
for e in ${(ps:\e]:)resp}; do
|
|
21
|
+
[[ $e == *';rgb:'* ]] || continue
|
|
22
|
+
p=(${(s:/:)${${e#*rgb:}%%[^0-9A-Fa-f/]*}})
|
|
23
|
+
(( ${#p} >= 3 )) && got[${e%%;rgb:*}]="#${(L)p[1][1,2]}${(L)p[2][1,2]}${(L)p[3][1,2]}"
|
|
24
|
+
done
|
|
25
|
+
v="$got[11] $got[10] $got[12] ${got[17]:-$got[11]}"
|
|
26
|
+
for i in {0..15}; do v+=" ${got[4;$i]}"; done
|
|
27
|
+
(( ${#${=v}} == 20 )) && TTHEME_TERMINAL_BASE=$v
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
__tt_osc_reset() {
|
|
31
|
+
[[ -n $TTHEME_TERMINAL_BASE ]] && __tt_osc_apply "$TTHEME_TERMINAL_BASE"
|
|
32
|
+
return 0
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
[[ -o interactive && -t 1 ]] && __tt_terminal_base
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
typeset -g TTHEME_WEZTERM_SHOWN=""
|
|
2
|
+
|
|
3
|
+
__tt_keepable() { (( ${TTHEME_TERMINALS[(Ie)wezterm]} )) }
|
|
4
|
+
|
|
5
|
+
__tt_wezterm_show() { printf '\e]1337;SetUserVar=ttheme_shown=%s\a' "$(print -rn -- $1 | base64)" }
|
|
6
|
+
|
|
7
|
+
__tt_shown() {
|
|
8
|
+
[[ $2 != force && $TTHEME_WEZTERM_SHOWN == $1 ]] && return 1
|
|
9
|
+
TTHEME_WEZTERM_SHOWN=$1
|
|
10
|
+
__tt_wezterm_show $1
|
|
11
|
+
return 1
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__tt_pv_bg_show() {
|
|
15
|
+
bgname=$1
|
|
16
|
+
__tt_wezterm_show $1
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
__tt_pv_bg_close() { [[ -z $TTHEME_WEZTERM_SHOWN ]] || __tt_wezterm_show $TTHEME_WEZTERM_SHOWN }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__tt_keepable() { (( ${TTHEME_TERMINALS[(Ie)windows-terminal]} )) }
|
package/shell/ttheme.zsh
CHANGED
|
@@ -62,7 +62,9 @@ __tt_pins_load
|
|
|
62
62
|
|
|
63
63
|
typeset -g TTHEME_STATE_DIR=${XDG_STATE_HOME:-$HOME/.local/state}/ttheme
|
|
64
64
|
|
|
65
|
-
if [[
|
|
65
|
+
if [[ $TERM_PROGRAM == WarpTerminal ]]; then
|
|
66
|
+
typeset -g TTHEME_ADAPTER=warp
|
|
67
|
+
elif [[ -n $GHOSTTY_RESOURCES_DIR || $TERM_PROGRAM == ghostty ]]; then
|
|
66
68
|
typeset -g TTHEME_ADAPTER=ghostty
|
|
67
69
|
elif [[ -n $KITTY_WINDOW_ID ]]; then
|
|
68
70
|
typeset -g TTHEME_ADAPTER=kitty
|
|
@@ -72,32 +74,43 @@ elif [[ -n $ALACRITTY_WINDOW_ID ]]; then
|
|
|
72
74
|
typeset -g TTHEME_ADAPTER=alacritty
|
|
73
75
|
elif [[ -n $ITERM_SESSION_ID || $TERM_PROGRAM == iTerm.app ]]; then
|
|
74
76
|
typeset -g TTHEME_ADAPTER=iterm2
|
|
77
|
+
elif [[ $TERM_PROGRAM == Apple_Terminal ]]; then
|
|
78
|
+
typeset -g TTHEME_ADAPTER=terminal-app
|
|
79
|
+
elif [[ -n $WT_SESSION && -z $TERM_PROGRAM ]]; then
|
|
80
|
+
typeset -g TTHEME_ADAPTER=windows-terminal
|
|
75
81
|
elif [[ $TERM == foot* ]]; then
|
|
76
82
|
typeset -g TTHEME_ADAPTER=foot
|
|
77
83
|
else
|
|
78
84
|
typeset -g TTHEME_ADAPTER=unknown
|
|
79
85
|
fi
|
|
80
86
|
|
|
81
|
-
typeset -g TTHEME_GHOSTTY_PID=""
|
|
87
|
+
typeset -g TTHEME_GHOSTTY_PID="" TTHEME_TMUX=0 TTHEME_MUXED=0
|
|
82
88
|
|
|
83
89
|
__tt_reload() {
|
|
84
90
|
(( ${TTHEME_TERMINALS[(Ie)ghostty]} )) || return 0
|
|
85
|
-
local pid=$PPID ppid comm
|
|
86
|
-
|
|
87
|
-
|
|
91
|
+
local pid=$PPID ppid comm owner=$TTHEME_GHOSTTY_PID
|
|
92
|
+
(( TTHEME_TMUX )) && { pid=$(tmux display -p '#{client_pid}' 2>/dev/null) owner="" }
|
|
93
|
+
if [[ -z $owner ]]; then
|
|
94
|
+
owner=0
|
|
88
95
|
while (( pid > 1 )); do
|
|
89
96
|
read -r ppid comm <<< "$(ps -o ppid=,comm= -p $pid)"
|
|
90
97
|
if [[ ${comm:t} == ghostty ]]; then
|
|
91
|
-
|
|
98
|
+
owner=$pid
|
|
92
99
|
break
|
|
93
100
|
fi
|
|
94
101
|
pid=$ppid
|
|
95
102
|
done
|
|
103
|
+
(( TTHEME_TMUX )) || TTHEME_GHOSTTY_PID=$owner
|
|
96
104
|
fi
|
|
97
|
-
((
|
|
105
|
+
(( owner )) && kill -USR2 $owner 2>/dev/null && return
|
|
98
106
|
pkill -USR2 -x ghostty 2>/dev/null
|
|
99
107
|
}
|
|
100
108
|
|
|
109
|
+
__tt_tmux() {
|
|
110
|
+
[[ $(tmux if -t "$TMUX_PANE" -F '#{==:#{allow-passthrough},off}' 'set -p allow-passthrough on' \; set -sq focus-events on \; display -p '#{client_control_mode}' 2>/dev/null) == 1 ]] && return 0
|
|
111
|
+
TTHEME_TMUX=1 TTHEME_SPEC=
|
|
112
|
+
}
|
|
113
|
+
|
|
101
114
|
source $TTHEME_HOME/adapters/_osc.zsh
|
|
102
115
|
[[ -r $TTHEME_HOME/adapters/$TTHEME_ADAPTER.zsh ]] &&
|
|
103
116
|
source $TTHEME_HOME/adapters/$TTHEME_ADAPTER.zsh
|
|
@@ -105,7 +118,7 @@ source $TTHEME_HOME/adapters/_osc.zsh
|
|
|
105
118
|
__tt_active() {
|
|
106
119
|
[[ -o interactive ]] || return 1
|
|
107
120
|
(( ${#TTHEME_PALETTE} )) || return 1
|
|
108
|
-
[[ $TTHEME_ADAPTER != unknown || -n $TTHEME_FORCE ]]
|
|
121
|
+
[[ $TTHEME_ADAPTER != (unknown|warp) || -n $TTHEME_FORCE ]]
|
|
109
122
|
}
|
|
110
123
|
|
|
111
124
|
__tt_empty() {
|
|
@@ -209,9 +222,30 @@ __tt_precmd() {
|
|
|
209
222
|
|
|
210
223
|
__tt_preexec() { printf '\e[?1004l' }
|
|
211
224
|
|
|
225
|
+
__tt_rewear() {
|
|
226
|
+
local REPLY
|
|
227
|
+
__tt_repaint
|
|
228
|
+
[[ -n $TTHEME_SPEC ]] || { __tt_unshown $1; return 0 }
|
|
229
|
+
__tt_name_of "$TTHEME_SPEC"
|
|
230
|
+
[[ -n ${TTHEME_PALETTE[$REPLY]} ]] || return 0
|
|
231
|
+
__tt_shown "$REPLY" $1 && __tt_reload
|
|
232
|
+
}
|
|
233
|
+
|
|
212
234
|
__tt_focus() {
|
|
213
235
|
__tt_fresh
|
|
214
|
-
|
|
236
|
+
if (( TTHEME_TMUX )); then
|
|
237
|
+
__tt_rewear
|
|
238
|
+
else
|
|
239
|
+
__tt_sync
|
|
240
|
+
fi
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
__tt_mux() { [[ ${${(z)3}[1]:t} == tmux ]] && TTHEME_MUXED=1 }
|
|
244
|
+
|
|
245
|
+
__tt_unmux() {
|
|
246
|
+
(( TTHEME_MUXED )) || return 0
|
|
247
|
+
__tt_rewear force
|
|
248
|
+
TTHEME_MUXED=0
|
|
215
249
|
}
|
|
216
250
|
|
|
217
251
|
__tt_blur() { : }
|
|
@@ -1506,6 +1540,10 @@ __tt_preview() {
|
|
|
1506
1540
|
}
|
|
1507
1541
|
|
|
1508
1542
|
ttheme() {
|
|
1543
|
+
if [[ $TTHEME_ADAPTER == warp && $1 != (-h|--help|help|browse|list|add|remove|update|config|default) ]]; then
|
|
1544
|
+
print -u2 "ttheme: Warp wears one theme app-wide and paints no tab background of its own — \`ttheme default <palette>\` puts one on every Warp window"
|
|
1545
|
+
return 1
|
|
1546
|
+
fi
|
|
1509
1547
|
if (( ! $# )); then
|
|
1510
1548
|
(( ${#TTHEME_PALETTE} )) || { __tt_empty; return }
|
|
1511
1549
|
__tt_menu
|
|
@@ -1552,6 +1590,7 @@ if (( $+functions[compdef] )); then
|
|
|
1552
1590
|
fi
|
|
1553
1591
|
|
|
1554
1592
|
if __tt_active; then
|
|
1593
|
+
[[ -n $TMUX ]] && __tt_tmux
|
|
1555
1594
|
() {
|
|
1556
1595
|
local REPLY k
|
|
1557
1596
|
if [[ -n $TTHEME_SPEC ]]; then
|
|
@@ -1572,7 +1611,11 @@ if __tt_active; then
|
|
|
1572
1611
|
autoload -Uz add-zsh-hook
|
|
1573
1612
|
add-zsh-hook chpwd __tt_chpwd
|
|
1574
1613
|
add-zsh-hook precmd __tt_fresh
|
|
1575
|
-
if
|
|
1614
|
+
if (( ! TTHEME_TMUX )); then
|
|
1615
|
+
add-zsh-hook preexec __tt_mux
|
|
1616
|
+
add-zsh-hook precmd __tt_unmux
|
|
1617
|
+
fi
|
|
1618
|
+
if [[ $TTHEME_ADAPTER == ghostty ]] || (( TTHEME_TMUX )); then
|
|
1576
1619
|
add-zsh-hook precmd __tt_precmd
|
|
1577
1620
|
add-zsh-hook preexec __tt_preexec
|
|
1578
1621
|
__tt_bind_focus
|