@kecan0406/ttheme 1.0.46 → 1.0.48

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/shell/ttheme.zsh CHANGED
@@ -31,10 +31,7 @@ __tt_gone() {
31
31
  for hook in precmd:__tt_fresh precmd:__tt_precmd precmd:__tt_unmux preexec:__tt_preexec preexec:__tt_mux chpwd:__tt_chpwd; do
32
32
  add-zsh-hook -d ${hook%%:*} ${hook#*:}
33
33
  done
34
- if (( $+functions[add-zle-hook-widget] )); then
35
- add-zle-hook-widget -d line-init __tt_focus_on
36
- add-zle-hook-widget -d line-init __tt_typed
37
- fi
34
+ (( $+functions[add-zle-hook-widget] )) && add-zle-hook-widget -d line-init __tt_line_init
38
35
  unfunction ttheme
39
36
  }
40
37
 
@@ -143,16 +140,79 @@ __tt_tmux() {
143
140
  TTHEME_TMUX=1 TTHEME_SPEC=
144
141
  }
145
142
 
146
- source $TTHEME_HOME/adapters/_osc.zsh
147
- [[ -r $TTHEME_HOME/adapters/$TTHEME_ADAPTER.zsh ]] &&
148
- source $TTHEME_HOME/adapters/$TTHEME_ADAPTER.zsh
149
-
150
143
  __tt_active() {
151
144
  [[ -o interactive ]] || return 1
152
145
  (( ${#TTHEME_PALETTE} )) || return 1
153
146
  [[ $TTHEME_ADAPTER != (unknown|warp) || -n $TTHEME_FORCE ]]
154
147
  }
155
148
 
149
+ typeset -g TTHEME_HEARD=""
150
+ typeset -gi TTHEME_RECHECK=0 TTHEME_FOCUS=0
151
+
152
+ __tt_recall() {
153
+ local f=$TTHEME_STATE_DIR/colors.$TTHEME_ADAPTER line
154
+ REPLY=""
155
+ [[ -o zle && -r $f && -z $TTHEME_PAINTED && $TTHEME_TAB_PALETTE == off ]] && (( ! TTHEME_TMUX )) && __tt_active || return 1
156
+ line=$(<$f)
157
+ [[ $line == "${TTHEME_STARTUP:--} "?* ]] || return 1
158
+ REPLY=${line#* }
159
+ }
160
+
161
+ __tt_remember() {
162
+ local f=$TTHEME_STATE_DIR/colors.$TTHEME_ADAPTER line="${TTHEME_STARTUP:--} $1"
163
+ [[ -n $1 && -z $TTHEME_PAINTED ]] && (( ! TTHEME_TMUX )) || return 0
164
+ [[ -r $f && "$(<$f)" == "$line" ]] && return 0
165
+ [[ -d $TTHEME_STATE_DIR ]] || mkdir -p $TTHEME_STATE_DIR 2>/dev/null
166
+ print -r -- "$line" 2>/dev/null > $f
167
+ }
168
+
169
+ __tt_listen() {
170
+ local REPLY
171
+ if __tt_recall; then
172
+ TTHEME_RECHECK=1
173
+ else
174
+ __tt_hear || return 1
175
+ __tt_remember "$REPLY"
176
+ fi
177
+ TTHEME_HEARD=$REPLY
178
+ __tt_heard "$REPLY"
179
+ }
180
+
181
+ __tt_wearing() {
182
+ local k
183
+ [[ -n $1 ]] || return 1
184
+ [[ -n $TTHEME_STARTUP && ${TTHEME_PALETTE[$TTHEME_STARTUP]%% *} == "$1" ]] && { REPLY=$TTHEME_PALETTE[$TTHEME_STARTUP]; return 0 }
185
+ for k in ${(k)TTHEME_PALETTE}; do
186
+ [[ ${TTHEME_PALETTE[$k]%% *} == "$1" ]] && { REPLY=$TTHEME_PALETTE[$k]; return 0 }
187
+ done
188
+ return 1
189
+ }
190
+
191
+ __tt_recheck() {
192
+ local REPLY heard=$TTHEME_HEARD was="" now
193
+ TTHEME_RECHECK=0
194
+ [[ -z $TTHEME_PAINTED ]] && __tt_hear || return 0
195
+ [[ $REPLY == "$heard" ]] && return 0
196
+ now=$REPLY
197
+ __tt_remember "$now"
198
+ TTHEME_HEARD=$now
199
+ __tt_heard "$now"
200
+ [[ $TTHEME_TAB_PALETTE == off ]] || return 0
201
+ __tt_wearing "${heard%% *}" && was=$REPLY
202
+ REPLY=""
203
+ __tt_wearing "${now%% *}"
204
+ if [[ -n $TTHEME_PIN ]]; then
205
+ [[ $TTHEME_BASE_SPEC == "$was" ]] && TTHEME_BASE_SPEC=$REPLY
206
+ elif [[ $TTHEME_SPEC == "$was" ]]; then
207
+ TTHEME_SPEC=$REPLY
208
+ __tt_sync
209
+ fi
210
+ }
211
+
212
+ source $TTHEME_HOME/adapters/_osc.zsh
213
+ [[ -r $TTHEME_HOME/adapters/$TTHEME_ADAPTER.zsh ]] &&
214
+ source $TTHEME_HOME/adapters/$TTHEME_ADAPTER.zsh
215
+
156
216
  __tt_empty() {
157
217
  print -u2 'ttheme: no palettes installed yet — run `ttheme browse` to pick some'
158
218
  return 1
@@ -288,13 +348,17 @@ __tt_unmux() {
288
348
 
289
349
  __tt_blur() { : }
290
350
 
351
+ __tt_line_init() {
352
+ (( TTHEME_RECHECK )) && __tt_recheck
353
+ __tt_typed
354
+ (( TTHEME_FOCUS )) && __tt_focus_on
355
+ }
356
+
291
357
  __tt_bind_focus() {
292
358
  local k
293
359
  zle -N __tt_focus
294
360
  zle -N __tt_blur
295
- zle -N __tt_focus_on
296
- autoload -Uz add-zle-hook-widget
297
- add-zle-hook-widget line-init __tt_focus_on
361
+ TTHEME_FOCUS=1
298
362
  for k in emacs viins vicmd; do
299
363
  bindkey -M $k '^[[I' __tt_focus
300
364
  bindkey -M $k '^[[O' __tt_blur
@@ -461,7 +525,7 @@ __tt_arity() {
461
525
 
462
526
  __tt_cli() {
463
527
  local k
464
- local -a pass=()
528
+ local -a pass=(NODE_COMPILE_CACHE=${XDG_CACHE_HOME:-$HOME/.cache}/ttheme/node)
465
529
  for k in $TTHEME_SETTINGS; do
466
530
  (( $+parameters[$k] )) && pass+=("$k=${(P)k}")
467
531
  done
@@ -642,7 +706,7 @@ __tt_pv_focus() {
642
706
  (( resized )) || [[ ${rval[cur]} == "$bgname" ]] || __tt_pv_bg_show "${rval[cur]}"
643
707
  local spec=${TTHEME_PALETTE[${rval[cur]}]}
644
708
  [[ $spec == "$applied" ]] && return 0
645
- __tt_apply "$spec"
709
+ __tt_pv_paint "$spec"
646
710
  applied=$spec
647
711
  }
648
712
 
@@ -791,10 +855,14 @@ __tt_pv_head() {
791
855
 
792
856
  __tt_pv_foot() {
793
857
  setopt localoptions extendedglob
794
- local b=$'\e[1m' d=$'\e[2m' z=$'\e[0m' y=$'\e[33m' on=$'\e[7;1m'$ac badge="" lead="" note="" right="" text line plain
858
+ local b=$'\e[1m' d=$'\e[2m' z=$'\e[0m' y=$'\e[33m' on=$'\e[7;1m'$ac badge="" lead="" note="" right="" text line plain hex
795
859
  local -a kk=() kl=() seg=()
796
860
  local -i end=$1 i lwid rwid room
797
861
  (( color )) || b= d= z= y= on=
862
+ if (( color )) && [[ -n $applied && $applied != "$painted" ]]; then
863
+ hex=${${=applied}[8]#\#}
864
+ printf -v y '\e[38;2;%d;%d;%dm' $((16#${hex:0:2})) $((16#${hex:2:2})) $((16#${hex:4:2}))
865
+ fi
798
866
  if (( help )); then
799
867
  badge=KEYS right=$b"? esc"$z$d" close"$z
800
868
  elif [[ -n $pick ]]; then
@@ -949,10 +1017,21 @@ __tt_pv_help() {
949
1017
  }
950
1018
 
951
1019
  __tt_pv_specimen() {
952
- local -a sp=(${=applied}) ln=()
1020
+ local -a sp=(${=applied}) ln=() fg=()
953
1021
  (( ${#sp} >= 20 )) || return 0
954
- local z=$'\e[0m' d=$'\e[2m' pr=$'\e[32m❯\e[0m ' sel cu cell line="" lo hi
1022
+ local z=$'\e[0m' d=$'\e[2m' sel cu cell line="" lo hi pr bd
955
1023
  local -i i r cw=4
1024
+ if [[ $applied == "$painted" ]]; then
1025
+ fg=($'\e[31m' $'\e[32m' $'\e[33m' $'\e[34m' $'\e[35m') bd=$'\e[1;34m'
1026
+ else
1027
+ for i in 6 7 8 9 10 17; do
1028
+ lo=${sp[i]#\#}
1029
+ printf -v cell '\e[38;2;%d;%d;%dm' $((16#${lo:0:2})) $((16#${lo:2:2})) $((16#${lo:4:2}))
1030
+ fg+=($cell)
1031
+ done
1032
+ bd=$'\e[1m'$fg[6]
1033
+ fi
1034
+ pr=$fg[2]'❯'$z' '
956
1035
  (( sw < 44 )) && cw=3
957
1036
  (( sw >= 56 )) && cw=$(( (sw + 1) / 8 - 1 ))
958
1037
  (( cw > 7 )) && cw=7
@@ -966,12 +1045,12 @@ __tt_pv_specimen() {
966
1045
  line+=$cell
967
1046
  done
968
1047
  out+=$'\e[4;'$sc'H'$line
969
- ln=($'\e[1;34m~/code/demo\e[0m'$d' on '$z$'\e[35mmain\e[32m +2\e[33m ~1\e[0m' "${pr}git status -sb")
970
- (( sw >= 44 )) && ln+=($'## \e[32mmain\e[0m...\e[31morigin/main\e[33m [ahead 1]\e[0m')
971
- ln+=($'\e[31m M\e[0m src/main.rs' $'\e[31m??\e[0m notes.md' "")
972
- (( sw >= 44 )) && ln+=("${pr}ls" $'\e[1;34mdocs\e[0m \e[1;34msrc\e[0m \e[1;34mtests\e[0m Cargo.toml README.md' "")
973
- ln+=("${pr}cargo test" $'\e[32m ✓\e[0m parses config' $'\e[31m ✗\e[0m renders frame')
974
- (( sw >= 44 )) && ln[-1]+=$d' expected '$z$'\e[32m3\e[0m'$d', received '$z$'\e[31m2\e[0m'
1048
+ ln=($bd'~/code/demo'$z$d' on '$z$fg[5]'main'$fg[2]' +2'$fg[3]' ~1'$z "${pr}git status -sb")
1049
+ (( sw >= 44 )) && ln+=('## '$fg[2]'main'$z'...'$fg[1]'origin/main'$fg[3]' [ahead 1]'$z)
1050
+ ln+=($fg[1]' M'$z' src/main.rs' $fg[1]'??'$z' notes.md' "")
1051
+ (( sw >= 44 )) && ln+=("${pr}ls" $bd'docs'$z' '$bd'src'$z' '$bd'tests'$z' Cargo.toml README.md' "")
1052
+ ln+=("${pr}cargo test" $fg[2]' ✓'$z' parses config' $fg[1]' ✗'$z' renders frame')
1053
+ (( sw >= 44 )) && ln[-1]+=$d' expected '$z$fg[2]'3'$z$d', received '$z$fg[1]'2'$z
975
1054
  ln+=("" "${pr}echo ${sel}selected text${z} ${cu} ${z}")
976
1055
  for (( r = 1; r <= ${#ln}; r++ )); do
977
1056
  (( r + 5 < ph )) || break
@@ -1228,13 +1307,14 @@ __tt_pv_draw() {
1228
1307
  fi
1229
1308
  line=" "$dd"search… e.g. $ex"$zz
1230
1309
  fi
1231
- out+=$line$'\e[K\e['$(( lw - ${#cnt} ))'G'
1232
- if [[ -n $flt ]]; then
1233
- out+=$cnt
1234
- else
1235
- out+=$dd$cnt$zz
1310
+ local tail=$'\e['$(( lw - ${#cnt} ))'G'$dd$cnt$zz
1311
+ [[ -n $flt ]] && tail=$'\e['$(( lw - ${#cnt} ))'G'$cnt
1312
+ if [[ $1 == hint ]] && (( ! wiped )); then
1313
+ print -rn -- $'\e[H\e[0m\e['$lw'X'$line$tail
1314
+ printf '\e[?2026l'
1315
+ return 0
1236
1316
  fi
1237
- out+=$'\n\e[K\n'
1317
+ out+=$line$'\e[K'$tail$'\n\e[K\n'
1238
1318
  (( N > h && top > 1 )) && out+=" "$dd"…"$zz
1239
1319
  out+=$'\e[K\n'
1240
1320
  for (( k = 0; k < ph - 4; k++ )); do
@@ -1377,8 +1457,8 @@ __tt_pv_getch() {
1377
1457
  (( msgt -= gstep ? 6 : 20 ))
1378
1458
  (( msgt > 0 )) || return 1
1379
1459
  fi
1380
- (( gstep )) && { gstep=$(( gstep - 1 )); return 1 }
1381
- (( SECONDS >= exnext )) && { __tt_pv_roll; gstep=8; return 1 }
1460
+ (( gstep )) && { gstep=$(( gstep - 1 )); tick=1; return 1 }
1461
+ (( SECONDS >= exnext )) && { __tt_pv_roll; gstep=8; tick=1; return 1 }
1382
1462
  done
1383
1463
  return 0
1384
1464
  }
@@ -1551,10 +1631,11 @@ __tt_preview() {
1551
1631
  print -u2 "ttheme ${mode:-preview}: needs a terminal"
1552
1632
  return 1
1553
1633
  fi
1554
- local orig=$TTHEME_SPEC applied=$TTHEME_SPEC flt="" sel="" cn="" cdot="" key="" REPLY="" cur=1 top=1 color=0 pw=80 ph=24 resized=1 expal="" exgrp="" exnext=0 gstep=0 gseed=0
1634
+ local orig=$TTHEME_SPEC applied=$TTHEME_SPEC painted=$TTHEME_SPEC flt="" sel="" cn="" cdot="" key="" REPLY="" cur=1 top=1 color=0 pw=80 ph=24 resized=1 expal="" exgrp="" exnext=0 gstep=0 gseed=0 tick=0
1555
1635
  local pick="" pk=1 pkdef=1 picked=0 canpick=0 bgcw=0 bgch=0 bgname="" bgshown="" bginc="" osd="" osdt=0
1556
- local tune="" tsnap="" tf=1 help=0 msg="" msgt=0 an="" bgrel=0 bgmx=0 bgmy=0 bganchor=0 bgcut=""
1557
- local -A bgfrom=() bgsent=() bgdim=() bgsrc=() bgfill=() bgfocus=() bgsize=() bgpos=() bgop=() bgdef=() bgoff=() bgbase=() bgload=() bgshot=() bgshotkey=() bgedit=() bgtunef=() bgofff=() bgimages=()
1636
+ local tune="" tsnap="" tf=1 help=0 msg="" msgt=0 an="" bgrel=0 bgmx=0 bgmy=0 bganchor=0 bgcut="" bgnext=0 bgbytes=0
1637
+ local -a bgorder=()
1638
+ local -A bgfrom=() bgsent=() bgcost=() bgdim=() bgsrc=() bgfill=() bgfocus=() bgsize=() bgpos=() bgop=() bgdef=() bgoff=() bgbase=() bgload=() bgshot=() bgshotkey=() bgedit=() bgtunef=() bgofff=() bgimages=()
1558
1639
  local conf=0 cf=1
1559
1640
  local -a plabel=(" this tab " " default ") csnap=()
1560
1641
  local -a cvars=(TTHEME_TAB_PALETTE TTHEME_ANNOUNCE TTHEME_FX TTHEME_SORT) clabel=("new tabs" announce "search fx" sort)
@@ -1576,14 +1657,23 @@ __tt_preview() {
1576
1657
  __tt_pv_roll
1577
1658
  __tt_pv_rows
1578
1659
  [[ -n ${TTHEME_PALETTE[$cn]} ]] && __tt_pv_goto "$cn"
1579
- printf '\e[?2026h\e[?1049h\e[?7l\e[?25l'
1580
- __tt_pv_bg_open
1660
+ local tty=""
1661
+ local -i TTHEME_RAW=0
1581
1662
  {
1663
+ tty=$(stty -g 2>/dev/null && stty -echo -icanon min 1 time 0 2>/dev/null)
1664
+ TTHEME_RAW=$(( ${#tty} > 0 ))
1665
+ printf '\e[?2026h\e[?1049h\e[?7l\e[?25l'
1666
+ __tt_pv_bg_open
1582
1667
  while :; do
1583
1668
  printf '\e[?2026h'
1584
- __tt_pv_focus
1585
- [[ ${rtype[cur]} == thm ]] && an=${rval[cur]}
1586
- __tt_pv_draw
1669
+ if (( tick )); then
1670
+ __tt_pv_draw hint
1671
+ else
1672
+ __tt_pv_focus
1673
+ [[ ${rtype[cur]} == thm ]] && an=${rval[cur]}
1674
+ __tt_pv_draw
1675
+ fi
1676
+ tick=0
1587
1677
  if ! __tt_pv_read; then
1588
1678
  [[ -t 0 ]] && continue
1589
1679
  break
@@ -1594,15 +1684,27 @@ __tt_preview() {
1594
1684
  done
1595
1685
  done
1596
1686
  } always {
1687
+ local spec=${sel:+${TTHEME_PALETTE[$sel]}}
1597
1688
  printf '\e[?2026h'
1598
1689
  __tt_pv_bg_close
1690
+ if [[ -n $spec ]]; then
1691
+ [[ $spec == "$painted" ]] || __tt_apply "$spec"
1692
+ elif [[ $painted != "$orig" ]]; then
1693
+ if [[ -z $orig ]]; then
1694
+ __tt_osc_reset
1695
+ else
1696
+ __tt_apply "$orig"
1697
+ fi
1698
+ elif [[ $applied != "$orig" ]]; then
1699
+ __tt_pv_paint "${TTHEME_PAINTED:+$orig}"
1700
+ fi
1599
1701
  printf '\e[?7h\e[?1049l\e[?25h\e[?2026l'
1702
+ [[ -n $tty ]] && stty "$tty" 2>/dev/null
1703
+ TTHEME_RAW=0
1600
1704
  [[ -n $tune ]] && __tt_pv_untune
1601
1705
  (( conf )) && __tt_pv_unconf
1602
1706
  __tt_pv_bg_save
1603
- if [[ -n $sel ]]; then
1604
- local spec=${TTHEME_PALETTE[$sel]}
1605
- [[ $spec == "$applied" ]] || __tt_apply "$spec"
1707
+ if [[ -n $spec ]]; then
1606
1708
  TTHEME_SPEC=$spec
1607
1709
  __tt_announce
1608
1710
  if [[ $mode == pin ]]; then
@@ -1614,11 +1716,6 @@ __tt_preview() {
1614
1716
  __tt_shown "$sel" force && __tt_reload
1615
1717
  fi
1616
1718
  else
1617
- if [[ -z $orig && -n $applied ]]; then
1618
- __tt_osc_reset
1619
- elif [[ $orig != "$applied" ]]; then
1620
- __tt_apply "$orig"
1621
- fi
1622
1719
  (( ${#bgedit} )) && [[ -n ${TTHEME_PALETTE[$cn]} ]] && { __tt_shown "$cn" && __tt_reload }
1623
1720
  fi
1624
1721
  }
@@ -1705,15 +1802,12 @@ fi
1705
1802
  if __tt_active; then
1706
1803
  [[ -n $TMUX ]] && __tt_tmux
1707
1804
  () {
1708
- local REPLY k
1805
+ local REPLY
1709
1806
  if [[ -n $TTHEME_SPEC ]]; then
1710
1807
  :
1711
1808
  elif [[ $TTHEME_TAB_PALETTE == off ]]; then
1712
- if __tt_start_bg; then
1713
- for k in ${(k)TTHEME_PALETTE}; do
1714
- [[ ${TTHEME_PALETTE[$k]%% *} == "$REPLY" ]] && { TTHEME_SPEC=$TTHEME_PALETTE[$k]; break }
1715
- done
1716
- fi
1809
+ [[ -n $TTHEME_HEARD ]] || __tt_listen
1810
+ __tt_start_bg && __tt_wearing $REPLY && TTHEME_SPEC=$REPLY
1717
1811
  else
1718
1812
  __tt_next
1719
1813
  TTHEME_SPEC=$REPLY
@@ -1722,8 +1816,8 @@ if __tt_active; then
1722
1816
  __tt_dir_sync
1723
1817
  }
1724
1818
  autoload -Uz add-zsh-hook add-zle-hook-widget
1725
- zle -N __tt_typed
1726
- add-zle-hook-widget line-init __tt_typed
1819
+ zle -N __tt_line_init
1820
+ add-zle-hook-widget line-init __tt_line_init
1727
1821
  add-zsh-hook chpwd __tt_chpwd
1728
1822
  add-zsh-hook precmd __tt_fresh
1729
1823
  if (( ! TTHEME_TMUX )); then