@kecan0406/ttheme 1.2.17 → 1.2.19

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
@@ -2,6 +2,21 @@ typeset -g TTHEME_HOME=${${(%):-%x}:A:h} TTHEME_PALETTES_AT=""
2
2
 
3
3
  zmodload -F zsh/stat b:zstat 2>/dev/null
4
4
 
5
+ typeset -gA TTHEME_SGR=(
6
+ reset $'\e[0m' /fg $'\e[39m' /bg $'\e[49m' /ink $'\e[39;49m'
7
+ dim $'\e[2m' /dim $'\e[22m'
8
+ bold $'\e[1m' /bold $'\e[22m'
9
+ under $'\e[4m' /under $'\e[24m'
10
+ reverse $'\e[7m' /reverse $'\e[27m'
11
+ accent $'\e[36m' /accent $'\e[39m'
12
+ pill $'\e[7;1;36m' /pill $'\e[22;27;39m'
13
+ match $'\e[1;4;36m' /match $'\e[22;24;39m'
14
+ ok $'\e[32m' /ok $'\e[39m'
15
+ warn $'\e[33m' /warn $'\e[39m'
16
+ error $'\e[31m' /error $'\e[39m'
17
+ fg0 $'\e[30m' fg1 $'\e[31m' fg2 $'\e[32m' fg3 $'\e[33m' fg4 $'\e[34m' fg5 $'\e[35m' fg6 $'\e[36m' fg7 $'\e[37m'
18
+ )
19
+
5
20
  __tt_palettes_load() {
6
21
  emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace}
7
22
  local -a at
@@ -11,16 +26,38 @@ __tt_palettes_load() {
11
26
  TTHEME_PALETTES_AT=$at[1]
12
27
  }
13
28
 
29
+ __tt_specs_named() {
30
+ local v REPLY
31
+ reply=()
32
+ for v in TTHEME_SPEC TTHEME_PIN_SPEC TTHEME_BASE_SPEC TTHEME_SSH_SPEC TTHEME_SSH_BACK; do
33
+ [[ -n ${(P)v} ]] || continue
34
+ __tt_name_of "${(P)v}"
35
+ [[ -n ${TTHEME_PALETTE[$REPLY]} ]] && reply+=($v $REPLY)
36
+ done
37
+ }
38
+
39
+ __tt_respec() {
40
+ local spec=$TTHEME_SPEC v n worn
41
+ for v n in "$@"; do
42
+ [[ -n ${TTHEME_PALETTE[$n]} ]] || continue
43
+ typeset -g $v=${TTHEME_PALETTE[$n]}
44
+ [[ $v == TTHEME_SPEC ]] && worn=$n
45
+ done
46
+ [[ -n $worn && -n $TTHEME_PAINTED && $TTHEME_SPEC != "$spec" ]] && __tt_wear "$TTHEME_SPEC" $worn
47
+ return 0
48
+ }
49
+
14
50
  __tt_fresh() {
15
51
  emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace}
16
- local -a at
52
+ local -a at reply
17
53
  local was=$TTHEME_STARTUP start="$TTHEME_STARTUP ${TTHEME_PALETTE[$TTHEME_STARTUP]}"
18
54
  if ! zstat -F %s.%N -A at +mtime -- $TTHEME_HOME/palettes.zsh 2>/dev/null; then
19
55
  [[ -e $TTHEME_HOME ]] || __tt_gone
20
56
  return 0
21
57
  fi
22
58
  if [[ $at[1] != "$TTHEME_PALETTES_AT" ]]; then
23
- __tt_palettes_load && { __tt_follow "$start" && __tt_sync; __tt_reloaded }
59
+ __tt_specs_named
60
+ __tt_palettes_load && { __tt_respec $reply; __tt_follow "$start" && __tt_sync; __tt_reloaded }
24
61
  [[ -n $was && -z $TTHEME_STARTUP && -n $TTHEME_SPEC ]] && __tt_active && __tt_off_here
25
62
  fi
26
63
  at=("")
@@ -75,7 +112,7 @@ fi
75
112
 
76
113
  typeset -g TTHEME_CONFIG=${XDG_CONFIG_HOME:-$HOME/.config}/ttheme/config.zsh
