@kecan0406/ttheme 1.2.7 → 1.2.9

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
@@ -33,6 +33,7 @@ __tt_fresh() {
33
33
  __tt_prompt() {
34
34
  emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace}
35
35
  (( TTHEME_FRONT < 0 )) || TTHEME_FRONT=0
36
+ [[ -n $TTHEME_SSH_SPEC ]] && __tt_ssh_back
36
37
  __tt_fresh
37
38
  }
38
39
 
@@ -80,9 +81,15 @@ typeset -g TTHEME_PINS_FILE=${TTHEME_CONFIG:h}/pins
80
81
  typeset -g TTHEME_PINS_RAW="" TTHEME_PINS_AT=""
81
82
  typeset -gA TTHEME_PINS=()
82
83
  typeset -g TTHEME_PIN="" TTHEME_PIN_SPEC="" TTHEME_BASE_SPEC=""
84
+ typeset -g TTHEME_SSH_SPEC="" TTHEME_SSH_BACK=""
83
85
 
84
86
  __tt_tilde() { REPLY=${1/#$HOME\//\~/} }
85
87
 
88
+ __tt_ssh_ok() {
89
+ setopt localoptions extendedglob
90
+ [[ $1 == ssh:[[:alnum:]._*?:-]## ]]
91
+ }
92
+
86
93
  __tt_pins_load() {
87
94
  emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace}
88
95
  setopt localoptions extendedglob
@@ -96,10 +103,16 @@ __tt_pins_load() {
96
103
  TTHEME_PINS=()
97
104
  for line in "${(@f)raw}"; do
98
105
  line=${line%%[[:space:]]##}
99
- [[ $line == [~/]*[[:space:]]* ]] || continue
106
+ [[ $line == ([~/]|ssh:)*[[:space:]]* ]] || continue
100
107
  name=${line##*[[:space:]]} key=${${line%[[:space:]]*}%%[[:space:]]##}
101
- [[ $key == \~ ]] && key=$HOME
102
- TTHEME_PINS[${key/#\~\//$HOME/}]=$name
108
+ if [[ $key == ssh:* ]]; then
109
+ key=ssh:${(L)key#ssh:}
110
+ __tt_ssh_ok $key || continue
111
+ TTHEME_PINS[$key]=$name
112
+ else
113
+ [[ $key == \~ ]] && key=$HOME
114
+ TTHEME_PINS[${key/#\~\//$HOME/}]=$name
115
+ fi
103
116
  [[ -n ${TTHEME_PALETTE[$name]} ]] || print -u2 "ttheme: unknown palette '$name' pinned to $key"
104
117
  done
105
118
  }
@@ -261,35 +274,10 @@ __tt_empty() {
261
274
  return 1
262
275
  }
263
276
 
264
- __tt_spec() {
265
- local spec=${TTHEME_PALETTE[$1]}
266
- [[ -n $spec ]] || return 1
267
- print -r -- "$spec"
268
- }
269
-
270
277
  __tt_name_of() { REPLY=${${(k)TTHEME_PALETTE[(re)$1]}:-custom} }
271
278
 
272
279
  __tt_color() { [[ -t 1 && -z $NO_COLOR && $TERM != dumb ]] }
273
280
 
274
- __tt_palette_line() {
275
- local name=$1 width=$2 on=$3 label=${4:-$1} hex cell="" bar=""
276
- local -a p=(${=TTHEME_PALETTE[$name]}) sw=(${=TTHEME_SWATCH[$name]})
277
- (( ${#p} >= 20 )) || return 1
278
- for hex in $sw; do
279
- hex=${hex#\#}
280
- cell+=$'\e[38;2;'$((16#${hex:0:2}))';'$((16#${hex:2:2}))';'$((16#${hex:4:2}))'m■ '
281
- done
282
- if [[ -n $on ]]; then
283
- local cur=${p[3]#\#} sel=${p[4]#\#} fg=${p[2]#\#} ac
284
- printf -v ac '\e[38;2;%d;%d;%dm' $((16#${cur:0:2})) $((16#${cur:2:2})) $((16#${cur:4:2}))
285
- printf -v bar '\e[48;2;%d;%d;%d;38;2;%d;%d;%dm' \
286
- $((16#${sel:0:2})) $((16#${sel:2:2})) $((16#${sel:4:2})) $((16#${fg:0:2})) $((16#${fg:2:2})) $((16#${fg:4:2}))
287
- printf '%s▌\e[39m %s %s■\e[39m \e[1m%-*s\e[22m %s\e[0m\n' "$ac" "$bar" "$ac" "$width" "$label" "$cell"
288
- else
289
- printf ' %-*s %s\e[0m\n' "$width" "$label" "$cell"
290
- fi
291
- }
292
-
293
281
  __tt_announce() {
294
282
  (( TTHEME_ANNOUNCE )) || return 0
295
283
  local -a p=(${=TTHEME_SPEC})
@@ -312,7 +300,7 @@ __tt_announce() {
312
300
  __tt_dir_rule() {
313
301
  local k base best="" bestlen=-1 p=${1:A}
314
302
  for k in ${(k)TTHEME_PINS}; do
315
- [[ -n ${TTHEME_PALETTE[$TTHEME_PINS[$k]]} ]] || continue
303
+ [[ $k == /* && -n ${TTHEME_PALETTE[$TTHEME_PINS[$k]]} ]] || continue
316
304
  base=${${k%/\*\*}:A}
317
305
  if [[ $k == *"/**" ]]; then
318
306
  [[ $p == "$base" || $p == "${base%/}"/* ]] || continue
@@ -395,10 +383,77 @@ __tt_focus() {
395
383
  fi
396
384
  }
397
385
 
386
+ __tt_ssh_host() {
387
+ setopt localoptions extendedglob
388
+ local w o host=""
389
+ local -a words=(${(z)1})
390
+ local -i i=1 tty=0 ended=0
391
+ while [[ ${words[i]} == ([[:alpha:]_][[:alnum:]_]#=*|command|exec|noglob|nocorrect|-) ]]; do (( ++i )); done
392
+ [[ ${${(Q)words[i]}:t} == ssh ]] || return 1
393
+ for (( ++i; i <= ${#words}; i++ )); do
394
+ case ${words[i]} in
395
+ ('&&'|'||'|';'|';;'|';&'|';|') break ;;
396
+ ('2>'|'2>>'|'2>|'|'2>&') (( ++i )); continue ;;
397
+ ('&'|'&!'|'&|'|'|'|'|&'|[0-9]#[\<\>]*|'&>'*) return 1 ;;
398
+ esac
399
+ w=${(Q)words[i]}
400
+ if (( ! ended )) && [[ $w == -?* ]]; then
401
+ [[ $w == -- ]] && { ended=1; continue }
402
+ o=${w#-}
403
+ while [[ -n $o ]]; do
404
+ case ${o[1]} in
405
+ (t) (( ++tty )) ;;
406
+ ([fGNnsTVOQW]) return 1 ;;
407
+ ([BbcDEeFIiJLlmoPpRSw]) [[ -n ${o[2,-1]} ]] || (( ++i )); break ;;
408
+ esac
409
+ o=${o[2,-1]}
410
+ done
411
+ continue
412
+ fi
413
+ if [[ -n $host ]]; then
414
+ (( tty )) || return 1
415
+ break
416
+ fi
417
+ host=$w
418
+ done
419
+ [[ $host == ssh://* ]] && host=${${host#ssh://}%:<->}
420
+ REPLY=${(L)${${host##*@}#\[}%\]}
421
+ [[ -n $REPLY ]]
422
+ }
423
+
424
+ __tt_ssh_rule() {
425
+ local k best=""
426
+ [[ -n ${TTHEME_PALETTE[${TTHEME_PINS[ssh:$1]}]} ]] && { REPLY=ssh:$1; return 0 }
427
+ for k in ${(k)TTHEME_PINS}; do
428
+ [[ $k == ssh:*[*?]* && -n ${TTHEME_PALETTE[$TTHEME_PINS[$k]]} && $1 == ${~k#ssh:} ]] || continue
429
+ (( ${#k} > ${#best} )) && best=$k
430
+ done
431
+ [[ -n $best ]] || return 1
432
+ REPLY=$best
433
+ }
434
+
435
+ __tt_ssh_back() {
436
+ local back=$TTHEME_SSH_BACK worn=$TTHEME_SSH_SPEC
437
+ TTHEME_SSH_BACK="" TTHEME_SSH_SPEC=""
438
+ [[ $TTHEME_SPEC == "$worn" && $back != "$worn" ]] || return 0
439
+ if [[ -n $back ]]; then
440
+ __tt_wear "$back"
441
+ else
442
+ __tt_osc_reset
443
+ TTHEME_SPEC=
444
+ fi
445
+ }
446
+
398
447
  __tt_ran() {
399
448
  emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace}
449
+ local REPLY name
400
450
  TTHEME_RAN=1
401
451
  [[ ${${(z)3}[1]:t} == tmux ]] && TTHEME_MUXED=1
452
+ [[ $3 == *ssh* ]] && __tt_ssh_host "$3" && __tt_ssh_rule "$REPLY" || return 0
453
+ name=$TTHEME_PINS[$REPLY]
454
+ TTHEME_SSH_BACK=$TTHEME_SPEC TTHEME_SSH_SPEC=$TTHEME_PALETTE[$name]
455
+ [[ $TTHEME_SSH_SPEC == "$TTHEME_SPEC" ]] || __tt_wear "$TTHEME_SSH_SPEC" "$name"
456
+ return 0
402
457
  }
403
458
 
404
459
  __tt_unmux() {
@@ -468,13 +523,24 @@ __tt_dir_label() {
468
523
  }
469
524
 
470
525
  __tt_pin_scope() {
471
- if [[ $1 == *"/**" ]]; then
526
+ if [[ $1 == ssh:* ]]; then
527
+ REPLY="while connected"
528
+ elif [[ $1 == *"/**" ]]; then
472
529
  REPLY="and below"
473
530
  else
474
531
  REPLY="this directory"
475
532
  fi
476
533
  }
477
534
 
535
+ __tt_pin_where() {
536
+ if [[ $1 == ssh:* ]]; then
537
+ REPLY="ssh ${1#ssh:}"
538
+ else
539
+ __tt_pin_base "$1"
540
+ __tt_dir_label "$REPLY"
541
+ fi
542
+ }
543
+
478
544
  __tt_repo() {
479
545
  local at=${1:a}
480
546
  while [[ $at != / ]]; do
@@ -501,6 +567,11 @@ __tt_pin_cover() {
501
567
 
502
568
  __tt_pin_scopes() {
503
569
  local d=${1:a} k
570
+ if [[ $1 == ssh:* ]]; then
571
+ plabel=(" This host ") pkeys=("$1") pkdef=1
572
+ [[ $1 == *[*?]* ]] && plabel=(" Every match ")
573
+ return 0
574
+ fi
504
575
  plabel=(" This directory " " And below ") pkeys=("$d" "${d%/}/**") pkdef=2
505
576
  if __tt_repo "$d" && [[ $REPLY != "$d" ]]; then
506
577
  plabel+=(" Repository ") pkeys+=("$REPLY/**")
@@ -514,26 +585,30 @@ __tt_pin_scopes() {
514
585
  }
515
586
 
516
587
  __tt_pin_save() {
517
- local name=$1 key=$2 k base spec REPLY
518
- __tt_pin_base "$key"
519
- base=$REPLY
520
- for k in ${(k)TTHEME_PINS}; do
521
- [[ $k == /* ]] || continue
522
- __tt_pin_base "$k"
523
- [[ $REPLY == "$base" ]] && unset "TTHEME_PINS[$k]"
524
- done
588
+ local name=$1 key=$2 k base spec=$3 REPLY
589
+ if [[ $key == /* ]]; then
590
+ __tt_pin_base "$key"
591
+ base=$REPLY
592
+ for k in ${(k)TTHEME_PINS}; do
593
+ [[ $k == /* ]] || continue
594
+ __tt_pin_base "$k"
595
+ [[ $REPLY == "$base" ]] && unset "TTHEME_PINS[$k]"
596
+ done
597
+ fi
525
598
  TTHEME_PINS[$key]=$name
526
599
  if ! __tt_pins_write; then
527
600
  print -u2 "ttheme pin: could not write $TTHEME_PINS_FILE"
528
601
  return 1
529
602
  fi
530
- [[ -n $TTHEME_PIN ]] || TTHEME_BASE_SPEC=$3
531
- if __tt_dir_rule "$PWD"; then
532
- spec=${TTHEME_PALETTE[$TTHEME_PINS[$REPLY]]}
533
- TTHEME_PIN=$REPLY TTHEME_PIN_SPEC=$spec
534
- else
535
- spec=$TTHEME_BASE_SPEC
536
- TTHEME_PIN="" TTHEME_PIN_SPEC=""
603
+ if [[ $key == /* ]]; then
604
+ [[ -n $TTHEME_PIN ]] || TTHEME_BASE_SPEC=$3
605
+ if __tt_dir_rule "$PWD"; then
606
+ spec=${TTHEME_PALETTE[$TTHEME_PINS[$REPLY]]}
607
+ TTHEME_PIN=$REPLY TTHEME_PIN_SPEC=$spec
608
+ else
609
+ spec=$TTHEME_BASE_SPEC
610
+ TTHEME_PIN="" TTHEME_PIN_SPEC=""
611
+ fi
537
612
  fi
538
613
  if [[ $spec != "$TTHEME_SPEC" ]]; then
539
614
  if [[ -n $spec ]]; then
@@ -543,7 +618,7 @@ __tt_pin_save() {
543
618
  TTHEME_SPEC=
544
619
  fi
545
620
  fi
546
- __tt_dir_label "$base"
621
+ __tt_pin_where "$key"
547
622
  k=$REPLY
548
623
  __tt_pin_scope "$key"
549
624
  if __tt_color; then
@@ -551,7 +626,7 @@ __tt_pin_save() {
551
626
  else
552
627
  print -r -- "Pinned · $name → $k · $REPLY"
553
628
  fi
554
- if [[ $TTHEME_PIN != "$key" ]]; then
629
+ if [[ $key == /* && $TTHEME_PIN != "$key" ]]; then
555
630
  __tt_here_line Here
556
631
  print -r -- "$REPLY"
557
632
  fi
@@ -560,10 +635,11 @@ __tt_pin_save() {
560
635
  __tt_unpin_drop() {
561
636
  local k REPLY where
562
637
  local -a gone=()
638
+ local -i dirs=0
563
639
  for k in "$@"; do
564
640
  [[ -n ${TTHEME_PINS[$k]} ]] || continue
565
- __tt_pin_base "$k"
566
- __tt_dir_label "$REPLY"
641
+ [[ $k == /* ]] && dirs=1
642
+ __tt_pin_where "$k"
567
643
  where=$REPLY
568
644
  __tt_pin_scope "$k"
569
645
  gone+=("Unpinned · ${TTHEME_PINS[$k]} on $where · $REPLY")
@@ -581,6 +657,7 @@ __tt_unpin_drop() {
581
657
  print -r -- "$k"
582
658
  fi
583
659
  done
660
+ (( dirs )) || return 0
584
661
  __tt_here_line Here
585
662
  print -r -- "$REPLY"
586
663
  }
@@ -735,6 +812,15 @@ __tt_unpin() {
735
812
  local -i chosen=0 color=0
736
813
  __tt_color && color=1
737
814
  __tt_pins_load
815
+ if [[ $1 == ssh:* ]]; then
816
+ k=ssh:${(L)1#ssh:}
817
+ if [[ -z ${TTHEME_PINS[$k]} ]]; then
818
+ print -u2 -r -- "ttheme unpin: nothing pinned to ssh ${k#ssh:}"
819
+ return 1
820
+ fi
821
+ __tt_unpin_drop $k
822
+ return
823
+ fi
738
824
  if (( $# )); then
739
825
  d=$1
740
826
  [[ $d == \~ || $d == \~/* ]] && d=$HOME${d#\~}
@@ -1079,12 +1165,22 @@ __tt_map_fit() {
1079
1165
  done
1080
1166
  }
1081
1167
 
1168
+ __tt_map_ssh() {
1169
+ local k name flag
1170
+ for k in ${(oi)${(M)${(k)TTHEME_PINS}:#ssh:*}}; do
1171
+ name=$TTHEME_PINS[$k] flag=""
1172
+ [[ -n ${TTHEME_PALETTE[$name]} ]] || flag="not installed"
1173
+ lp+=("") lpw+=(0) ll+=("ssh ${k#ssh:}") lat+=("$k") lpal+=("$name") lnote+=("while connected") lflag+=("$flag")
1174
+ done
1175
+ }
1176
+
1082
1177
  __tt_map_tree() {
1083
1178
  local home=${HOME:a} here=${PWD:a} htip="" REPLY
1084
1179
  local -A own=() below=() parent=() mark=() tstrip=()
1085
1180
  local -a roots=() lp=() lpw=() ll=() lat=() lpal=() lnote=() lflag=() reply
1086
1181
  local -i width=$(( COLUMNS > 0 ? COLUMNS : 80 ))
1087
1182
  __tt_map_build ""
1183
+ __tt_map_ssh
1088
1184
  __tt_map_fit $width
1089
1185
  print -rl -- "${reply[@]}"
1090
1186
  print
@@ -1143,42 +1239,12 @@ __tt_order() {
1143
1239
  }
1144
1240
 
1145
1241
  __tt_menu() {
1146
- local k cur="" grp last_grp="" shelf last_shelf="" label REPLY
1242
+ local k
1147
1243
  local -a reply
1148
- local -i width=0
1149
1244
  __tt_order
1150
- if ! __tt_color; then
1151
- for k in $reply; do
1152
- printf '%s\t%s\t%s\n' "$k" "${TTHEME_GROUP[$k]:-Other}" "${TTHEME_SRC[$k]:-unknown}"
1153
- done
1154
- return 0
1155
- fi
1156
- [[ -n $TTHEME_SPEC ]] && __tt_name_of "$TTHEME_SPEC" && cur=$REPLY
1157
1245
  for k in $reply; do
1158
- label=${k##*/}
1159
- [[ -n ${TTHEME_CATALOG[$k]} && ${TTHEME_GROUP[$k]} == *@* ]] && label=" $label"
1160
- (( ${#label} > width )) && width=${#label}
1246
+ printf '%s\t%s\t%s\n' "$k" "${TTHEME_GROUP[$k]:-Other}" "${TTHEME_SRC[$k]:-unknown}"
1161
1247
  done
1162
- for k in $reply; do
1163
- grp=${TTHEME_GROUP[$k]:-Other}
1164
- if [[ $grp != $last_grp ]]; then
1165
- [[ $grp == *@* && $last_grp != *@* && -n $last_grp ]] && printf ' \033[2m── Markets ──────────\033[0m\n'
1166
- printf ' \033[1m%s\033[0m' "$grp"
1167
- [[ -n ${TTHEME_NATIVE[$k]} ]] && printf ' \033[2m%s\033[0m' "${TTHEME_NATIVE[$k]}"
1168
- printf '\n'
1169
- last_grp=$grp last_shelf=""
1170
- fi
1171
- shelf=""
1172
- [[ $grp == *@* ]] && shelf=${TTHEME_CATALOG[$k]}
1173
- if [[ -n $shelf && $shelf != "$last_shelf" ]]; then
1174
- printf ' \033[1m%s\033[0m\n' "$shelf"
1175
- last_shelf=$shelf
1176
- fi
1177
- label=${k##*/}
1178
- [[ -n $shelf ]] && label=" $label"
1179
- __tt_palette_line "$k" $width "${${(M)k:#$cur}:+1}" "$label"
1180
- done
1181
- printf '\n \033[2mttheme use <palette> paints this tab · ttheme preview · ttheme help\033[0m\n'
1182
1248
  }
1183
1249
 
1184
1250
  __tt_help() {
@@ -1231,14 +1297,17 @@ __tt_cli() {
1231
1297
  }
1232
1298
 
1233
1299
  __tt_catalog() {
1234
- local was
1300
+ local was="$TTHEME_STARTUP ${TTHEME_PALETTE[$TTHEME_STARTUP]}"
1235
1301
  __tt_cli "$@" || return
1236
1302
  [[ $1 == (list|share) ]] && return 0
1303
+ __tt_catalog_done "$was"
1304
+ }
1305
+
1306
+ __tt_catalog_done() {
1237
1307
  [[ -r $TTHEME_HOME/palettes.zsh ]] || return 0
1238
- was="$TTHEME_STARTUP ${TTHEME_PALETTE[$TTHEME_STARTUP]}"
1239
1308
  __tt_palettes_load && __tt_reloaded
1240
- [[ "$TTHEME_STARTUP ${TTHEME_PALETTE[$TTHEME_STARTUP]}" == "$was" ]] && return 0
1241
- __tt_follow "$was"
1309
+ [[ "$TTHEME_STARTUP ${TTHEME_PALETTE[$TTHEME_STARTUP]}" == "$1" ]] && return 0
1310
+ __tt_follow "$1"
1242
1311
  __tt_worn_shown
1243
1312
  __tt_reload
1244
1313
  }
@@ -1359,1407 +1428,7 @@ __tt_rotate() {
1359
1428
  __tt_announce
1360
1429
  }
1361
1430
 
1362
- __tt_pv_norm() { REPLY=${(L)1//[^[:alnum:]]/} }
1363
-
1364
- __tt_pv_seek() {
1365
- local t part key REPLY
1366
- for t in ${(k)TTHEME_PALETTE}; do
1367
- key=""
1368
- for part in "$t" "${TTHEME_GROUP[$t]:-Other}" "${TTHEME_NATIVE[$t]}" "${TTHEME_CATALOG[$t]}" "${(@s:|:)TTHEME_NATIVE_NAMES[$t]}" "${TTHEME_CHARACTER[$t]}"; do
1369
- [[ -n $part ]] || continue
1370
- __tt_pv_norm "$part"
1371
- key+="|$REPLY"
1372
- done
1373
- pvseek[$t]=$key
1374
- done
1375
- }
1376
-
1377
- __tt_pv_alias() {
1378
- REPLY=""
1379
- [[ -n $nflt && -n $2 ]] || return 0
1380
- local main
1381
- __tt_pv_norm "$1"
1382
- main=$REPLY
1383
- __tt_pv_norm "$2"
1384
- [[ $main != *$nflt* && $REPLY == *$nflt* ]] && REPLY=$2 || REPLY=""
1385
- return 0
1386
- }
1387
-
1388
- __tt_pv_rows() {
1389
- rtype=() rval=() rcnt=()
1390
- local g t c ruled="" nflt="" REPLY
1391
- local -a ts cs loose inside
1392
- if [[ -n $flt ]]; then
1393
- (( ${#pvseek} )) || __tt_pv_seek
1394
- __tt_pv_norm "$flt"
1395
- nflt=$REPLY
1396
- fi
1397
- for g in $groups; do
1398
- ts=()
1399
- for t in ${=gthemes[$g]}; do
1400
- [[ -z $flt || ${pvseek[$t]} == *$nflt* ]] && ts+=($t)
1401
- done
1402
- [[ -n $flt ]] && (( ! ${#ts} )) && continue
1403
- if [[ $g == *@* && -z $ruled ]]; then
1404
- ruled=1
1405
- (( ${#rtype} )) && { rtype+=(rule); rval+=(''); rcnt+=(0) }
1406
- fi
1407
- rtype+=(hdr); rval+=($g); rcnt+=(${#ts})
1408
- [[ -n $flt || -n ${exp[$g]} ]] || continue
1409
- cs=() loose=()
1410
- for t in $ts; do
1411
- c=${TTHEME_CATALOG[$t]}
1412
- if [[ -n $c && $g == *@* ]]; then
1413
- (( ${cs[(Ie)$c]} )) || cs+=($c)
1414
- else
1415
- loose+=($t)
1416
- fi
1417
- done
1418
- for c in $cs; do
1419
- inside=()
1420
- for t in $ts; do
1421
- [[ ${TTHEME_CATALOG[$t]} == "$c" ]] && inside+=($t)
1422
- done
1423
- rtype+=(cat); rval+=("$g/$c"); rcnt+=(${#inside})
1424
- if [[ -n $flt || -n ${exp[$g/$c]} ]]; then
1425
- for t in $inside; do rtype+=(thm); rval+=($t); rcnt+=(0); done
1426
- fi
1427
- done
1428
- for t in $loose; do rtype+=(thm); rval+=($t); rcnt+=(0); done
1429
- done
1430
- }
1431
-
1432
- __tt_pv_at() {
1433
- local i
1434
- for (( i = 1; i <= ${#rval}; i++ )); do
1435
- [[ ${rtype[i]} == (hdr|cat) && ${rval[i]} == "$1" ]] && { cur=$i; return 0 }
1436
- done
1437
- return 0
1438
- }
1439
-
1440
- __tt_pv_first() {
1441
- local name=$1 i
1442
- cur=1 top=1
1443
- if [[ -n $name ]]; then
1444
- for (( i = 1; i <= ${#rval}; i++ )); do
1445
- [[ ${rtype[i]} == thm && ${rval[i]} == $name ]] && { cur=$i; return 0 }
1446
- done
1447
- fi
1448
- for (( i = 1; i <= ${#rtype}; i++ )); do
1449
- [[ ${rtype[i]} == thm ]] && { cur=$i; return 0 }
1450
- done
1451
- return 0
1452
- }
1453
-
1454
- __tt_pv_goto() {
1455
- local name=$1 i g=${TTHEME_GROUP[$1]:-Other} c=${TTHEME_CATALOG[$1]}
1456
- exp[$g]=1
1457
- [[ -n $c && $g == *@* ]] && exp[$g/$c]=1
1458
- __tt_pv_rows
1459
- for (( i = 1; i <= ${#rval}; i++ )); do
1460
- [[ ${rtype[i]} == thm && ${rval[i]} == $name ]] && { cur=$i; return 0 }
1461
- done
1462
- cur=1
1463
- }
1464
-
1465
- __tt_pv_shows() {
1466
- REPLY=${bgview[$1]:-$1}
1467
- [[ -n $tune && $1 == "$tune" ]] && REPLY=$tpick
1468
- return 0
1469
- }
1470
-
1471
- __tt_pv_focus() {
1472
- [[ ${rtype[cur]} == thm ]] || return 0
1473
- __tt_pv_shows ${rval[cur]}
1474
- (( resized )) || [[ $REPLY == "$bgname" ]] || __tt_pv_bg_show "$REPLY"
1475
- local spec=${TTHEME_PALETTE[${rval[cur]}]}
1476
- [[ $spec == "$applied" ]] && return 0
1477
- __tt_pv_paint "$spec"
1478
- applied=$spec
1479
- }
1480
-
1481
- __tt_pv_toggle() {
1482
- [[ -n $flt ]] && return 0
1483
- local g=${rval[cur]}
1484
- if [[ -n ${exp[$g]} ]]; then
1485
- exp[$g]=""
1486
- else
1487
- exp[$g]=1
1488
- fi
1489
- __tt_pv_rows
1490
- }
1491
-
1492
- __tt_pv_left() {
1493
- [[ -n $flt ]] && return 0
1494
- if [[ ${rtype[cur]} == (hdr|cat) ]]; then
1495
- if [[ -n ${exp[${rval[cur]}]} ]]; then
1496
- __tt_pv_toggle
1497
- elif [[ ${rtype[cur]} == cat ]]; then
1498
- __tt_pv_at ${rval[cur]%%/*}
1499
- fi
1500
- return 0
1501
- fi
1502
- local g=${TTHEME_GROUP[${rval[cur]}]:-Other} c=${TTHEME_CATALOG[${rval[cur]}]}
1503
- [[ -n $c && $g == *@* ]] && g=$g/$c
1504
- exp[$g]=""
1505
- __tt_pv_rows
1506
- __tt_pv_at $g
1507
- }
1508
-
1509
- typeset -gA TTHEME_GLYPHS=(
1510
- 0 111101101101111 1 010110010010111 2 111001111100111 3 111001111001111 4 101101111001001
1511
- 5 111100111001111 6 111100111101111 7 111001001001001 8 111101111101111 9 111101111001111
1512
- '%' 101001010100101 F 111100110100100 I 111010010010111 L 100100100100111
1513
- )
1514
-
1515
- __tt_pv_osd() {
1516
- local text=${(U)osd} bits line oc=$'\e[1m' blank
1517
- local -i s=2 n=${#text} w r c k i top left
1518
- (( n * 16 + 4 <= pw && ph >= 14 )) || s=1
1519
- w=$(( n * 8 * s - 2 * s + 4 ))
1520
- top=$(( (ph - 5 * s) / 2 )) left=$(( (pw - w) / 2 + 1 ))
1521
- (( top < 2 )) && top=2
1522
- (( left < 1 )) && left=1
1523
- if (( color )) && [[ ${rtype[cur]} == thm ]]; then
1524
- local -a fp=(${=TTHEME_PALETTE[${rval[cur]}]})
1525
- local fc=${fp[3]#\#}
1526
- printf -v oc '\e[1;38;2;%d;%d;%dm' $((16#${fc:0:2})) $((16#${fc:2:2})) $((16#${fc:4:2}))
1527
- fi
1528
- blank=${(l:w:: :)}
1529
- out+=$'\e['$(( top - 1 ))';'${left}H$blank
1530
- for (( r = 0; r < 5; r++ )); do
1531
- line=" "
1532
- for (( k = 1; k <= n; k++ )); do
1533
- bits=${TTHEME_GLYPHS[${text[k]}]}
1534
- for (( c = 1; c <= 3; c++ )); do
1535
- if [[ ${bits[r * 3 + c]} == 1 ]]; then
1536
- line+=${(l:2*s::█:)}
1537
- else
1538
- line+=${(l:2*s:: :)}
1539
- fi
1540
- done
1541
- (( k < n )) && line+=${(l:2*s:: :)}
1542
- done
1543
- line+=" "
1544
- for (( i = 0; i < s; i++ )); do
1545
- out+=$'\e['$(( top + r * s + i ))';'${left}H$oc$line$'\e[0m'
1546
- done
1547
- done
1548
- out+=$'\e['$(( top + 5 * s ))';'${left}H$blank
1549
- }
1550
-
1551
- __tt_pv_lw() {
1552
- local -i lw=$(( pw - 2 < 48 ? pw - 2 : 48 )) l=$(( pw * 3 / 10 )) sw=$(( pw * 45 / 100 ))
1553
- (( l < 38 )) && l=38
1554
- (( l > 56 )) && l=56
1555
- (( sw > 64 )) && sw=64
1556
- (( sw > pw - l - 6 )) && sw=$(( pw - l - 6 ))
1557
- if (( color && sw >= 32 )); then
1558
- lw=$l
1559
- else
1560
- sw=0
1561
- fi
1562
- reply=($lw $sw)
1563
- }
1564
-
1565
- __tt_pv_hl() {
1566
- local t=$1 lt=${(L)1} pre
1567
- REPLY=$t
1568
- (( color )) && [[ -n $flt && $lt == *$flt* ]] || return 0
1569
- pre=${lt%%$flt*}
1570
- REPLY=${t[1,${#pre}]}$'\e[1;4m'$ac${t[${#pre}+1,${#pre}+${#flt}]}$'\e[22;24;39m'$2${t[${#pre}+${#flt}+1,-1]}
1571
- }
1572
-
1573
- __tt_pv_fit() {
1574
- local extra=$1
1575
- REPLY=""
1576
- [[ -n $extra ]] || return 0
1577
- while [[ -n $extra ]] && (( ${(m)#extra} + 3 > w )); do
1578
- extra=${extra[1,-2]}
1579
- done
1580
- [[ -n $extra ]] || return 0
1581
- (( w -= ${(m)#extra} + 2 ))
1582
- REPLY=" "$d$extra$r
1583
- }
1584
-
1585
- __tt_pv_row() {
1586
- local t=${rval[$1]} b=$'\e[1m' d=$'\e[2m' r=$'\e[22;24;39m' z=$'\e[0m' on="" gut=" " base="" lead=$'\e[2m' mark=" " name arrow=▸ ind=" " hl extra part
1587
- local -i w
1588
- (( color )) || b= d= r= z= lead=
1589
- if (( $1 == cur )); then
1590
- gut=$ac"▌"$r" "
1591
- (( color )) && on=$sb
1592
- fi
1593
- if [[ ${rtype[$1]} == rule ]]; then
1594
- name='── Markets '
1595
- REPLY=" "$d$name${(l:lw - 4 - ${#name}::─:)}$z
1596
- return 0
1597
- fi
1598
- if [[ ${rtype[$1]} == hdr ]]; then
1599
- [[ -n $flt || -n ${exp[$t]} ]] && arrow=▾
1600
- name=$t
1601
- (( ${(m)#name} > lw - 10 )) && name="${name[1,lw-11]}…"
1602
- base=$b
1603
- if (( color )) && [[ $t == "$ag" ]]; then
1604
- base+=$ac lead=$ac
1605
- elif (( $1 == cur )); then
1606
- lead=""
1607
- fi
1608
- __tt_pv_hl "$name" "$base"
1609
- hl=$REPLY
1610
- w=$(( lw - 6 - ${(m)#name} - ${#rcnt[$1]} ))
1611
- __tt_pv_alias "$t" "${TTHEME_NATIVE[${${=gthemes[$t]}[1]}]}"
1612
- __tt_pv_fit "$REPLY"
1613
- extra=$REPLY
1614
- (( w < 1 )) && w=1
1615
- REPLY=$gut$on" "$lead$arrow$r" "$base$hl$r$extra${(l:w:: :)}$d${rcnt[$1]}$r" "$z
1616
- return 0
1617
- fi
1618
- if [[ ${rtype[$1]} == cat ]]; then
1619
- [[ -n $flt || -n ${exp[$t]} ]] && arrow=▾
1620
- name=${t#*/}
1621
- (( ${(m)#name} > lw - 12 )) && name="${name[1,lw-13]}…"
1622
- base=$b
1623
- if (( color )) && [[ $t == "$acat" ]]; then
1624
- base+=$ac lead=$ac
1625
- elif (( $1 == cur )); then
1626
- lead=""
1627
- fi
1628
- __tt_pv_hl "$name" "$base"
1629
- w=$(( lw - 8 - ${(m)#name} - ${#rcnt[$1]} ))
1630
- (( w < 1 )) && w=1
1631
- REPLY=$gut$on" "$lead$arrow$r" "$base$REPLY$r${(l:w:: :)}$d${rcnt[$1]}$r" "$z
1632
- return 0
1633
- fi
1634
- if (( $1 == cur )); then
1635
- mark=$ac"■"$r base=$b
1636
- elif [[ -n $cdot && $t == "$cn" ]]; then
1637
- mark=$cdot
1638
- fi
1639
- name=${t##*/}
1640
- [[ -n ${TTHEME_CATALOG[$t]} && ${TTHEME_GROUP[$t]} == *@* ]] && ind=" "
1641
- __tt_pv_hl "$name" "$base"
1642
- hl=$REPLY
1643
- extra=""
1644
- for part in "${(@s:|:)TTHEME_NATIVE_NAMES[$t]}" "${TTHEME_CHARACTER[$t]}"; do
1645
- __tt_pv_alias "$name" "$part"
1646
- [[ -n $REPLY ]] && { extra=$REPLY; break }
1647
- done
1648
- if (( color )); then
1649
- [[ -n ${tstrip[$t]} ]] || __tt_pv_strip $t
1650
- w=$(( lw - 16 - ${#ind} - ${#name} ))
1651
- __tt_pv_fit "$extra"
1652
- (( w < 1 )) && w=1
1653
- REPLY=$gut$on"$ind$mark $base$hl$r$REPLY${(l:w:: :)}${tstrip[$t]} "$z
1654
- else
1655
- REPLY="$gut$ind$mark $hl${extra:+ $extra}"
1656
- fi
1657
- }
1658
-
1659
- __tt_pv_bg_title() {
1660
- local by=${bgby[$tpick]} ref=${bgfrom[$tpick]} url=${bgurl[$tpick]} mark="" sgr=""
1661
- local -i room=$1
1662
- [[ -n $ref && $url == http(s|)://* ]] && (( ${TTHEME_LINKS[(Ie)$TTHEME_ADAPTER]} )) && mark="⧉ "
1663
- REPLY=Background${by:+ · $by}${ref:+ · $mark$ref}$2
1664
- (( ${#REPLY} > room )) && REPLY=Background${by:+ · $by}
1665
- (( ${#REPLY} > room )) && REPLY=Background
1666
- [[ -n $mark && $REPLY == *"$mark$ref"* ]] || return 0
1667
- (( color )) && [[ -n ${TTHEME_SITE_ANSI[${ref%% *}]} ]] && sgr=$'\e[3'${TTHEME_SITE_ANSI[${ref%% *}]}m
1668
- REPLY=${REPLY/"$mark$ref"/$sgr⧉${sgr:+$'\e[39m'} $'\e]8;;'$url$'\e\\'$ref$'\e]8;;\e\\'}
1669
- return 0
1670
- }
1671
-
1672
- __tt_pv_head() {
1673
- local b=$'\e[1m' d=$'\e[2m' z=$'\e[0m' right=$6
1674
- (( color )) || b= d= z=
1675
- out+=$'\e['$1';'$2'H'$b$ac$4$z
1676
- [[ -n $5 ]] && out+=" "$d$5$z
1677
- [[ -n $right ]] && out+=$'\e['$(( $3 - ${(m)#right} + 1 ))'G'$d$right$z
1678
- return 0
1679
- }
1680
-
1681
- __tt_pv_foot() {
1682
- setopt localoptions extendedglob
1683
- 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
1684
- local -a kk=() kl=() seg=()
1685
- local -i end=$1 i lwid rwid room
1686
- (( color )) || b= d= z= y= on=
1687
- if (( color )) && [[ -n $applied && $applied != "$painted" ]]; then
1688
- hex=${${=applied}[8]#\#}
1689
- printf -v y '\e[38;2;%d;%d;%dm' $((16#${hex:0:2})) $((16#${hex:2:2})) $((16#${hex:4:2}))
1690
- fi
1691
- if (( help )); then
1692
- badge=HELP right=$b"? esc"$z$d" close"$z
1693
- elif [[ -n $pick ]]; then
1694
- badge='PREVIEW (APPLY)' lead="$pick →"
1695
- for (( i = 1; i <= ${#plabel}; i++ )); do
1696
- if (( i != pk )); then
1697
- lead+=" "$d${plabel[i]}$z
1698
- elif (( color )); then
1699
- lead+=" "$on${plabel[i]}$z
1700
- else
1701
- lead+=" [${${plabel[i]# }% }]"
1702
- fi
1703
- done
1704
- if [[ $mode == pin ]]; then
1705
- badge='PREVIEW (PIN)'
1706
- __tt_pin_base "${pkeys[pk]}"
1707
- __tt_dir_label "$REPLY"
1708
- note=$REPLY
1709
- elif (( pk == 1 )); then
1710
- note="Until this tab closes"
1711
- else
1712
- note="New tabs · the default palette"
1713
- fi
1714
- kk=(enter) kl=(confirm)
1715
- right=$b"esc"$z$d" back"$z
1716
- elif [[ -n $tune ]]; then
1717
- badge='IMAGE EDIT' kk=(↑↓ ←→ '=' +) kl=(field step reset "reset all")
1718
- if (( tf == 2 )); then
1719
- kl[2]=move kk+=(1-9) kl+=(place)
1720
- elif (( tf == 4 )); then
1721
- kl[2]=switch kk=(${kk:#'='}) kl=("${(@)kl[1,2]}" "reset all")
1722
- else
1723
- kk+=(⇧←→) kl+=(×10)
1724
- fi
1725
- if (( bgoff[$tpick] )); then
1726
- kk+=(space enter) kl+=(show keep)
1727
- else
1728
- kk+=(c space enter) kl+=(colors hide keep)
1729
- fi
1730
- __tt_pv_bg_images $tune
1731
- (( REPLY > 1 )) && { kk+=(', .' D); kl+=("image ×$REPLY" remove) }
1732
- __tt_pv_bg_findable $tune && { kk+=(f); kl+=(find) }
1733
- right=$b"esc"$z$d" undo"$z
1734
- elif (( conf )); then
1735
- badge=CONFIG kk=(↑↓ ←→ enter) kl=(setting value save)
1736
- right=$b"esc"$z$d" undo"$z
1737
- else
1738
- badge=PREVIEW
1739
- [[ -n $flt ]] && badge='PREVIEW (FILTER)'
1740
- if (( ! ${#rval} )); then
1741
- kk=(bksp) kl=(edit)
1742
- elif [[ ${rtype[cur]} == (hdr|cat) ]]; then
1743
- if [[ -z $flt && -n ${exp[${rval[cur]}]} ]]; then
1744
- kk=(←) kl=(close)
1745
- elif [[ -z $flt ]]; then
1746
- kk=(→) kl=(open)
1747
- fi
1748
- else
1749
- kk=(enter) kl=(apply)
1750
- [[ $mode == pin ]] && kl[1]=pin
1751
- if __tt_pv_bg_state ${rval[cur]}; then
1752
- kk+=(tab) kl+=("tune bg")
1753
- elif __tt_pv_bg_findable ${rval[cur]}; then
1754
- kk+=(tab) kl+=("find bg")
1755
- fi
1756
- (( split )) && { kk+=(⇧←→); kl+=(example) }
1757
- [[ -n $flt ]] && { kk+=(bksp); kl+=(edit) }
1758
- fi
1759
- kk+=('?') kl+=(keys)
1760
- if [[ -n $flt ]]; then
1761
- right=$b"esc"$z$d" clear filter"$z
1762
- else
1763
- right=$b"esc"$z$d" restore"$z
1764
- [[ -n $cdot ]] && right+=" $cdot$z $cn"
1765
- fi
1766
- fi
1767
- if (( msgt > 0 )) && [[ -z $pick ]]; then
1768
- text=$msg
1769
- room=$(( end - (${#badge} ? ${#badge} + 4 : 0) ))
1770
- if (( ${(m)#text} > room )); then
1771
- while [[ -n $text ]] && (( ${(m)#text} > room - 1 )); do text=${text[1,-2]}; done
1772
- text+=…
1773
- fi
1774
- lead=$y$text$z note="" kk=() kl=()
1775
- fi
1776
- while :; do
1777
- seg=()
1778
- [[ -n $lead ]] && seg+=("$lead")
1779
- [[ -n $note ]] && seg+=("$d$note$z")
1780
- for (( i = 1; i <= ${#kk}; i++ )); do
1781
- seg+=("$b${kk[i]}$z$d ${kl[i]}$z")
1782
- done
1783
- line=${(j: :)seg}
1784
- if [[ -n $badge ]]; then
1785
- if (( color )); then
1786
- line=$'\e[7;1m'$ac" $badge "$z" "$line
1787
- else
1788
- line="[$badge] $line"
1789
- fi
1790
- fi
1791
- plain=${line//$'\e'\[[0-9;]##m/}
1792
- lwid=${(m)#plain}
1793
- plain=${right//$'\e'\[[0-9;]##m/}
1794
- rwid=${(m)#plain}
1795
- (( lwid <= end && (! rwid || lwid + 3 + rwid <= end) )) && break
1796
- if [[ -n $note ]]; then
1797
- note=""
1798
- elif (( ${#kk} > 2 )); then
1799
- kk[-2]=() kl[-2]=()
1800
- elif [[ -n $right ]]; then
1801
- right=""
1802
- elif (( ${#kk} > 1 )); then
1803
- kk[-2]=() kl[-2]=()
1804
- else
1805
- break
1806
- fi
1807
- done
1808
- out+=$line$'\e[K'
1809
- [[ -n $right ]] && out+=$'\e['$(( end - rwid + 1 ))'G'$right
1810
- return 0
1811
- }
1812
-
1813
- __tt_pv_help() {
1814
- local back="the tab" z=$'\e[0m' b=$'\e[1m' blank
1815
- [[ -n ${TTHEME_PALETTE[$cn]} ]] && back=$cn
1816
- local -a hk=(Move Series Filter "" Example Apply) hv=(
1817
- "↑↓ home end pgup pgdn"
1818
- "←→ · enter or space on a series"
1819
- "Any text · bksp · ctrl-u clears"
1820
- "Names and titles, in Japanese too"
1821
- "⇧←→ ${(Lj:, :)TTHEME_SCENES}"
1822
- "enter · esc restores $back"
1823
- )
1824
- if (( bgcw )); then
1825
- hk+=("Tune bg" "" "" "" "" "" "")
1826
- hv+=("tab · finds one on the boorus, or takes your own, if none" "↑↓ field ←→ step ⇧←→ ×10 1-9 place" "= resets a field · + resets all" "space hides · enter keeps · esc undoes" "c tone ↔ the picture's own colors" ", . other pictures · D removes one" "f adds one from the boorus or your own")
1827
- fi
1828
- hk+=(Config "")
1829
- hv+=("alt-c · ↑↓ setting ←→ value" "enter saves · esc undoes")
1830
- hk+=(Close)
1831
- hv+=("? esc")
1832
- (( color )) || z= b=
1833
- local -i i r x y w hh
1834
- if (( split && sw >= 48 )); then
1835
- for (( i = 1; i <= ${#hk}; i++ )); do
1836
- r=$(( i + 3 ))
1837
- (( r < ph )) || break
1838
- out+=$'\e['$r';'$sc'H'$b${hk[i]}$z$'\e['$r';'$(( sc + 10 ))'H'${hv[i][1,se-sc-9]}
1839
- done
1840
- return 0
1841
- fi
1842
- w=$(( pw - 2 < 58 ? pw - 2 : 58 )) hh=$(( ${#hk} + 4 ))
1843
- x=$(( (pw - w) / 2 + 1 )) y=$(( (ph - hh) / 2 ))
1844
- (( y < 4 )) && y=4
1845
- blank=${(l:w:: :)}
1846
- out+=$'\e['$y';'$x'H'"╭─ Help ${(l:$(( w - 9 ))::─:)}╮"
1847
- for (( r = y + 1; r < y + hh - 1; r++ )); do
1848
- out+=$'\e['$r';'$x'H'$blank$'\e['$r';'$x'H│'$'\e['$r';'$(( x + w - 1 ))'H│'
1849
- done
1850
- for (( i = 1; i <= ${#hk}; i++ )); do
1851
- r=$(( y + 1 + i ))
1852
- out+=$'\e['$r';'$(( x + 3 ))'H'$b${hk[i]}$z$'\e['$r';'$(( x + 13 ))'H'${hv[i][1,w-16]}
1853
- done
1854
- out+=$'\e['$(( y + hh - 1 ))';'$x'H'"╰${(l:$(( w - 2 ))::─:)}╯"
1855
- }
1856
-
1857
- __tt_pv_specimen() {
1858
- local -a sp=(${=applied}) lines parts
1859
- (( ${#sp} >= 20 )) || return 0
1860
- local z=$'\e[0m' d=$'\e[2m' cell hex fore line text piece role tabs="" built="" key="$applied|$painted|$scene|$sw|$sc|$ph"
1861
- local -A rs=(p "" d $'\e[2m' b $'\e[1m')
1862
- local -i i r=6 cw=4 k n=${#TTHEME_SCENES} at
1863
- (( n )) || return 0
1864
- if [[ $key == "$pvscene" ]]; then
1865
- out+=$pvscenes
1866
- return 0
1867
- fi
1868
- at=$(( (scene % n + n) % n + 1 ))
1869
- if [[ $applied == "$painted" ]]; then
1870
- for (( i = 0; i < 16; i++ )); do
1871
- k=$(( i < 8 ? 30 + i : 82 + i ))
1872
- rs[$i]=$'\e['$k'm' rs[B$i]=$'\e[1;'$k'm' rs[K$i]=$'\e[30;'$(( k + 10 ))'m'
1873
- done
1874
- else
1875
- fore=${sp[5]#\#}
1876
- for (( i = 0; i < 16; i++ )); do
1877
- hex=${sp[i+5]#\#}
1878
- printf -v cell '\e[38;2;%d;%d;%dm' $((16#${hex:0:2})) $((16#${hex:2:2})) $((16#${hex:4:2}))
1879
- rs[$i]=$cell
1880
- printf -v cell '\e[38;2;%d;%d;%d;48;2;%d;%d;%dm' $((16#${fore:0:2})) $((16#${fore:2:2})) $((16#${fore:4:2})) \
1881
- $((16#${hex:0:2})) $((16#${hex:2:2})) $((16#${hex:4:2}))
1882
- rs[K$i]=$cell
1883
- hex=${sp[(i < 8 ? i + 13 : i + 5)]#\#}
1884
- printf -v cell '\e[1;38;2;%d;%d;%dm' $((16#${hex:0:2})) $((16#${hex:2:2})) $((16#${hex:4:2}))
1885
- rs[B$i]=$cell
1886
- done
1887
- fi
1888
- printf -v cell '\e[48;2;%d;%d;%dm' $((16#${sp[4]:1:2})) $((16#${sp[4]:3:2})) $((16#${sp[4]:5:2}))
1889
- rs[s]=$cell
1890
- printf -v cell '\e[48;2;%d;%d;%dm' $((16#${sp[3]:1:2})) $((16#${sp[3]:3:2})) $((16#${sp[3]:5:2}))
1891
- rs[c]=$cell
1892
- if (( ${#${(j: :)TTHEME_SCENES}} <= sw )); then
1893
- for (( k = 1; k <= n; k++ )); do
1894
- (( k > 1 )) && tabs+=" "
1895
- if (( k == at )); then
1896
- tabs+=$'\e[1m'$ac$TTHEME_SCENES[k]$z
1897
- else
1898
- tabs+=$d$TTHEME_SCENES[k]$z
1899
- fi
1900
- done
1901
- else
1902
- tabs=$'\e[1m'$ac$TTHEME_SCENES[at]$z" "$d"$at/$n"$z
1903
- fi
1904
- built+=$'\e[2;'$sc'H'$tabs
1905
- (( sw < 44 )) && cw=3
1906
- (( sw >= 56 )) && cw=$(( (sw + 1) / 8 - 1 ))
1907
- (( cw > 7 )) && cw=7
1908
- line=""
1909
- for (( i = 0; i < 8; i++ )); do
1910
- fore=${sp[i+5]#\#} hex=${sp[i+13]#\#}
1911
- printf -v cell '\e[38;2;%d;%d;%d;48;2;%d;%d;%dm%s\e[0m ' \
1912
- $((16#${fore:0:2})) $((16#${fore:2:2})) $((16#${fore:4:2})) \
1913
- $((16#${hex:0:2})) $((16#${hex:2:2})) $((16#${hex:4:2})) "${(l:cw::▀:)}"
1914
- line+=$cell
1915
- done
1916
- built+=$'\e[4;'$sc'H'$line
1917
- lines=("${(@P)${:-TTHEME_SCENE_$at}}")
1918
- for line in "${lines[@]}"; do
1919
- [[ $line == «w»* ]] && (( sw < 44 )) && continue
1920
- [[ $line == «n»* ]] && (( sw >= 44 )) && continue
1921
- (( r < ph )) || break
1922
- parts=("${(@s:«:)line}")
1923
- text=$parts[1]
1924
- for piece in "${(@)parts[2,-1]}"; do
1925
- role=${piece%%»*}
1926
- [[ $role == [wn] ]] && role=p
1927
- text+=$z${rs[${role:-p}]}${piece#*»}
1928
- done
1929
- built+=$'\e['$r';'$sc'H'$text$z
1930
- (( ++r ))
1931
- done
1932
- pvscene=$key pvscenes=$built
1933
- out+=$built
1934
- }
1935
-
1936
- __tt_pv_tune() {
1937
- local -a fields=(size pos op)
1938
- local -i n=1
1939
- local name
1940
- case $key in
1941
- $'\x03') return 1 ;;
1942
- up) tf=$(( tf > 1 ? tf - 1 : 4 )) ;;
1943
- down) tf=$(( tf < 4 ? tf + 1 : 1 )) ;;
1944
- c) (( bgoff[$tpick] )) || __tt_pv_bg_recolor ;;
1945
- left|right|sleft|sright)
1946
- if (( tf == 4 )); then
1947
- (( bgoff[$tpick] )) || __tt_pv_bg_recolor
1948
- return 0
1949
- fi
1950
- [[ $key == *left ]] && n=-1
1951
- [[ $key == s* ]] && (( tf != 2 )) && n=$(( n * 10 ))
1952
- __tt_pv_bg_adjust ${fields[tf]} $n
1953
- ;;
1954
- [1-9])
1955
- tf=2
1956
- __tt_pv_bg_adjust at $key
1957
- ;;
1958
- ' ') __tt_pv_bg_adjust on ;;
1959
- '=') (( tf == 4 )) || __tt_pv_bg_adjust def $tf ;;
1960
- '+') __tt_pv_bg_adjust def ;;
1961
- ',') __tt_pv_bg_pick -1 ;;
1962
- '.') __tt_pv_bg_pick 1 ;;
1963
- D) __tt_pv_bg_drop ;;
1964
- f)
1965
- __tt_pv_bg_findable $tune || return 0
1966
- name=$tune
1967
- __tt_pv_untune
1968
- __tt_pv_bg_find $name
1969
- __tt_pv_tune_open $name
1970
- ;;
1971
- $'\r'|$'\n') __tt_pv_tune_keep ;;
1972
- esc) __tt_pv_untune ;;
1973
- '?') help=1 ;;
1974
- esac
1975
- return 0
1976
- }
1977
-
1978
- __tt_pv_tune_keep() {
1979
- local img was=${bgview[$tune]:-$tune}
1980
- local -i changed=0
1981
- for img in ${(k)tsnaps}; do
1982
- [[ "${bgsize[$img]} ${bgpos[$img]} ${bgop[$img]} ${bgoff[$img]}" == "${tsnaps[$img]}" ]] && continue
1983
- bgedit[$img]=1 changed=1
1984
- done
1985
- if [[ $tpick != "$was" ]]; then
1986
- changed=1
1987
- if [[ $tpick == "$tune" ]]; then
1988
- unset "bgview[$tune]" "bgswap[$tune]"
1989
- else
1990
- bgview[$tune]=$tpick bgswap[$tune]=${tpick##*:}
1991
- fi
1992
- fi
1993
- (( changed )) && msg="Kept · saved when preview closes" msgt=200
1994
- __tt_pv_bg_strip_off
1995
- tune="" tpick="" tsnaps=() bgname=""
1996
- }
1997
-
1998
- __tt_pv_untune() {
1999
- local img
2000
- local -a s
2001
- for img in ${(k)tsnaps}; do
2002
- s=(${=tsnaps[$img]})
2003
- bgsize[$img]=$s[1] bgpos[$img]=$s[2] bgop[$img]=$s[3] bgoff[$img]=$s[4]
2004
- done
2005
- __tt_pv_bg_strip_off
2006
- tune="" tpick="" tsnaps=() bgname=""
2007
- }
2008
-
2009
- __tt_pv_regroup() {
2010
- local ty=${rtype[cur]} v=${rval[cur]} i
2011
- __tt_pv_group
2012
- __tt_pv_rows
2013
- for (( i = 1; i <= ${#rval}; i++ )); do
2014
- [[ ${rtype[i]} == "$ty" && ${rval[i]} == "$v" ]] && { cur=$i; return 0 }
2015
- done
2016
- cur=1
2017
- }
2018
-
2019
- __tt_pv_conf() {
2020
- case $key in
2021
- $'\x03') return 1 ;;
2022
- up) cf=$(( cf > 1 ? cf - 1 : ${#cvars} )) ;;
2023
- down) cf=$(( cf < ${#cvars} ? cf + 1 : 1 )) ;;
2024
- left|sleft) __tt_pv_conf_step -1 ;;
2025
- right|sright) __tt_pv_conf_step 1 ;;
2026
- $'\r'|$'\n') __tt_pv_conf_save ;;
2027
- esc) __tt_pv_unconf ;;
2028
- '?') help=1 ;;
2029
- esac
2030
- return 0
2031
- }
2032
-
2033
- __tt_pv_conf_step() {
2034
- local var=${cvars[cf]}
2035
- local -a ch=(${=cchoice[cf]})
2036
- local -i i=${ch[(Ie)${(P)var}]}
2037
- (( i += $1 ))
2038
- (( i >= 1 && i <= ${#ch} )) || return 0
2039
- __tt_pv_conf_put $var ${ch[i]}
2040
- }
2041
-
2042
- __tt_pv_conf_put() {
2043
- [[ ${(P)1} == "$2" ]] && return 0
2044
- typeset -g "$1=$2"
2045
- case $1 in
2046
- TTHEME_SORT) __tt_pv_regroup ;;
2047
- TTHEME_FX) [[ -n $flt ]] || { __tt_pv_roll; gstep=8 } ;;
2048
- TTHEME_TAB_PALETTE) __tt_pv_canpick ;;
2049
- esac
2050
- }
2051
-
2052
- __tt_pv_unconf() {
2053
- local -i i
2054
- for (( i = 1; i <= ${#cvars}; i++ )); do
2055
- __tt_pv_conf_put ${cvars[i]} "${csnap[i]}"
2056
- done
2057
- conf=0
2058
- }
2059
-
2060
- __tt_pv_conf_save() {
2061
- local var REPLY
2062
- local -a pairs=()
2063
- local -i i
2064
- for (( i = 1; i <= ${#cvars}; i++ )); do
2065
- var=${cvars[i]}
2066
- [[ ${(P)var} == "${csnap[i]}" ]] || pairs+=($var "${(P)var}")
2067
- done
2068
- if (( ! ${#pairs} )); then
2069
- conf=0
2070
- return 0
2071
- fi
2072
- __tt_tilde "$TTHEME_CONFIG"
2073
- if __tt_config_write "${pairs[@]}"; then
2074
- conf=0 msg="Saved · $REPLY" msgt=200
2075
- (( ${pairs[(Ie)TTHEME_BG_BLUR]} )) && __tt_pv_redraw
2076
- else
2077
- __tt_pv_unconf
2078
- msg="Could not write $REPLY" msgt=200
2079
- fi
2080
- }
2081
-
2082
- __tt_pv_redraw() {
2083
- local name out
2084
- if (( $+functions[__tt_bg_write] )); then
2085
- for name in ${(k)bgedit}; do
2086
- __tt_bg_write $name
2087
- done
2088
- fi
2089
- bgedit=()
2090
- msg="Drawing the background pictures again" msgt=300
2091
- printf '\e[?2026h'
2092
- __tt_pv_draw
2093
- __tt_pv_bg_close
2094
- out=$(__tt_cli redraw 2>&1)
2095
- bgsrc=() resized=1 bgname="" bgshown="" bgdim=()
2096
- __tt_reload
2097
- (( $+functions[__tt_bg_refresh] )) && __tt_bg_refresh $TTHEME_ORDER
2098
- msg=${${out//$'\n'/ }:-"Saved · no background pictures to draw"} msgt=300
2099
- }
2100
-
2101
- __tt_pv_conf_panel() {
2102
- local z=$'\e[0m' b=$'\e[1m' d=$'\e[2m' c=$ac on=$'\e[7;1m'$ac var v note
2103
- local -a ch sh
2104
- local -i r0=$1 col=$2 end=$3 k i j fit=1
2105
- (( color )) || z= b= d= c= on=
2106
- for (( k = 1; k <= ${#cvars}; k++ )); do
2107
- sh=(${=cshow[k]})
2108
- (( 13 + ${#${(j: :)sh}} + 2 * ${#sh} > end - col + 1 )) && fit=0
2109
- done
2110
- for (( k = 1; k <= ${#cvars}; k++ )); do
2111
- var=${cvars[k]} ch=(${=cchoice[k]}) sh=(${=cshow[k]})
2112
- i=${ch[(Ie)${(P)var}]}
2113
- out+=$'\e['$(( r0 + k - 1 ))';'$col'H'
2114
- if (( k == cf )); then
2115
- out+=$c"▶"$z" "$b
2116
- else
2117
- out+=" "$d
2118
- fi
2119
- out+=${(r:11:)clabel[k]}$z
2120
- if (( ! fit )); then
2121
- v=${(P)var}
2122
- (( i )) && v=${sh[i]}
2123
- if (( k == cf )); then
2124
- out+=$c"‹ "$z$b$v$z$c" ›"$z
2125
- else
2126
- out+=" "$v
2127
- fi
2128
- continue
2129
- fi
2130
- for (( j = 1; j <= ${#sh}; j++ )); do
2131
- (( j > 1 )) && out+=" "
2132
- if (( j != i )); then
2133
- out+=$d" ${sh[j]} "$z
2134
- elif (( ! color )); then
2135
- out+="[${sh[j]}]"
2136
- elif (( k == cf )); then
2137
- out+=$on" ${sh[j]} "$z
2138
- else
2139
- out+=" ${sh[j]} "
2140
- fi
2141
- done
2142
- done
2143
- var=${cvars[cf]}
2144
- note=${cnote[$var:${(P)var}]}
2145
- [[ -n $note ]] && out+=$'\e['$(( r0 + ${#cvars} + 1 ))';'$col'H'$d${note[1,end-col+1]}$z
2146
- return 0
2147
- }
2148
-
2149
- __tt_pv_flush() {
2150
- local REPLY
2151
- print -rn -- "$out"
2152
- if (( wiped )); then
2153
- local bn=$bgname
2154
- if [[ ${rtype[cur]} == thm ]]; then
2155
- __tt_pv_shows ${rval[cur]}
2156
- bn=$REPLY
2157
- fi
2158
- [[ -n $bn ]] && __tt_pv_bg_show "$bn" 1
2159
- fi
2160
- if [[ -n $bgstrip ]]; then
2161
- __tt_pv_bg_strip ${=bgstrip}
2162
- elif (( ${#bgthumb} )); then
2163
- __tt_pv_bg_strip_off
2164
- fi
2165
- printf '\e[1;%dH\e[?2026l' $(( 4 + ${(m)#flt} ))
2166
- }
2167
-
2168
- __tt_pv_reach() {
2169
- local key=${pkeys[pk]} base top k home=${HOME:a} here=${PWD:a} htip="" d=$'\e[2m' z=$'\e[0m' REPLY
2170
- local -A own=() below=() parent=() mark=() tstrip=()
2171
- local -a roots=() lp=() lpw=() ll=() lat=() lpal=() lnote=() lflag=() reply was=()
2172
- local -A TTHEME_PINS=("${(@kv)TTHEME_PINS}")
2173
- local -i room=$2
2174
- (( color )) || d= z=
2175
- (( room < 2 )) && room=2
2176
- __tt_pin_base "$key"
2177
- base=$REPLY
2178
- for k in ${(k)TTHEME_PINS}; do
2179
- [[ $k == /* ]] || continue
2180
- __tt_pin_base "$k"
2181
- [[ $REPLY == "$base" ]] || continue
2182
- if [[ $k != "$key" || $TTHEME_PINS[$k] != "$pick" ]]; then
2183
- __tt_pin_scope "$k"
2184
- was+=("${TTHEME_PINS[$k]} · $REPLY")
2185
- fi
2186
- unset "TTHEME_PINS[$k]"
2187
- done
2188
- TTHEME_PINS[$key]=$pick
2189
- top=$base
2190
- [[ $base != / ]] && __tt_pin_cover "${base:h}" && __tt_pin_base "$REPLY" && top=$REPLY
2191
- mark[$base]=new
2192
- __tt_map_build "$top"
2193
- __tt_map_fit $1
2194
- (( ${#reply} > room )) && reply=("${(@)reply[1,room-1]}" " …")
2195
- reach=("${reply[@]}" "")
2196
- __tt_dir_label "$base"
2197
- base=$REPLY
2198
- for k in $was; do
2199
- __tt_clip "${d}Replaces ${k% · *} on $base · ${k##* · }$z" $1
2200
- reach+=("$REPLY")
2201
- done
2202
- __tt_pin_scope "$key"
2203
- __tt_clip "→ $base · $REPLY" $(( $1 - ${(m)#pick} - 2 ))
2204
- rsub=$REPLY
2205
- __tt_here_fit "Then here" $1
2206
- reach+=("${reply[@]}")
2207
- }
2208
-
2209
- __tt_pv_draw() {
2210
- local out line cnt ex ag="" acat="" ac="" sb="" dd="" zz="" state=on src="" nflt="" rsub="" REPLY
2211
- local -i lw sw split sc se=$(( pw - 2 )) h k i N=${#rval} mt=${#TTHEME_ORDER} wiped=0
2212
- local -a held
2213
- bgstrip=""
2214
- if [[ -n $flt ]]; then
2215
- __tt_pv_norm "$flt"
2216
- nflt=$REPLY
2217
- fi
2218
- __tt_pv_lw
2219
- lw=$reply[1] sw=$reply[2]
2220
- split=$(( sw > 0 )) sc=$(( pw - 1 - sw ))
2221
- h=$(( ph - 5 ))
2222
- [[ -n $tune ]] && (( ! split )) && h=$(( ph - 14 ))
2223
- (( conf && ! split )) && h=$(( ph - 6 - ${#cvars} ))
2224
- reach=()
2225
- if [[ -n $pick && $mode == pin ]]; then
2226
- if (( split )); then
2227
- __tt_pv_reach $sw $(( ph - 6 ))
2228
- else
2229
- __tt_pv_reach $se $(( ph - 13 ))
2230
- h=$(( ph - 6 - ${#reach} ))
2231
- fi
2232
- fi
2233
- (( h < 1 )) && h=1
2234
- (( cur < top )) && top=$cur
2235
- (( cur >= top + h )) && top=$(( cur - h + 1 ))
2236
- (( top < 1 )) && top=1
2237
- (( N > h && top > N - h + 1 )) && top=$(( N - h + 1 ))
2238
- if (( color )); then
2239
- dd=$'\e[2m' zz=$'\e[0m'
2240
- if [[ -n $applied ]]; then
2241
- local -a ap=(${=applied})
2242
- local acx=${ap[3]#\#} sbx=${ap[4]#\#}
2243
- printf -v ac '\e[38;2;%d;%d;%dm' $((16#${acx:0:2})) $((16#${acx:2:2})) $((16#${acx:4:2}))
2244
- printf -v sb '\e[48;2;%d;%d;%dm' $((16#${sbx:0:2})) $((16#${sbx:2:2})) $((16#${sbx:4:2}))
2245
- fi
2246
- if [[ ${rtype[cur]} == thm ]]; then
2247
- ag=${TTHEME_GROUP[${rval[cur]}]:-Other}
2248
- [[ -n ${TTHEME_CATALOG[${rval[cur]}]} ]] && acat=$ag/${TTHEME_CATALOG[${rval[cur]}]}
2249
- fi
2250
- fi
2251
- if [[ -n $flt ]]; then
2252
- local -a mm=(${(M)rtype:#thm})
2253
- mt=${#mm}
2254
- fi
2255
- cnt="$mt/${#TTHEME_ORDER}"
2256
- out=$'\e[H'
2257
- if (( resized )); then
2258
- out+=$'\e[K\e[2H\e[J\e[H'
2259
- (( bgcw )) && out+=$'\e_Ga=d,d=A,q=2\e\\'
2260
- resized=0 wiped=1
2261
- fi
2262
- if (( pw < 40 || ph < 12 )); then
2263
- line="ttheme preview"
2264
- (( color )) && line=$'\e[1m'$ac$line$'\e[0m'
2265
- out+=$line$'\e[K\n'"Needs 40×12 — now ${pw}×${ph}"$'\e[K\n'
2266
- line="esc quits"
2267
- (( color )) && line=$'\e[2m'$line$'\e[0m'
2268
- out+=$line$'\e[K\e[J'
2269
- __tt_pv_flush
2270
- return 0
2271
- fi
2272
- if [[ -n $flt ]]; then
2273
- if (( color )); then
2274
- line=" "$'\e[1m'$flt$zz$ac$'\e[7m \e[0m'
2275
- else
2276
- line=" ${flt}_"
2277
- fi
2278
- else
2279
- ex="$expal | $exgrp"
2280
- (( ${#ex} > lw - 19 - ${#cnt} )) && ex="${ex[1,lw-20-${#cnt}]}…"
2281
- if (( gstep > 0 )); then
2282
- local gkeep=$(( ${#ex} * (8 - gstep) / 8 ))
2283
- if [[ $TTHEME_FX == (decode|glitch) ]]; then
2284
- local gpool='▓▒░#*+=<>?/-_' gstill=' ' gout="" gi
2285
- [[ $TTHEME_FX == decode ]] && gpool='abcdefghijklmnopqrstuvwxyz' gstill='[^[:alnum:]]'
2286
- for (( gi = 1; gi <= ${#ex}; gi++ )); do
2287
- if (( gi + (gi * 7 + gseed) % 3 <= gkeep )) || [[ ${ex[gi]} == $~gstill ]]; then
2288
- gout+=${ex[gi]}
2289
- else
2290
- gout+=${gpool[RANDOM % ${#gpool} + 1]}
2291
- fi
2292
- done
2293
- ex=$gout
2294
- else
2295
- ex="${ex[1,gkeep]}▏"
2296
- fi
2297
- fi
2298
- line=" "$dd"Search… e.g. $ex"$zz
2299
- fi
2300
- local tail=$'\e['$(( lw - ${#cnt} ))'G'$dd$cnt$zz
2301
- [[ -n $flt ]] && tail=$'\e['$(( lw - ${#cnt} ))'G'$cnt
2302
- if [[ $1 == hint ]] && (( ! wiped )); then
2303
- print -rn -- $'\e[H\e[0m\e['$lw'X'$line$tail
2304
- printf '\e[1;%dH\e[?2026l' $(( 4 + ${(m)#flt} ))
2305
- return 0
2306
- fi
2307
- out+=$line$'\e[K'$tail$'\n\e[K\n'
2308
- (( N > h && top > 1 )) && out+=" "$dd"…"$zz
2309
- out+=$'\e[K\n'
2310
- for (( k = 0; k < ph - 4; k++ )); do
2311
- i=$(( top + k ))
2312
- line=""
2313
- if (( k < h )); then
2314
- if (( ! N )); then
2315
- (( k == 0 )) && line=" ${dd}No palettes match '$flt'$zz"
2316
- elif (( i <= N )); then
2317
- __tt_pv_row $i
2318
- line=$REPLY
2319
- fi
2320
- elif (( k == h && N > h && top + h <= N )); then
2321
- line=" "$dd"…"$zz
2322
- fi
2323
- out+=$line$'\e[K\n'
2324
- done
2325
- __tt_pv_foot $(( split ? se : pw ))
2326
- if (( split )); then
2327
- if (( help && sw >= 48 )); then
2328
- __tt_pv_head 1 $sc $se Help
2329
- __tt_pv_help
2330
- elif (( ${#reach} )); then
2331
- __tt_pv_head 1 $sc $se "$pick" "$rsub"
2332
- for (( k = 1; k <= ${#reach} && k + 2 < ph; k++ )); do
2333
- out+=$'\e['$(( k + 2 ))';'$sc'H'${reach[k]}
2334
- done
2335
- elif [[ -n $tune ]]; then
2336
- (( bgoff[$tpick] )) && state=off
2337
- __tt_pv_bg_title $(( sw - ${#tune} - 6 ))
2338
- __tt_pv_head 1 $sc $se $tune "$REPLY" $state
2339
- __tt_pv_bg_panel $tpick 4 $sc $se
2340
- elif (( conf )); then
2341
- __tt_tilde "$TTHEME_CONFIG"
2342
- src=$REPLY
2343
- (( 8 + ${#src} > sw )) && src=""
2344
- __tt_pv_head 1 $sc $se Config "" "$src"
2345
- __tt_pv_conf_panel 4 $sc $se
2346
- else
2347
- [[ -n $an ]] && src=${TTHEME_SRC[$an]}
2348
- (( ${#an} + 2 + ${#src} > sw )) && src=""
2349
- __tt_pv_head 1 $sc $se ${an:-custom} "" "$src"
2350
- __tt_pv_specimen
2351
- fi
2352
- (( help && sw < 48 )) && __tt_pv_help
2353
- else
2354
- if (( ${#reach} )); then
2355
- __tt_pv_head $(( ph - 1 - ${#reach} )) 1 $se "$pick" "$rsub"
2356
- for (( k = 1; k <= ${#reach}; k++ )); do
2357
- out+=$'\e['$(( ph - 1 - ${#reach} + k ))';1H'${reach[k]}
2358
- done
2359
- elif [[ -n $tune ]]; then
2360
- (( bgoff[$tpick] )) && state=off
2361
- held=(${=bgpics[$tune]})
2362
- src=""
2363
- if (( ${#held} > 1 )); then
2364
- k=${held[(Ie)${${tpick#$tune}#:}]}
2365
- (( k )) || k=${held[(Ie)${bgact[$tune]}]}
2366
- src=" · $k/${#held}"
2367
- fi
2368
- __tt_pv_bg_title $(( lw - ${#tune} - 6 )) "$src"
2369
- __tt_pv_head $(( ph - 10 )) 1 $lw $tune "$REPLY" $state
2370
- __tt_pv_bg_panel $tpick $(( ph - 9 )) 1 $lw
2371
- elif (( conf )); then
2372
- __tt_pv_head $(( ph - 2 - ${#cvars} )) 1 $lw Config
2373
- __tt_pv_conf_panel $(( ph - 1 - ${#cvars} )) 1 $lw
2374
- fi
2375
- (( help )) && __tt_pv_help
2376
- fi
2377
- (( osdt > 0 )) && __tt_pv_osd
2378
- __tt_pv_flush
2379
- }
2380
-
2381
- __tt_pv_group() {
2382
- local k g
2383
- groups=() gthemes=()
2384
- __tt_order
2385
- for k in $reply; do
2386
- g=${TTHEME_GROUP[$k]:-Other}
2387
- [[ -n ${gthemes[$g]} ]] || groups+=($g)
2388
- gthemes[$g]+=" $k"
2389
- done
2390
- }
2391
-
2392
- __tt_pv_canpick() {
2393
- canpick=0
2394
- if [[ $mode == pin ]]; then
2395
- canpick=1
2396
- elif __tt_keepable && [[ $TTHEME_TAB_PALETTE == off ]]; then
2397
- canpick=1
2398
- fi
2399
- }
2400
-
2401
- __tt_pv_strip() {
2402
- local hex cell=""
2403
- local -a sw=(${=TTHEME_SWATCH[$1]})
2404
- local -i j
2405
- for (( j = 1; j <= 6; j++ )); do
2406
- hex=${sw[j]#\#}
2407
- (( j > 1 )) && cell+=" "
2408
- if [[ -n $hex ]]; then
2409
- cell+=$'\e[38;2;'$((16#${hex:0:2}))';'$((16#${hex:2:2}))';'$((16#${hex:4:2}))'m■'
2410
- else
2411
- cell+=" "
2412
- fi
2413
- done
2414
- tstrip[$1]=$cell$'\e[39m'
2415
- }
2416
-
2417
- __tt_pv_init() {
2418
- local lo
2419
- local -a tp
2420
- __tt_pv_group
2421
- [[ -n $orig ]] && __tt_name_of "$orig" && cn=$REPLY
2422
- [[ -n ${TTHEME_PALETTE[$cn]} ]] || return 0
2423
- cdot="◆"
2424
- (( color )) || return 0
2425
- tp=(${=TTHEME_PALETTE[$cn]})
2426
- lo=${tp[3]#\#}
2427
- printf -v cdot '\e[38;2;%d;%d;%dm◆\e[39m' $((16#${lo:0:2})) $((16#${lo:2:2})) $((16#${lo:4:2}))
2428
- }
2429
-
2430
- __tt_pv_roll() {
2431
- expal=${TTHEME_ORDER[RANDOM % ${#TTHEME_ORDER} + 1]}
2432
- exgrp=${groups[RANDOM % ${#groups} + 1]}
2433
- gseed=$RANDOM
2434
- exnext=$(( SECONDS + 3 ))
2435
- }
2436
-
2437
- __tt_pv_size() {
2438
- local sz=$(stty size 2>/dev/null)
2439
- [[ $sz == <1->" "<1-> ]] || return 1
2440
- [[ $sz == "$ph $pw" ]] && return 1
2441
- ph=${sz%% *} pw=${sz##* } resized=1
2442
- return 0
2443
- }
2444
-
2445
- __tt_pv_getch() {
2446
- if (( $# )); then
2447
- read -sk 1 -t $1 2>/dev/null
2448
- return
2449
- fi
2450
- local t=0.2
2451
- (( gstep )) && t=0.06
2452
- while ! read -sk 1 -t $t 2>/dev/null; do
2453
- [[ -t 0 ]] || return 1
2454
- __tt_pv_size && return 1
2455
- if (( osdt > 0 )); then
2456
- (( osdt -= gstep ? 6 : 20 ))
2457
- (( osdt > 0 )) || return 1
2458
- fi
2459
- if (( msgt > 0 )); then
2460
- (( msgt -= gstep ? 6 : 20 ))
2461
- (( msgt > 0 )) || return 1
2462
- fi
2463
- (( gstep )) && { gstep=$(( gstep - 1 )); tick=1; return 1 }
2464
- (( SECONDS >= exnext )) && { __tt_pv_roll; gstep=8; tick=1; return 1 }
2465
- done
2466
- return 0
2467
- }
2468
-
2469
- __tt_pv_read() {
2470
- key=""
2471
- if (( $# )); then
2472
- __tt_pv_getch 0 || return 1
2473
- else
2474
- __tt_pv_getch || return 1
2475
- fi
2476
- key=$REPLY
2477
- [[ $key == ç ]] && key=altc
2478
- [[ $key == $'\e' ]] || return 0
2479
- local seq=""
2480
- if ! __tt_pv_getch 0.05; then
2481
- key=esc
2482
- return 0
2483
- fi
2484
- if [[ $REPLY != '[' && $REPLY != O ]]; then
2485
- key=nop
2486
- [[ $REPLY == c ]] && key=altc
2487
- return 0
2488
- fi
2489
- while __tt_pv_getch 0.05; do
2490
- seq+=$REPLY
2491
- [[ $REPLY == [A-Za-z~] ]] && break
2492
- done
2493
- case $seq in
2494
- A) key=up ;;
2495
- B) key=down ;;
2496
- C) key=right ;;
2497
- D) key=left ;;
2498
- H|"1~"|"7~") key=home ;;
2499
- F|"4~"|"8~") key=end ;;
2500
- "5~") key=pgup ;;
2501
- "6~") key=pgdn ;;
2502
- "1;2C") key=sright ;;
2503
- "1;2D") key=sleft ;;
2504
- Z) key=stab ;;
2505
- *) key=nop ;;
2506
- esac
2507
- }
2508
-
2509
- __tt_pv_pick() {
2510
- case $key in
2511
- $'\x03') return 1 ;;
2512
- esc) pick="" ;;
2513
- left|stab) pk=$(( (pk + ${#plabel} - 2) % ${#plabel} + 1 )) ;;
2514
- right|$'\t') pk=$(( pk % ${#plabel} + 1 )) ;;
2515
- $'\r'|$'\n')
2516
- sel=$pick picked=$pk
2517
- return 1
2518
- ;;
2519
- esac
2520
- return 0
2521
- }
2522
-
2523
- __tt_pv_handle() {
2524
- local name
2525
- if (( help )); then
2526
- case $key in
2527
- $'\x03') return 1 ;;
2528
- '?'|esc) help=0 ;;
2529
- esac
2530
- return 0
2531
- fi
2532
- if [[ -n $pick ]]; then
2533
- __tt_pv_pick
2534
- return
2535
- fi
2536
- if [[ -n $tune ]]; then
2537
- __tt_pv_tune
2538
- return
2539
- fi
2540
- if (( conf )); then
2541
- __tt_pv_conf
2542
- return
2543
- fi
2544
- case $key in
2545
- $'\x03') return 1 ;;
2546
- esc|$'\x15')
2547
- if [[ -z $flt ]]; then
2548
- [[ $key == esc ]] && return 1
2549
- else
2550
- name=""
2551
- [[ ${rtype[cur]} == thm ]] && name=${rval[cur]}
2552
- flt=""
2553
- if [[ -n $name ]]; then
2554
- __tt_pv_goto "$name"
2555
- else
2556
- __tt_pv_rows
2557
- (( cur > ${#rval} )) && cur=${#rval}
2558
- (( cur < 1 )) && cur=1
2559
- fi
2560
- fi
2561
- ;;
2562
- $'\r'|$'\n')
2563
- if [[ ${rtype[cur]} == thm ]]; then
2564
- if (( canpick )); then
2565
- pick=${rval[cur]} pk=$pkdef
2566
- else
2567
- sel=${rval[cur]}
2568
- return 1
2569
- fi
2570
- elif [[ ${rtype[cur]} == (hdr|cat) ]]; then
2571
- __tt_pv_toggle
2572
- fi
2573
- ;;
2574
- up)
2575
- if (( cur > 1 )); then
2576
- cur=$(( cur - 1 ))
2577
- [[ ${rtype[cur]} == rule ]] && cur=$(( cur - 1 ))
2578
- elif (( ${#rval} )); then
2579
- cur=${#rval}
2580
- fi
2581
- ;;
2582
- down)
2583
- if (( cur < ${#rval} )); then
2584
- cur=$(( cur + 1 ))
2585
- [[ ${rtype[cur]} == rule ]] && cur=$(( cur + 1 ))
2586
- elif (( ${#rval} )); then
2587
- cur=1
2588
- fi
2589
- ;;
2590
- right) [[ ${rtype[cur]} == (hdr|cat) && -z ${exp[${rval[cur]}]} ]] && __tt_pv_toggle ;;
2591
- left) __tt_pv_left ;;
2592
- home) cur=1 ;;
2593
- end) (( ${#rval} )) && cur=${#rval} ;;
2594
- pgup)
2595
- if (( cur <= 1 )); then
2596
- (( ${#rval} )) && cur=${#rval}
2597
- else
2598
- cur=$(( cur - ph + 5 ))
2599
- (( cur < 1 )) && cur=1
2600
- [[ ${rtype[cur]} == rule ]] && cur=$(( cur - 1 ))
2601
- fi
2602
- ;;
2603
- pgdn)
2604
- if (( cur >= ${#rval} )); then
2605
- cur=1
2606
- else
2607
- cur=$(( cur + ph - 5 ))
2608
- (( cur > ${#rval} )) && cur=${#rval}
2609
- [[ ${rtype[cur]} == rule ]] && cur=$(( cur + 1 ))
2610
- fi
2611
- ;;
2612
- ' ') [[ ${rtype[cur]} == (hdr|cat) ]] && __tt_pv_toggle ;;
2613
- $'\t')
2614
- [[ ${rtype[cur]} == thm ]] || return 0
2615
- name=${rval[cur]}
2616
- if __tt_pv_bg_state $name || { __tt_pv_bg_findable $name && __tt_pv_bg_find $name }; then
2617
- __tt_pv_tune_open $name
2618
- elif __tt_pv_bg_findable $name; then
2619
- :
2620
- elif (( bgcw )); then
2621
- msg="No background image for $name" msgt=200
2622
- fi
2623
- ;;
2624
- altc)
2625
- conf=1 cf=1 csnap=()
2626
- for name in $cvars; do
2627
- csnap+=("${(P)name}")
2628
- done
2629
- ;;
2630
- '?') help=1 ;;
2631
- sleft) (( --scene )) ;;
2632
- sright) (( ++scene )) ;;
2633
- $'\x7f'|$'\x08')
2634
- if [[ -n $flt ]]; then
2635
- name=""
2636
- [[ ${rtype[cur]} == thm ]] && name=${rval[cur]}
2637
- flt=${flt%?}
2638
- __tt_pv_rows
2639
- __tt_pv_first "$name"
2640
- fi
2641
- ;;
2642
- [[:print:]])
2643
- __tt_pv_lw
2644
- (( ${(m)#flt} + ${(m)#key} > reply[1] - 12 )) && return 0
2645
- name=""
2646
- [[ ${rtype[cur]} == thm ]] && name=${rval[cur]}
2647
- flt+=${(L)key}
2648
- __tt_pv_rows
2649
- __tt_pv_first "$name"
2650
- ;;
2651
- esac
2652
- return 0
2653
- }
2654
-
2655
- __tt_preview() {
2656
- emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace}
2657
- local mode=$1 pdir=${2:-$PWD}
2658
- if [[ ! -t 0 || ! -t 1 ]]; then
2659
- print -u2 "ttheme ${mode:-preview}: needs a terminal"
2660
- return 1
2661
- fi
2662
- 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
2663
- local pick="" pk=1 pkdef=1 picked=0 canpick=0 bgcw=0 bgch=0 bgname="" bgshown="" bginc="" osd="" osdt=0
2664
- local tune="" tpick="" tf=1 help=0 msg="" msgt=0 an="" bgrel=0 bgmx=0 bgmy=0 bganchor=0 bgcut="" bgnext=0 bgbytes=0 bgstrip="" pvscene="" pvscenes=""
2665
- local -i scene=0
2666
- local -a bgorder=()
2667
- local -A bgfrom=() bgurl=() bgby=() bgsent=() bgcost=() bgdim=() bgsrc=() bgfill=() bgfocus=() bgsize=() bgpos=() bgop=() bgdef=() bgoff=() bgbase=() bgload=() bgshot=() bgshotkey=() bgedit=() bgtunef=() bgofff=() bgimages=()
2668
- local -A bgpic=() bgpics=() bgact=() bgview=() bgswap=() bgthumb=() tsnaps=() pvseek=() bgcolors=()
2669
- local conf=0 cf=1
2670
- local -a plabel=(" This tab " " Default ") pkeys=() reach=() csnap=()
2671
- local -a cvars=(TTHEME_TAB_PALETTE TTHEME_ANNOUNCE TTHEME_FX TTHEME_SORT TTHEME_BG_BLUR TTHEME_BG_COLORS) clabel=("New tabs" Announce "Search fx" Sort Blur Colors)
2672
- local -a cchoice=("off seq" "1 0" "typewriter decode glitch" "abc series" "0 1 2 3 4" "tone original") cshow=("off seq" "on off" "typewriter decode glitch" "abc series" "off 1px 2px 3px 4px" "tone original")
2673
- local -A cnote=(
2674
- TTHEME_TAB_PALETTE:seq "New tabs rotate through palettes" TTHEME_TAB_PALETTE:off "New tabs keep the terminal theme"
2675
- TTHEME_ANNOUNCE:1 "Shows the palette notice" TTHEME_ANNOUNCE:0 "Silences the palette notice"
2676
- TTHEME_FX:typewriter "The search hint types itself" TTHEME_FX:decode "The search hint decodes" TTHEME_FX:glitch "The search hint glitches in"
2677
- TTHEME_SORT:abc "Series and palettes by name" TTHEME_SORT:series "Series in the order added"
2678
- TTHEME_BG_BLUR:0 "Pictures stay sharp" TTHEME_BG_BLUR:1 "Pictures soften a little behind the text"
2679
- TTHEME_BG_BLUR:2 "Pictures soften behind the text" TTHEME_BG_BLUR:3 "Pictures blur behind the text"
2680
- TTHEME_BG_BLUR:4 "Pictures blur well behind the text"
2681
- TTHEME_BG_COLORS:tone "New pictures are tinted in one color of the palette"
2682
- TTHEME_BG_COLORS:original "New pictures keep their own colors"
2683
- )
2684
- __tt_pv_conf_rows
2685
- [[ $mode == pin ]] && __tt_pin_scopes "$pdir"
2686
- [[ $mode == init ]] && pkdef=2
2687
- __tt_pv_canpick
2688
- __tt_pv_size
2689
- local -a groups=() rtype=() rval=() rcnt=() reply=()
2690
- local -A gthemes=() exp=() tstrip=()
2691
- __tt_color && color=1
2692
- __tt_pv_init
2693
- __tt_pv_roll
2694
- __tt_pv_rows
2695
- [[ -n ${TTHEME_PALETTE[$cn]} ]] && __tt_pv_goto "$cn"
2696
- local tty=""
2697
- local -i TTHEME_RAW=0
2698
- {
2699
- tty=$(stty -g 2>/dev/null) && stty -echo -icanon min 1 time 0 2>/dev/null || tty=""
2700
- TTHEME_RAW=$(( ${#tty} > 0 ))
2701
- __tt_pv_bg_open
2702
- printf '\e[?2026h\e[?1049h\e[?7l\e[?25l'
2703
- while :; do
2704
- printf '\e[?2026h'
2705
- if (( tick )); then
2706
- __tt_pv_draw hint
2707
- else
2708
- __tt_pv_focus
2709
- [[ ${rtype[cur]} == thm ]] && an=${rval[cur]}
2710
- __tt_pv_draw
2711
- fi
2712
- tick=0
2713
- if ! __tt_pv_read; then
2714
- [[ -t 0 ]] && continue
2715
- break
2716
- fi
2717
- while :; do
2718
- __tt_pv_handle || break 2
2719
- __tt_pv_read drain || break
2720
- done
2721
- done
2722
- } always {
2723
- local spec=${sel:+${TTHEME_PALETTE[$sel]}}
2724
- [[ -n $spec && $mode != pin ]] && (( ! ${#bgedit} && ! ${#bgswap} )) && __tt_pv_claim "$sel"
2725
- printf '\e[?2026h'
2726
- __tt_pv_bg_close
2727
- if [[ -n $spec ]]; then
2728
- [[ $spec == "$painted" ]] || __tt_apply "$spec"
2729
- elif [[ $painted != "$orig" ]]; then
2730
- if [[ -z $orig ]]; then
2731
- __tt_osc_reset
2732
- else
2733
- __tt_apply "$orig"
2734
- fi
2735
- elif [[ $applied != "$orig" ]]; then
2736
- __tt_pv_paint "${TTHEME_PAINTED:+$orig}"
2737
- fi
2738
- printf '\e[?7h\e[?1049l\e[?25h\e[?2026l'
2739
- [[ -n $tty ]] && stty "$tty" 2>/dev/null
2740
- TTHEME_RAW=0
2741
- [[ -n $tune ]] && __tt_pv_untune
2742
- (( conf )) && __tt_pv_unconf
2743
- __tt_pv_bg_save
2744
- if [[ -n $spec ]]; then
2745
- TTHEME_SPEC=$spec
2746
- if [[ $mode == pin ]]; then
2747
- __tt_pin_save "$sel" "${pkeys[picked]}" "$orig"
2748
- [[ $TTHEME_SPEC == "$orig" ]] || __tt_announce
2749
- __tt_sync
2750
- elif (( picked == 2 )); then
2751
- __tt_announce
2752
- __tt_keep "$sel" force
2753
- else
2754
- __tt_announce
2755
- __tt_shown "$sel" force && __tt_reload
2756
- fi
2757
- else
2758
- (( ${#bgedit} + ${#bgswap} )) && [[ -n ${TTHEME_PALETTE[$cn]} ]] && { __tt_shown "$cn" && __tt_reload }
2759
- fi
2760
- }
2761
- return 0
2762
- }
1431
+ source $TTHEME_HOME/preview.zsh
2763
1432
 
2764
1433
  ttheme() {
2765
1434
  emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace}
@@ -2785,7 +1454,11 @@ ttheme() {
2785
1454
  fi
2786
1455
  if (( ! $# )); then
2787
1456
  (( ${#TTHEME_PALETTE} )) || { __tt_empty; return }
2788
- __tt_menu
1457
+ if [[ -t 0 && -t 1 ]]; then
1458
+ __tt_preview hub
1459
+ else
1460
+ __tt_menu
1461
+ fi
2789
1462
  return 0
2790
1463
  fi
2791
1464
 
@@ -2810,12 +1483,18 @@ ttheme() {
2810
1483
  __tt_keep "$REPLY" ;;
2811
1484
  preview) __tt_preview ;;
2812
1485
  pin)
2813
- if [[ -n $2 ]]; then
1486
+ if [[ $2 == ssh:* ]]; then
1487
+ REPLY=ssh:${(L)2#ssh:}
1488
+ [[ $REPLY != ssh: ]] || { __tt_misuse pin "missing the host after ssh:"; return }
1489
+ [[ $REPLY != *@* ]] || { print -u2 -r -- "ttheme pin: an ssh pin names the host alone — ssh:${REPLY##*@}"; return 1 }
1490
+ __tt_ssh_ok $REPLY || { print -u2 -r -- "ttheme pin: not a host: ${2#ssh:} — letters, digits, . - : and the wildcards * ?"; return 1 }
1491
+ elif [[ -n $2 ]]; then
2814
1492
  REPLY=$2
2815
1493
  [[ $REPLY == \~ || $REPLY == \~/* ]] && REPLY=$HOME${REPLY#\~}
2816
1494
  [[ -d $REPLY ]] || { print -u2 -r -- "ttheme pin: no such directory: $2"; return 1 }
1495
+ REPLY=${REPLY:a}
2817
1496
  fi
2818
- __tt_preview pin ${REPLY:+${REPLY:a}} ;;
1497
+ __tt_preview pin ${REPLY:+$REPLY} ;;
2819
1498
  unpin) __tt_unpin "${@:2}" ;;
2820
1499
  pins) __tt_pins_map ;;
2821
1500
  esac
@@ -2840,7 +1519,17 @@ if (( ${+functions[compdef]} )); then
2840
1519
  elif [[ $words[2] == market && $words[3] == (add|init) && $CURRENT == 4 ]]; then
2841
1520
  _files -/
2842
1521
  elif [[ $words[2] == (pin|unpin) && $CURRENT == 3 ]]; then
2843
- _files -/
1522
+ reply=(${${(M)${(k)TTHEME_PINS}:#ssh:*}#ssh:})
1523
+ if compset -P 'ssh:'; then
1524
+ if [[ $words[2] == unpin ]]; then
1525
+ compadd -- $reply
1526
+ elif (( $+functions[_ssh_hosts] )); then
1527
+ _ssh_hosts
1528
+ fi
1529
+ else
1530
+ _files -/
1531
+ [[ $words[2] == pin || ${#reply} -gt 0 ]] && compadd -S '' -- ssh:
1532
+ fi
2844
1533
  elif [[ $words[2] == add && $words[CURRENT-1] == --market ]]; then
2845
1534
  _files -/
2846
1535
  elif [[ $words[2] == add ]]; then
@@ -2892,7 +1581,7 @@ fi
2892
1581
  () {
2893
1582
  emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace}
2894
1583
  local f
2895
- for f in $TTHEME_HOME/ttheme.zsh $TTHEME_HOME/palettes.zsh $TTHEME_HOME/adapters/_osc.zsh $TTHEME_HOME/adapters/_wired.zsh $TTHEME_HOME/adapters/_bg.zsh $TTHEME_HOME/adapters/$TTHEME_ADAPTER.zsh; do
1584
+ for f in $TTHEME_HOME/ttheme.zsh $TTHEME_HOME/preview.zsh $TTHEME_HOME/palettes.zsh $TTHEME_HOME/adapters/_osc.zsh $TTHEME_HOME/adapters/_wired.zsh $TTHEME_HOME/adapters/_bg.zsh $TTHEME_HOME/adapters/$TTHEME_ADAPTER.zsh; do
2896
1585
  [[ -r $f && ! $f.zwc -nt $f ]] || continue
2897
1586
  zcompile -UR -- $f.$$.zwc $f 2>/dev/null && command mv -f -- $f.$$.zwc $f.zwc 2>/dev/null
2898
1587
  [[ ! -e $f.$$.zwc ]] || command rm -f -- $f.$$.zwc