77
114
 
78
- [[ -r $TTHEME_CONFIG ]] && source $TTHEME_CONFIG
115
+ [[ -r $TTHEME_CONFIG ]] && source "$TTHEME_CONFIG"
79
116
 
80
117
  typeset -g TTHEME_PINS_FILE=${TTHEME_CONFIG:h}/pins
81
118
  typeset -g TTHEME_PINS_RAW="" TTHEME_PINS_AT=""
@@ -268,10 +305,10 @@ __tt_mend() {
268
305
  __tt_apply "$TTHEME_SPEC"
269
306
  }
270
307
 
271
- source $TTHEME_HOME/adapters/_osc.zsh
272
- source $TTHEME_HOME/adapters/_wired.zsh
308
+ source "$TTHEME_HOME/adapters/_osc.zsh"
309
+ source "$TTHEME_HOME/adapters/_wired.zsh"
273
310
  [[ -r $TTHEME_HOME/adapters/$TTHEME_ADAPTER.zsh ]] &&
274
- source $TTHEME_HOME/adapters/$TTHEME_ADAPTER.zsh
311
+ source "$TTHEME_HOME/adapters/$TTHEME_ADAPTER.zsh"
275
312
 
276
313
  __tt_empty() {
277
314
  print -u2 'ttheme: no palettes installed yet — run `ttheme` in a terminal to pick some, or `ttheme add <palette>`'
@@ -283,7 +320,7 @@ __tt_name_of() { REPLY=${${(k)TTHEME_PALETTE[(re)$1]}:-custom} }
283
320
  __tt_color() { [[ -t 1 && -z $NO_COLOR && $TERM != dumb ]] }
284
321
 
285
322
  __tt_announce() {
286
- (( TTHEME_ANNOUNCE )) || return 0
323
+ (( TTHEME_ANNOUNCE )) && [[ -t 1 ]] || return 0
287
324
  local -a p=(${=TTHEME_SPEC})
288
325
  (( ${#p} >= 20 )) || return 0
289
326
  local REPLY
@@ -296,7 +333,7 @@ __tt_announce() {
296
333
  return 0
297
334
  fi
298
335
  local cur=${p[3]#\#} sel=${p[4]#\#}
299
- printf '\033[48;2;%d;%d;%dm %s \033[0m\n\033[7;1;38;2;%d;%d;%dm %s \033[0m \033[2m· ANSI %s\033[0m\n' \
336
+ printf "\033[48;2;%d;%d;%dm %s ${TTHEME_SGR[reset]}\n${TTHEME_SGR[reverse]}${TTHEME_SGR[bold]}\033[38;2;%d;%d;%dm %s ${TTHEME_SGR[reset]} ${TTHEME_SGR[dim]}· ANSI %s${TTHEME_SGR[reset]}\n" \
300
337
  $((16#${sel:0:2})) $((16#${sel:2:2})) $((16#${sel:4:2})) "$grp" \
301
338
  $((16#${cur:0:2})) $((16#${cur:2:2})) $((16#${cur:4:2})) "$name" "$src"
302
339
  }
@@ -626,7 +663,7 @@ __tt_pin_save() {
626
663
  k=$REPLY
627
664
  __tt_pin_scope "$key"
628
665
  if __tt_color; then
629
- printf '\033[2mPinned · %s → %s · %s\033[0m\n' "$name" "$k" "$REPLY"
666
+ printf "${TTHEME_SGR[dim]}Pinned · %s → %s · %s${TTHEME_SGR[reset]}\n" "$name" "$k" "$REPLY"
630
667
  else
631
668
  print -r -- "Pinned · $name → $k · $REPLY"
632
669
  fi
@@ -656,7 +693,7 @@ __tt_unpin_drop() {
656
693
  __tt_dir_sync
657
694
  for k in $gone; do
658
695
  if __tt_color; then
659
- print -r -- $'\e[2m'"$k"$'\e[0m'
696
+ print -r -- $TTHEME_SGR[dim]"$k"$TTHEME_SGR[reset]
660
697
  else
661
698
  print -r -- "$k"
662
699
  fi
@@ -692,6 +729,14 @@ __tt_key() {
692
729
  C) REPLY=right ;;
693
730
  D) REPLY=left ;;
694
731
  Z) REPLY=stab ;;
732
+ "200~")
733
+ seq=""
734
+ while read -sk 1 -t 0.5 c; do
735
+ seq+=$c
736
+ [[ $c == '~' && $seq == *$'\e[201~' ]] && break
737
+ done
738
+ REPLY=nop
739
+ ;;
695
740
  *) REPLY=nop ;;
696
741
  esac
697
742
  else
@@ -706,13 +751,13 @@ __tt_key() {
706
751
  }
707
752
 
708
753
  __tt_unpin_block() {
709
- local b=$'\e[1m' d=$'\e[2m' z=$'\e[0m' on=$'\e[7;1m' bar plain keys top k home=${HOME:a} here=${PWD:a} htip="" REPLY
754
+ local b=$TTHEME_SGR[bold] d=$TTHEME_SGR[dim] z=$TTHEME_SGR[reset] on=$TTHEME_SGR[pill] bar plain keys top k home=${HOME:a} here=${PWD:a} htip="" REPLY
710
755
  local -A own=() below=() parent=() mark=() tstrip=()
711
756
  local -a roots=() lp=() lpw=() ll=() lat=() lpal=() lnote=() lflag=() reply gone=(${(f)drops[$1]})
712
757
  local -i i width=$(( (COLUMNS > 0 ? COLUMNS : 80) - 1 )) room=$(( (LINES > 0 ? LINES : 24) - 3 ))
713
758
  (( color )) || b= d= z= on=
714
759
  if (( color )); then
715
- bar=$'\e[7;1m UNPIN \e[0m ' plain=" UNPIN "
760
+ bar=$TTHEME_SGR[pill]" UNPIN "$TTHEME_SGR[reset]" " plain=" UNPIN "
716
761
  else
717
762
  bar="[UNPIN]" plain=$bar
718
763
  fi
@@ -738,7 +783,7 @@ __tt_unpin_block() {
738
783
  [[ -n $cover ]] && __tt_pin_base "$cover" && top=$REPLY
739
784
  __tt_map_build "$top"
740
785
  __tt_map_fit $width
741
- (( ${#reply} > room )) && reply=("${(@)reply[1,room-1]}" " …")
786
+ (( ${#reply} > room )) && reply=("${(@)reply[1,room-1]}" " …")
742
787
  block=("$bar" "${reply[@]}")
743
788
  __tt_unpin_then $width $gone
744
789
  block+=("${reply[@]}")
@@ -758,7 +803,7 @@ __tt_unpin_choose() {
758
803
  chosen=0
759
804
  {
760
805
  tty=$(stty -g 2>/dev/null && stty -echo -icanon -ixon min 1 time 0 2>/dev/null)
761
- print -rn -- $'\e[?25l'
806
+ print -rn -- $'\e[?25l\e[?2004h'
762
807
  while :; do
763
808
  __tt_unpin_block $at
764
809
  __tt_unpin_paint $n
@@ -774,7 +819,7 @@ __tt_unpin_choose() {
774
819
  } always {
775
820
  REPLY=$'\r'
776
821
  (( n > 1 )) && REPLY+=$'\e['$(( n - 1 ))'A'
777
- print -rn -- "$REPLY"$'\e[J\e[?25h'
822
+ print -rn -- "$REPLY"$'\e[J\e[?2004l\e[?25h'
778
823
  [[ -n $tty ]] && stty "$tty" 2>/dev/null
779
824
  }
780
825
  (( chosen ))
@@ -909,7 +954,7 @@ __tt_clip() {
909
954
  (( w += cw ))
910
955
  done
911
956
  REPLY=$out…
912
- [[ $1 == *$'\e'* ]] && REPLY+=$'\e[0m'
957
+ [[ $1 == *$'\e'* ]] && REPLY+=$TTHEME_SGR[reset]
913
958
  return 1
914
959
  }
915
960
 
@@ -923,14 +968,15 @@ __tt_map_tip() {
923
968
 
924
969
  __tt_map_chip() {
925
970
  local -a p=(${=TTHEME_PALETTE[$1]})
926
- local bg=${p[1]#\#} fg=${p[2]#\#}
971
+ local bg=${p[1]#\#} fg=${p[2]#\#} name=$1
972
+ (( ${#name} > $2 )) && name=${name[1,$2-1]}…
927
973
  if (( ! color )); then
928
- printf -v REPLY '%-*s' $2 "$1"
974
+ printf -v REPLY '%-*s' $2 "$name"
929
975
  elif (( ${#p} >= 20 )); then
930
- printf -v REPLY '\e[48;2;%d;%d;%d;38;2;%d;%d;%dm %-*s \e[0m' $((16#${bg:0:2})) $((16#${bg:2:2})) $((16#${bg:4:2})) \
931
- $((16#${fg:0:2})) $((16#${fg:2:2})) $((16#${fg:4:2})) $2 "$1"
976
+ printf -v REPLY "\e[48;2;%d;%d;%d;38;2;%d;%d;%dm %-*s ${TTHEME_SGR[/ink]}" $((16#${bg:0:2})) $((16#${bg:2:2})) $((16#${bg:4:2})) \
977
+ $((16#${fg:0:2})) $((16#${fg:2:2})) $((16#${fg:4:2})) $2 "$name"
932
978
  else
933
- printf -v REPLY '\e[2m %-*s \e[0m' $2 "$1"
979
+ printf -v REPLY "${TTHEME_SGR[dim]} %-*s ${TTHEME_SGR[reset]}" $2 "$name"
934
980
  fi
935
981
  }
936
982
 
@@ -1016,22 +1062,22 @@ __tt_map_line() {
1016
1062
  }
1017
1063
 
1018
1064
  __tt_map_walk() {
1019
- local at=$1 pre=$2 tip z=$'\e[0m' REPLY
1065
+ local at=$1 pre=$2 tip z=$TTHEME_SGR[reset] REPLY
1020
1066
  local -i i
1021
1067
  local -a ks=(${(oi)${(k)parent[(Re)$1]}}) reply
1022
1068
  (( color )) || z=
1023
1069
  __tt_map_under "$at"
1024
1070
  __tt_map_tip "$REPLY"
1025
1071
  tip=$REPLY
1026
- (( color )) && [[ -z $tip ]] && tip=$'\e[2m'
1072
+ (( color )) && [[ -z $tip ]] && tip=$TTHEME_SGR[dim]
1027
1073
  for (( i = 1; i <= ${#ks}; i++ )); do
1028
1074
  __tt_map_chain "$ks[i]" "${ks[i]:t}"
1029
1075
  if (( i < ${#ks} )); then
1030
- __tt_map_line "$reply[1]" "$pre$tip├─ $z" $(( $3 + 3 )) "$reply[2]"
1031
- __tt_map_walk "$reply[1]" "$pre$tip│ $z" $(( $3 + 3 ))
1076
+ __tt_map_line "$reply[1]" "$pre$tip├── $z" $(( $3 + 4 )) "$reply[2]/"
1077
+ __tt_map_walk "$reply[1]" "$pre$tip│ $z" $(( $3 + 4 ))
1032
1078
  else
1033
- __tt_map_line "$reply[1]" "$pre$tip└─ $z" $(( $3 + 3 )) "$reply[2]"
1034
- __tt_map_walk "$reply[1]" "$pre " $(( $3 + 3 ))
1079
+ __tt_map_line "$reply[1]" "$pre$tip└── $z" $(( $3 + 4 )) "$reply[2]/"
1080
+ __tt_map_walk "$reply[1]" "$pre " $(( $3 + 4 ))
1035
1081
  fi
1036
1082
  done
1037
1083
  }
@@ -1072,8 +1118,8 @@ __tt_map_build() {
1072
1118
  }
1073
1119
 
1074
1120
  __tt_map_fit() {
1075
- local b=$'\e[1m' d=$'\e[2m' y=$'\e[33m' r=$'\e[31m' z=$'\e[0m' lab line tag tip note REPLY
1076
- local -i width=$1 i lvl maxw namew need wr cap
1121
+ local b=$TTHEME_SGR[bold] d=$TTHEME_SGR[dim] y=$TTHEME_SGR[warn] r=$TTHEME_SGR[error] z=$TTHEME_SGR[reset] lab line tag tip note REPLY
1122
+ local -i width=$1 i lvl maxw namew need wr cap short
1077
1123
  local -a lw=() rw=() cut=()
1078
1124
  (( color )) || b= d= y= r= z=
1079
1125
  reply=()
@@ -1112,11 +1158,16 @@ __tt_map_fit() {
1112
1158
  (( lvl > 3 )) && lvl=3
1113
1159
  cut=()
1114
1160
  if (( need > width )); then
1115
- cap=0
1161
+ cap=0 short=0
1116
1162
  for (( i = 1; i <= ${#ll}; i++ )); do
1117
1163
  (( rw[i] > cap )) && cap=$rw[i]
1164
+ (( rw[i] && lw[i] - ${(m)#ll[i]} + 1 > short )) && short=$(( lw[i] - ${(m)#ll[i]} + 1 ))
1118
1165
  done
1119
1166
  cap=$(( width - cap ))
1167
+ if (( short > cap )); then
1168
+ short=$(( short - cap > namew - 4 ? namew - 4 : short - cap ))
1169
+ (( short > 0 )) && (( namew -= short, cap += short ))
1170
+ fi
1120
1171
  maxw=0
1121
1172
  for (( i = 1; i <= ${#ll}; i++ )); do
1122
1173
  wr=$(( rw[i] ? cap : width ))
@@ -1165,16 +1216,30 @@ __tt_map_fit() {
1165
1216
  fi
1166
1217
  fi
1167
1218
  while [[ $line == *' ' ]]; do line=${line% }; done
1219
+ if (( need > width )); then
1220
+ __tt_clip "$line" $width
1221
+ line=$REPLY
1222
+ fi
1168
1223
  reply+=("$line")
1169
1224
  done
1170
1225
  }
1171
1226
 
1172
1227
  __tt_map_ssh() {
1173
- local k name flag
1174
- for k in ${(oi)${(M)${(k)TTHEME_PINS}:#ssh:*}}; do
1175
- name=$TTHEME_PINS[$k] flag=""
1228
+ local k name flag tip=$TTHEME_SGR[dim] z=$TTHEME_SGR[reset]
1229
+ local -a ks=(${(oi)${(M)${(k)TTHEME_PINS}:#ssh:*}})
1230
+ local -i i
1231
+ (( ${#ks} )) || return 0
1232
+ (( color )) || tip= z=
1233
+ lp+=("") lpw+=(0) ll+=(ssh) lat+=(ssh:) lpal+=("") lnote+=("") lflag+=("")
1234
+ for (( i = 1; i <= ${#ks}; i++ )); do
1235
+ k=$ks[i] name=$TTHEME_PINS[$ks[i]] flag=""
1176
1236
  [[ -n ${TTHEME_PALETTE[$name]} ]] || flag="not installed"
1177
- lp+=("") lpw+=(0) ll+=("ssh ${k#ssh:}") lat+=("$k") lpal+=("$name") lnote+=("while connected") lflag+=("$flag")
1237
+ if (( i < ${#ks} )); then
1238
+ lp+=("$tip├── $z")
1239
+ else
1240
+ lp+=("$tip└── $z")
1241
+ fi
1242
+ lpw+=(4) ll+=("${k#ssh:}") lat+=("$k") lpal+=("$name") lnote+=("while connected") lflag+=("$flag")
1178
1243
  done
1179
1244
  }
1180
1245
 
@@ -1193,7 +1258,7 @@ __tt_map_tree() {
1193
1258
  print -r -- "$REPLY"
1194
1259
  __tt_tilde "$TTHEME_PINS_FILE"
1195
1260
  if (( color )); then
1196
- __tt_clip $'\e[2m'"ttheme pin picks one here · ttheme unpin drops one · $REPLY"$'\e[0m' $width
1261
+ __tt_clip $TTHEME_SGR[dim]"ttheme pin picks one here · ttheme unpin drops one · $REPLY"$TTHEME_SGR[reset] $width
1197
1262
  else
1198
1263
  __tt_clip "ttheme pin picks one here · ttheme unpin drops one · $REPLY" $width
1199
1264
  fi
@@ -1228,7 +1293,7 @@ __tt_keep() {
1228
1293
  __tt_worn_shown $2
1229
1294
  __tt_reload
1230
1295
  if __tt_color; then
1231
- printf '\033[2m%s\033[0m\n' "${(@f)note}"
1296
+ printf "${TTHEME_SGR[dim]}%s${TTHEME_SGR[reset]}\n" "${(@f)note}"
1232
1297
  else
1233
1298
  print -r -- "$note"
1234
1299
  fi
@@ -1311,7 +1376,10 @@ __tt_catalog() {
1311
1376
  __tt_catalog_done() {
1312
1377
  [[ -r $TTHEME_HOME/palettes.zsh ]] || return 0
1313
1378
  local was=$TTHEME_PALETTES_AT
1379
+ local -a reply
1380
+ __tt_specs_named
1314
1381
  if __tt_palettes_load && [[ $TTHEME_PALETTES_AT != "$was" ]]; then
1382
+ __tt_respec $reply
1315
1383
  __tt_reloaded
1316
1384
  fi
1317
1385
  [[ "$TTHEME_STARTUP ${TTHEME_PALETTE[$TTHEME_STARTUP]}" == "$1" ]] && return 0
@@ -1335,14 +1403,16 @@ __tt_switch() {
1335
1403
  }
1336
1404
 
1337
1405
  __tt_config() {
1338
- local blur
1406
+ local blur tab
1339
1407
  if [[ ! -e $TTHEME_CONFIG ]]; then
1340
1408
  mkdir -p ${TTHEME_CONFIG:h} || return 1
1341
1409
  __tt_put $TTHEME_CONFIG "$TTHEME_CONFIG_TEMPLATE"
1342
1410
  fi
1343
1411
  blur=${(M)${(@f)"$(<$TTHEME_CONFIG)"}:#': ${TTHEME_BG_BLUR:='*}
1412
+ tab=${(M)${(@f)"$(<$TTHEME_CONFIG)"}:#': ${TTHEME_TAB_PALETTE:='*}
1344
1413
  ${=${VISUAL:-${EDITOR:-vi}}} $TTHEME_CONFIG || return
1345
1414
  [[ ${(M)${(@f)"$(<$TTHEME_CONFIG)"}:#': ${TTHEME_BG_BLUR:='*} == "$blur" ]] || __tt_redraw
1415
+ [[ ${(M)${(@f)"$(<$TTHEME_CONFIG)"}:#': ${TTHEME_TAB_PALETTE:='*} == "$tab" ]] || { __tt_cli sync && __tt_reload }
1346
1416
  print -r -- "Settings apply in new tabs — $TTHEME_CONFIG"
1347
1417
  }
1348
1418
 
@@ -1429,7 +1499,7 @@ __tt_next() {
1429
1499
  REPLY=${TTHEME_PALETTE[$TTHEME_ORDER[idx]]}
1430
1500
  }
1431
1501
 
1432
- source $TTHEME_HOME/preview.zsh
1502
+ source "$TTHEME_HOME/preview.zsh"
1433
1503
 
1434
1504
  __tt_hook() {
1435
1505
  autoload -Uz add-zsh-hook add-zle-hook-widget
@@ -1488,7 +1558,12 @@ ttheme() {
1488
1558
  fi
1489
1559
 
1490
1560
  case $1 in
1491
- list|add|remove|update|market|new|edit|check|share) __tt_catalog "$@"; return ;;
1561
+ list|add|remove|update|market|new) __tt_catalog "$@"; return ;;
1562
+ edit|check|share)
1563
+ local REPLY
1564
+ __tt_name_of "$TTHEME_SPEC"
1565
+ TTHEME_WORN=${TTHEME_PALETTE[$REPLY]:+$REPLY} __tt_catalog "$@"
1566
+ return ;;
1492
1567
  on|off) __tt_switch "$@"; return ;;
1493
1568
  info) TTHEME_ZSH=$ZSH_VERSION __tt_cli "$@"; return ;;
1494
1569
  esac