Last active
February 1, 2026 17:11
-
-
Save bonnebulle/a9e85099fdbe9ebe1d1b4b5f91ab7718 to your computer and use it in GitHub Desktop.
USE https://github.com/kriuchkov/tock/issues/32 extra commandes... EX/ ttt project_name description ... see alias
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| ######################## | |
| #### ALIAS SHORTS ###### | |
| # MAIN | |
| # alias ttt="/home/vi/Scripts/@KEEP/TUI_tock/TUI_tock_new_task.sh" # MAIN | |
| # LS + VIEWS TUI | |
| # alias tls="/home/vi/Scripts/@KEEP/TUI_tock/TUI_tock_new_task.sh l" # LS | |
| # alias treport="/bin/tock report" # REPORT | |
| # alias tview="/bin/tock calendar" # FULL VIEW | |
| # alias tcal=tview | |
| # SELECT / LS | |
| # alias tsel="/home/vi/Scripts/@KEEP/TUI_tock/TUI_tock_new_task.sh select" # SELECT + RM/START/MV | |
| # TIME PAST | |
| # alias ttime="/home/vi/Scripts/@KEEP/TUI_tock/TUI_tock_new_task.sh ntime ctime" # TIME if CURRENT | |
| # alias tttime="/home/vi/Scripts/@KEEP/TUI_tock/TUI_tock_new_task.sh ntime" # TIME | |
| # alias tnow="/home/vi/Scripts/@KEEP/TUI_tock/TUI_tock_new_task.sh current" # TIME CURRENT + options | |
| # alias tclock="tnow clock" | |
| # alias tcc="tock_info" # oneline zsh current time | |
| # CONTINUE | |
| # alias tcontinue="/bin/tock continue" # Continue current one | |
| # alias tgo="tcontinue" # QUICK continue last one | |
| # LAST | |
| # alias tlast="/bin/tock last" # output current lasts | |
| # alias tls="/home/vi/Scripts/@KEEP/TUI_tock/TUI_tock_new_task.sh last" # TUI lasts | |
| # alias tcc="tls" | |
| # STOP | |
| # alias tstop="/home/vi/Scripts/@KEEP/TUI_tock/TUI_tock_new_task.sh p stop" # STOP != pause | |
| # alias tts="/home/vi/Scripts/@KEEP/TUI_tock/TUI_tock_new_task.sh p" # PAUSE | |
| # ADD (start_time+duration) | |
| # alias tttt="/home/vi/Scripts/@KEEP/TUI_tock/TUI_tock_new_task.sh a" | |
| # alias tta="tttt" | |
| # alias ttad="tttt" | |
| # alias tadd="tttt" | |
| # RM | |
| # alias trm="/home/vi/Scripts/@KEEP/TUI_tock/TUI_tock_new_task.sh rm" # RM | |
| # RENAME | |
| # alias tmv="/home/vi/Scripts/@KEEP/TUI_tock/TUI_tock_new_task.sh rename " # RENAME | |
| ######################## | |
| ######################## | |
| ######################### | |
| #### CONFIG INIT ######## | |
| FICHIER="/home/vi/.tock.txt" | |
| TMP_FILE="/home/vi/.tock_copy.txt" | |
| TMP_FILE_RM="/home/vi/.tock_rm.txt" | |
| rm "$TMP_FILE" &>/dev/null | |
| rm "$TMP_FILE_RM" &>/dev/null | |
| [[ ! -f "$FICHIER" ]] && { echo "❌ Fichier non trouvé"; exit 1; } | |
| ######################### | |
| ######################### | |
| backup_file() { ## on RM, renaming only | |
| DATENOW=$(date '+%Y-%m-%d') | |
| parentdir="$(dirname "$FICHIER")" | |
| FICHIER_NOEXT="${FICHIER##*/}" # Nom du fichier sans chemin | |
| FICHIER_NOEXT="${FICHIER_NOEXT%.*}" # Enlève l'extension originale | |
| FICHIER_BAK="$parentdir${FICHIER_NOEXT}__${DATENOW}.bak" | |
| echo "DATA ORIGINALE == $FICHIER" | |
| echo "BACKUP RM FILE == $FICHIER_BAK" | |
| cp "$FICHIER" "$FICHIER_BAK" | |
| } | |
| ######### FUNCS | |
| ### O ASK -> 1 PROJETS -> DESCRIPTIONS | |
| descriptions() { # 2 | |
| if [[ $1 == "rm" ]];then | |
| PROJECT_FILTER="$2" | |
| cat $FICHIER | grep "| $PROJECT_FILTER |" > $TMP_FILE | |
| DESCRIPTIONS=$(awk -F' \\| ' '{print $3}' "$TMP_FILE" | sort -u) | |
| echo $@ | |
| # if [[ grep -q "| $2 | $3" "$FICHIER" ]];then | |
| if grep -q "| $PROJECT_FILTER | $3" "$FICHIER"; then | |
| DESCRIPTION_CHOIX=$3 | |
| EXISTE_DESC=true | |
| else | |
| DESCRIPTION_CHOIX=$(echo -e "🏴 PROJET ENTIER\n$DESCRIPTIONS" | fzf \ | |
| --height 50% --border --header="Description ↓" \ | |
| --preview "grep '$PROJET_GO' '$FICHIER'") | |
| fi | |
| elif [[ $2 == "noadd" || $2 == "ntime" ]];then ## Ttime no desc | |
| # echo "---noadd" | |
| PROJECT_FILTER="$1" | |
| cat $FICHIER | grep "| $PROJECT_FILTER |" > $TMP_FILE | |
| DESCRIPTIONS=$(awk -F' \\| ' '{print $3}' "$TMP_FILE" | sort -u) | |
| DESCRIPTION_CHOIX=$(echo -e "$DESCRIPTIONS" | fzf \ | |
| --height 50% --border --header="Description ↓" \ | |
| --preview "grep '$PROJET_GO' '$FICHIER'") | |
| else | |
| # echo "----nnnn" | |
| PROJECT_FILTER="$1" | |
| cat $FICHIER | grep "| $PROJECT_FILTER |" > $TMP_FILE | |
| DESCRIPTIONS=$(awk -F' \\| ' '{print $3}' "$TMP_FILE" | sed '/_____RAS$/d' | sort -u) | |
| [[ "$DESCRIPTIONS" ]] && DESCRIPTIONS="\n$DESCRIPTIONS" | |
| DESCRIPTION_CHOIX=$(echo -e "_____RAS\n➕ Nouvelle$DESCRIPTIONS" | fzf \ | |
| --height 50% --border --header="Description ↓" \ | |
| --preview "grep '$PROJET_GO' '$FICHIER'") | |
| fi | |
| if [[ "$DESCRIPTION_CHOIX" == "➕ Nouvelle" ]]; then | |
| read -r -p "DESCRIPTION : " DESCRIPTION_CHOIX | |
| elif [[ -z "$DESCRIPTION_CHOIX" ]]; then | |
| echo "❌ Annulé"; exit 0 | |
| fi | |
| DESCRIPTION=$DESCRIPTION_CHOIX | |
| # DESCRIPTION=$DESCRIPTION_CHOIX | |
| if [[ $1 == "rm" ]];then #### | |
| echo "---- $DESCRIPTION_CHOIX" | |
| if [[ "$DESCRIPTION_CHOIX" == "🏴 PROJET ENTIER" ]]; then | |
| # cat $TMP_FILE | |
| echo "🏴" | |
| echo $PROJECT_FILTER | |
| else | |
| echo "PROJECT_FILTER ----- $PROJECT_FILTER" | gum style --foreground 208 | |
| echo "DESCRIPTION_CHOIX -- $DESCRIPTION_CHOIX" | gum style --foreground 87 | |
| cat $FICHIER | grep "| $PROJECT_FILTER |" | grep "$DESCRIPTION_CHOIX$" > $TMP_FILE | |
| fi | |
| if [[ $DESCRIPTION_CHOIX == "" || "$DESCRIPTION_CHOIX" == "🏴 PROJET ENTIER" ]];then | |
| grep -v -F "| $PROJECT_FILTER |" "$FICHIER" > "$TMP_FILE_RM" | |
| else | |
| sed -E "/\\| $PROJECT_FILTER \\| $DESCRIPTION_CHOIX\$/d" "$FICHIER" > "$TMP_FILE_RM" | |
| fi | |
| echo "" | |
| echo "Résultat Final :" | |
| echo "----" | |
| cat $TMP_FILE_RM | |
| echo "<- after rm lines" | |
| echo "----" | |
| echo "" | |
| echo "" | |
| echo "Trouvé (supprimé) :" | |
| echo "----" | |
| cat $TMP_FILE | |
| echo "----" | |
| echo "" | |
| OK_RM=$(gum choose --header "Supprimer ?" "oui" "non") | |
| if [[ "$OK_RM" != "oui" ]]; then | |
| exit 1 | |
| fi | |
| ###### | |
| backup_file | |
| ###### | |
| echo "" | |
| cat $TMP_FILE_RM > $FICHIER | |
| echo "FAIT !" | |
| echo "" | |
| fi ### RM | |
| PROJET=$PROJECT_FILTER | |
| } ### descriptions | |
| projets() { # 1 | |
| # echo $@ | |
| PROJETS=$(awk -F' \\| ' '{print $2}' "$FICHIER" | sort -u) | |
| if [[ $1 == "rm" ]];then | |
| PROJET_GO=$(echo -e "!!!! RM PROJET\n$PROJETS" | fzf --height 40% --border --header="Projet ↓") | |
| elif [[ $1 == "noadd" || $1 == "ntime" ]];then | |
| # echo "noadd" | |
| PROJET_GO=$(echo -e "$PROJETS" | fzf --height 40% --border --header="Projet ↓") | |
| else | |
| # echo $1 | |
| PROJET_GO=$(echo -e "➕ Ajouter\n$PROJETS" | fzf --height 40% --border --header="Projet ↓") | |
| fi | |
| if [[ $1 == "nodesc" ]];then ## rename project | |
| PROJET=$PROJET_GO | |
| else | |
| if [[ "$PROJET_GO" == "➕ Ajouter" ]]; then | |
| read -r -p "Nom du nouveau PROJET : " PROJET_GO | |
| ############################ | |
| echo "GO DESC 1" | |
| descriptions $PROJET_GO $@ | |
| ############################ | |
| elif [[ -z "$PROJET_GO" ]]; then | |
| echo "❌ Annulé" | |
| exit 0 | |
| elif [[ $1 == "rm" ]];then | |
| descriptions "rm" $PROJET_GO | |
| else | |
| # echo "GO DESC 2" | |
| descriptions $PROJET_GO $@ | |
| fi | |
| fi # nodesc | |
| } | |
| ask_projet_dec() { #0 | |
| # echo $@ | |
| # echo "=============== ASK" | |
| # Votre code projet/description existant... | |
| # echo $1 | |
| if [[ -n "$1" && "$1" != "ntime" && "$1" != "current" && "$1" != "noadd" ]]; then | |
| # echo "oook" | |
| PROJET_GO=$1 | |
| PROJETS=$(awk -F' \\| ' '{print $2}' "$FICHIER" | sort -u) | |
| if echo "$PROJETS" | grep -qw "$PROJET_GO"; then | |
| # echo "Projet $PROJET_GO trouvé !" | |
| if [[ "$2" != "noadd" ]]; then | |
| # echo "--NOT noadd" | |
| descriptions $PROJET_GO | |
| else ### Ttime, project no desc | |
| # echo "--noadd" | |
| descriptions $PROJET_GO "noadd" | |
| fi | |
| else | |
| if [[ "$1" != "last" ]];then | |
| echo "⚠️ Projet '$PROJET_GO' n'existe pas" | |
| fi | |
| ##### | |
| echo "" | |
| gum style --foreground 208 "PROJET (fzf) ?" | |
| projets $1 | |
| # exit 1 | |
| fi | |
| else | |
| # echo "else" | |
| projets $@ | |
| fi | |
| } | |
| ####### SHORTS | |
| if [[ "$1" == "p" ]]; then | |
| # /bin/tock pause | |
| if [[ "$2" == "stop" ]]; then | |
| # === FERMER TOUS LES PANES "/bin/tock" EXISTANTS === | |
| # gum style --foreground 208 "🔍 Détection panes '/bin/tock'..." | |
| TOCK_PANES=$(wezterm cli list --format json | jq -r '.[] | select(.title=="/bin/tock") | .pane_id' 2>/dev/null) | |
| if [[ -n "$TOCK_PANES" ]]; then | |
| gum style --foreground 208 "🗑️ Fermeture $(echo "$TOCK_PANES" | wc -l) pane(s) '/bin/tock'..." | |
| echo "$TOCK_PANES" | while read -r PANE_ID; do | |
| [[ -n "$PANE_ID" ]] && wezterm cli kill-pane --pane-id "$PANE_ID" | |
| done | |
| sleep 0.5 | |
| fi | |
| /bin/tock stop | |
| fi | |
| exit 1 | |
| fi | |
| if [[ "$1" == "w" ]]; then | |
| /bin/tock watch | |
| exit 1 | |
| fi | |
| if [[ "$1" == "l" ]]; then | |
| /bin/tock list | |
| exit 1 | |
| fi | |
| rename_project() { | |
| # local FICHIER="${FICHIER:-$HOME/.tock.txt}" | |
| # local OLD NEW | |
| ###### | |
| backup_file | |
| ###### | |
| local OLD_PROJECT_NAME="${1:?Projet à renommer manquant}" | |
| NEW_PROJECT_NAME=$(gum input --placeholder "Nouveau nom pour le projet '$OLD_PROJECT_NAME' ?" --prompt "▶ " ) || return 1 | |
| [[ -z "$NEW_PROJECT_NAME" ]] && { echo "Annulé."; return 1; } | |
| awk -v old="$OLD_PROJECT_NAME" -v new="$NEW_PROJECT_NAME" -F'|' ' | |
| { | |
| # trim basique colonnes | |
| for (i=1;i<=NF;i++) { | |
| sub(/^[ \t]+/, "", $i) | |
| sub(/[ \t]+$/, "", $i) | |
| } | |
| if ($2 == old) $2 = new | |
| printf "%s | %s | %s\n", $1, $2, $3 | |
| } | |
| ' "$FICHIER" > "$FICHIER.tmp" && mv "$FICHIER.tmp" "$FICHIER" | |
| echo | |
| } | |
| rename_desc() { | |
| # local FICHIER="${FICHIER:-$HOME/.tock.txt}" | |
| local OLD_DESC_NAME="${2:?Description à renommer manquante}" | |
| # local NEW_DESC_NAME | |
| ###### | |
| backup_file | |
| ###### | |
| NEW_DESC_NAME=$(gum input --placeholder "Nouvelle description pour '$OLD_DESC_NAME' ?" --prompt "▶ " ) || return 1 | |
| [[ -z "$NEW_DESC_NAME" ]] && { echo "Annulé."; return 1; } | |
| awk -v old="$OLD_DESC_NAME" -v new="$NEW_DESC_NAME" -F'|' ' | |
| { | |
| for (i=1;i<=NF;i++) { sub(/^[ \t]+/, "", $i); sub(/[ \t]+$/, "", $i) } | |
| if ($3 == old) $3 = new | |
| printf "%s | %s | %s\n", $1, $2, $3 | |
| } | |
| ' "$FICHIER" > "$FICHIER.tmp" && mv "$FICHIER.tmp" "$FICHIER" | |
| } | |
| # usage : rename_desc read | |
| if [[ "$1" == "rename" ]]; then | |
| PROJECT_FILTER=$2 | |
| cat $FICHIER | grep "| $PROJECT_FILTER |" > $TMP_FILE | |
| if [[ -z "$2" ]];then | |
| echo "Projet manquant" | |
| # rename_project | |
| elif [[ -z "$3" ]];then ### PROJETS | |
| echo "Rename --project" | gum style --foreground "#d37c39" | |
| if grep -q "| $PROJECT_FILTER |" "$FICHIER"; then | |
| # cat $TMP_FILE | gum style --foreground "#326039" | |
| echo "" | |
| echo "PROJ Existe ! Renommer en ?" | |
| echo "📁 Projet : $PROJECT_FILTER" | gum style --foreground 208 | |
| echo "" | |
| echo "TROUVES (proj)" | gum style --foreground 82 | |
| cat $FICHIER | grep "| $PROJECT_FILTER |" | gum style --foreground "#326039" | |
| echo "" | |
| rename_project $PROJECT_FILTER | |
| echo "" | |
| echo "RESULTAT" | gum style --foreground 82 | |
| cat $FICHIER | grep "| $NEW_PROJECT_NAME |" | gum style --foreground "#326039" | |
| echo "🔍 New name -p : $PROJECT_FILTER -> ${NEW_PROJECT_NAME}" | gum style --foreground 208 | |
| else # NOT EXISTS | |
| echo "❌ ERROR aucun projet -- $PROJECT_FILTER -- touvé !" | gum style --foreground "#ff211e" | |
| projets "nodesc" | |
| echo "" | |
| echo "📁 Projet : $2" | gum style --foreground 208 | |
| echo "" | |
| echo "TROUVES (proj)" | gum style --foreground 82 | |
| cat $FICHIER | grep "| $PROJECT_FILTER |" | gum style --foreground "#326039" | |
| echo "" | |
| rename_project $PROJET | |
| echo "" | |
| echo "RESULTAT" | gum style --foreground 82 | |
| cat $FICHIER | grep "$NEW_PROJECT_NAME" | gum style --foreground "#326039" | |
| echo "🔍 New name -p : $2 -> ${NEW_PROJECT_NAME}" | gum style --foreground 82 | |
| fi | |
| elif [[ "$3" ]];then ## DESC | |
| echo "Rename --description" | gum style --foreground "#6cb4b5" | |
| if grep -q "| $2 | $3" "$FICHIER"; then | |
| cat $FICHIER | grep "| $2 | $3" | gum style --foreground "#326039" | |
| echo "" | |
| echo "DESC Existe !" | |
| echo "📁 Projet : $2" | gum style --foreground 208 | |
| echo "📝 Description : $3" | gum style --foreground 87 | |
| echo "" | |
| echo "TROUVES (desc)" | gum style --foreground 82 | |
| cat $FICHIER | grep "| $2 | $NEW_DESC_NAME" | |
| echo "" | |
| rename_desc $2 $3 | |
| echo "" | |
| echo "RESULTAT desc" | gum style --foreground 82 | |
| cat $FICHIER | grep "| $2 | $NEW_DESC_NAME" | gum style --foreground "#326039" | |
| echo "🔍 New name -d : $3 -> ${NEW_DESC_NAME}" | gum style --foreground 87 | |
| else # NOT EXISTS | |
| PROJET=$2 | |
| DESCRIPTION=$3 | |
| if grep -q "| $PROJET |" "$FICHIER"; then # PROJET TROUVE EXISTS | |
| echo "❌ ERROR - --proj OK , --desc NON TROUVÉ -- trouvé dans le fichier !" | gum style --foreground "#ff211e" | |
| descriptions $2 $3 "nodesc" | |
| # echo "-------" | |
| # echo $PROJET | gum style --foreground 208 | |
| # echo $DESCRIPTION | gum style --foreground 87 | |
| # echo "-------" | |
| else | |
| echo "❌ ERROR - --proj + --desc NON TROUVÉS -- trouvé dans le fichier !" | gum style --foreground "#ff211e" | |
| projets $2 "nodesc" | |
| # echo "-------" | |
| # echo $PROJET | gum style --foreground 208 | |
| # echo $DESCRIPTION | gum style --foreground 87 | |
| # echo "-------" | |
| fi | |
| echo "" | |
| echo "📁 Projet : $PROJET" | gum style --foreground 208 | |
| echo "📝 Description : $DESCRIPTION" | gum style --foreground 87 | |
| echo "" | |
| echo "TROUVES (desc)" | gum style --foreground 82 | |
| cat $FICHIER | grep "$PROJET" | grep "$DESCRIPTION" | gum style --foreground "#326039" | |
| echo "" | |
| rename_desc $2 $DESCRIPTION | |
| echo "" | |
| echo "RESULTAT desc 1" | gum style --foreground 82 | |
| cat $FICHIER | grep "| $PROJET | $NEW_DESC_NAME" | gum style --foreground "#326039" | |
| echo "🔍 New name -d : $DESCRIPTION -> ${NEW_DESC_NAME}" | gum style --foreground 87 | |
| fi | |
| description_exits=true | |
| else | |
| echo "1. Project 2. Description" | |
| fi | |
| # if [[ $arguments_exits ]];then | |
| # echo "---- $NEW_PROJECT_NAME" | |
| # cat $FICHIER | grep "$NEW_PROJECT_NAME" | |
| exit 1 | |
| fi | |
| closepanes() { | |
| JSON_DATA=$(wezterm cli list --format json | sed 's/%$//') | |
| CURRENT_PANE=$(echo "$JSON_DATA" | jq -r '.[] | select(.is_active == true) | .pane_id') | |
| echo "🛡️ Pane à GARDER: $CURRENT_PANE" | gum style --foreground "#326039" | |
| # TOUS les panes inactifs (simple, ignore tab_id) | |
| echo "$JSON_DATA" | jq -r --arg cur "$CURRENT_PANE" \ | |
| '.[] | select(.is_active == false) | .pane_id' | while read id; do | |
| [ -n "$id" ] && { | |
| echo "🗑️ Fermeture pane $id" | gum style --foreground "#326039" | |
| wezterm cli kill-pane --pane-id "$id" | |
| } | |
| done | |
| } | |
| paneclock() { | |
| SHOW_CLOCK=$(gum choose --header "C L O C K ?" "oui" "non") | |
| [[ "$SHOW_CLOCK" != "oui" ]] && exit 1 | |
| echo "" | |
| gum style --foreground 82 "🖥️ Création pane clock..." | |
| closepanes | |
| NEW_PANE=$(wezterm cli split-pane --bottom --percent 45) | |
| sleep 0.5 | |
| cat > "/tmp/clock-pane-script.sh" << 'EOF' | |
| #!/bin/bash | |
| echo "⏰ Clock démarrée ! Ctrl+C pour arrêter." | |
| /bin/tock watch | |
| echo "🔔 Clock terminée !" | |
| if gum choose --header "🛑 Arrêter la tache ??" "oui" "non" | grep -q "oui"; then | |
| echo "🛑 tock stop..." | |
| tock stop | |
| sleep 1 | |
| # ✅ FERMER PANE COURANT (auto-détecte) | |
| wezterm cli kill-pane | |
| fi | |
| sleep 1 | |
| echo "bye" | |
| # ✅ FERMER PANE COURANT (auto-détecte) | |
| wezterm cli kill-pane | |
| EOF | |
| chmod +x "/tmp/clock-pane-script.sh" | |
| echo "/tmp/clock-pane-script.sh" | wezterm cli send-text --pane-id "$NEW_PANE" | |
| wezterm cli activate-pane --pane-id "$NEW_PANE" | |
| } | |
| tselect() { | |
| SLECTED_tselect=$(awk -F ' \\| ' '{split($1, d, " - "); gsub(/^[ \t]+|[ \t]+$/, "", d[2]); printf "%-18s %-18s %-8s %s\n", d[1], d[2], $2, $3}' ~/.tock.txt | tac | \ | |
| gum filter --header "Filtre (proj/tâche/date)" --placeholder "Recherche..." | awk 'BEGIN{FS="[ \t]+"} {print $(NF-1), $NF}') | |
| } | |
| if [[ "$1" == "select" ]]; then | |
| ##### | |
| tselect | |
| ##### | |
| if [[ $SLECTED_tselect == "" ]];then | |
| echo "❌ NO SELECTED, exit" | gum style --foreground "#ff211e" | |
| exit 1 | |
| fi | |
| PROJET=$(echo $SLECTED_tselect | awk 'BEGIN{FS="[ \t]+"} {print $(NF-1)}') | |
| DESCRIPTION=$(echo $SLECTED_tselect | awk 'BEGIN{FS="[ \t]+"} {print $NF}') | |
| echo "📁 Projet : $PROJET" | gum style --foreground 208 | |
| echo "📝 Description : $DESCRIPTION" | gum style --foreground 87 | |
| WHAT_I_DO=$(gum choose --header "Que faire ?" "start" "addtime" "rename_desc" "remove" "exit") | |
| if [[ "$WHAT_I_DO" == "exit" ]]; then | |
| exit 1 | |
| fi | |
| echo "..." | |
| if [[ "$WHAT_I_DO" == "addtime" ]];then | |
| if [[ "$STARTIME" == "" ]]; then | |
| CURRENT_TIME=$(date +"%H:%M") | |
| STARTIME=$(echo -e "$CURRENT_TIME\n0:00\n➕ Autre\n08:00\n09:00\n10:00\n11:00\n12:00\n13:00\n14:00\n15:00\n16:00\n17:00\n18:00\n19:00\n20:00\n21:00\n22:00\n23:00\n00:00" | fzf \ | |
| --height 50% --border --header="Commencé à ↓") | |
| if [[ "$STARTIME" == "➕ Autre" ]]; then | |
| read -r -p "Débute à : " STARTIME | |
| elif [[ -z "$STARTIME" ]]; then | |
| STARTIME=$(gum write --placeholder "00h00" --width 80 --header "Commencé à ?") | |
| fi | |
| fi | |
| if [[ "$DURATION" == "" ]]; then | |
| DURATION=$(gum write --placeholder "1h, 20min" --width 80 --header "Durée... ?") | |
| fi | |
| /bin/tock add -p $PROJET -d $DESCRIPTION --duration "$DURATION" --start "$STARTIME" | |
| elif [[ "$WHAT_I_DO" == "start" ]];then | |
| /bin/tock start -p $PROJET -d $DESCRIPTION | |
| paneclock | |
| elif [[ "$WHAT_I_DO" == "rename_desc" ]];then | |
| if grep -q "| $PROJET | $DESCRIPTION" "$FICHIER"; then | |
| /bin/tock stop -p $PROJET -d $DESCRIPTION | |
| rename_desc $PROJET $DESCRIPTION | |
| else | |
| echo "projet non trouvé, étrange" | |
| fi | |
| elif [[ "$WHAT_I_DO" == "remove" ]];then | |
| /bin/tock stop -p $PROJET -d $DESCRIPTION | |
| descriptions "rm" $PROJET $DESCRIPTION | |
| fi | |
| exit 1 | |
| fi | |
| check_current_task() { | |
| # echo $1 | |
| # echo $2 | |
| # Lire 2 premières lignes, prendre la 2ème | |
| TASK_LINE=$(/bin/tock current 2>/dev/null | head -2 | tail -1 2>/dev/null) | |
| echo $TASK_LINE | |
| # ✅ IGNORER explicitement "No currently running activities." | |
| if [[ "$TASK_LINE" == "No currently running activities." ]]; then | |
| gum style --foreground "#b2faff" "✅ Aucune tâche en cours (0)" | |
| # echo "NOTASK" | |
| echo "" | |
| return 0 | |
| fi | |
| # Vérifier si ligne valide (pas header, pas vide) | |
| if [[ -n "$TASK_LINE" && ! "$TASK_LINE" =~ ^Start && "$TASK_LINE" != "Description" ]]; then | |
| CURRENT_TASK=$(echo "$TASK_LINE" | xargs 2>/dev/null) | |
| TEMPS_ECOULE=$(echo "$CURRENT_TASK" | awk '{print $NF}') | |
| CDESK=$(echo "$CURRENT_TASK" | awk '{print $3}') | |
| CPROJ=$(echo "$CURRENT_TASK" | awk '{print $4}') | |
| # CTIME=$(echo "$CURRENT_TASK" | awk '{print $5}') | |
| CTIME=$(echo "$CURRENT_TASK" | awk '{print $NF}') | |
| # echo $CURRENT_TASK | |
| echo ". . ." | |
| gum style --foreground "#eba036" "⚠️ TÂCHE EN COURS (tlast tls)" | |
| # gum style --foreground 208 "$CPROJ" | |
| # gum style --foreground 87 "$CDESK" | |
| # gum style --foreground 82 "⏱️ $CTIME" | |
| echo "📁 Projet : $CPROJ" | gum style --foreground 208 | |
| echo "📝 Description : $CDESK" | gum style --foreground 87 | |
| echo "⏱️ Durée/time : $CTIME" | gum style --foreground 82 | |
| echo "" | |
| if [[ $1 == "ctime" ]]; then | |
| exit 1 | |
| fi | |
| if gum choose --header "🛑 Arrêter cette tâche ?" "oui" "non" | grep -q "oui"; then | |
| gum style --foreground 208 "🛑 Arrêt de la tâche..." | |
| tock stop | |
| # gum style --foreground 45 "✅ Tâche arrêtée !" | |
| else | |
| gum style --foreground 82 "✅ Tâche continue..." | |
| fi | |
| else | |
| gum style --foreground "#b2faff" "✅ Aucune tâche en cours (not ctime)" | |
| fi | |
| echo | |
| } # check_current_task | |
| getlast() { | |
| ################################ | |
| ################################ | |
| ################################ | |
| # Parse les tâches pour fzf (format "# Description Project") | |
| selected=$( /bin/tock last | awk 'NR>1 {printf "[%s] %s %s\n", $1, $2, $3}' | fzf --tac --no-sort --prompt="Sélectionne une tâche: " ) | |
| # TASK_LINE=$(/bin/tock current 2>/dev/null | head -2 | tail -1 | fzf --tac --no-sort | head -1) | |
| if [ -n "$selected" ]; then | |
| # Extrait description (colonne 2) et projet (colonne 3) | |
| PROJET=$(echo "$selected" | awk '{print $3}') | |
| DESCRIPTION=$(echo "$selected" | awk '{print $2}') | |
| echo "📁 Projet : $PROJET" | gum style --foreground 208 | |
| echo "📝 Description : $DESCRIPTION" | gum style --foreground 87 | |
| if [[ "$1" == "start" ]]; then | |
| ######## | |
| gum style --foreground 45 "✅ Tâche start :" | |
| tock start -p $PROJET -d $DESCRIPTION | |
| paneclock | |
| ######## | |
| exit 1 | |
| elif [[ "$1" == "ctime" ]]; then | |
| ######## | |
| get_time $PROJET $DESCRIPTION $FICHIER | |
| ######## | |
| fi | |
| else | |
| echo "❌ Annulé, MOD 2 (-> fzf)" | |
| echo "" | |
| gum style --foreground 208 "SEARCH TASK --- get_time (fzf)" | |
| ask_projet_dec "noadd" ### GET PROJET + DESC/TASK | |
| echo "" | |
| echo "📁 Projet : $PROJET" | gum style --foreground 208 | |
| echo "📝 Description : $DESCRIPTION" | gum style --foreground 87 | |
| if [[ $1 == "start" ]]; then | |
| gum style --foreground 45 "✅ Tâche start (getlast start) :" | |
| tock start -p $PROJET -d $DESCRIPTION | |
| paneclock | |
| exit 1 | |
| fi | |
| get_time $PROJET $DESCRIPTION $FICHIER | |
| # echo $PROJET $DESCRIPTION $FICHIER | |
| exit 1 | |
| fi | |
| ################################ | |
| ################################ | |
| ################################ | |
| } # getlast | |
| get_time() { | |
| # === TROUVER TOUTES LES LIGNES CORRESPONDANTES + TEMPS TOTAL === | |
| LIGNES=$(grep -F "| $1 | $2" "$3") | |
| if [[ -n "$LIGNES" ]]; then | |
| # gum style --foreground 45 --border double "✅ ${#LIGNES[@]} LIGNE(S) TROUVÉE(S) !" | |
| # Afficher chaque ligne | |
| # echo "$LIGNES" | gum style --foreground 255 | |
| # Calculer TEMPS TOTAL pour toutes les lignes | |
| TOTAL_SECS=0 | |
| while IFS= read -r LIGNE; do | |
| if [[ "$LIGNE" =~ ^([0-9]{4}-[0-9]{2}-[0-9]{2}\ [0-9]{2}:[0-9]{2})\ -\ ([0-9]{4}-[0-9]{2}-[0-9]{2}\ [0-9]{2}:[0-9]{2}) ]]; then | |
| DEBUT="${BASH_REMATCH[1]}" | |
| FIN="${BASH_REMATCH[2]}" | |
| T1=$(date -d "$DEBUT" +%s 2>/dev/null) | |
| T2=$(date -d "$FIN" +%s 2>/dev/null) | |
| if [[ -n "$T1" && -n "$T2" ]]; then | |
| DIFF=$((T2 - T1)) | |
| TOTAL_SECS=$((TOTAL_SECS + DIFF)) | |
| fi | |
| fi | |
| done <<< "$LIGNES" | |
| # Afficher total | |
| if [[ $TOTAL_SECS -gt 0 ]]; then | |
| HEURES=$((TOTAL_SECS / 3600)) | |
| MINUTES=$(((TOTAL_SECS % 3600) / 60)) | |
| SECS=$((TOTAL_SECS % 60)) | |
| # echo -e "⏱️ TEMPS TOTAL :\n\n" | gum style --foreground 208 --bold | |
| echo "⏱️ TEMPS TOTAL : ${HEURES} h ${MINUTES}m" | gum style --foreground 82 | |
| echo "" | |
| fi | |
| else | |
| gum style --foreground 212 "ℹ️ !!!!! Aucune ligne trouvée pour '$1 | $2'" | |
| echo | |
| fi | |
| } # get_time | |
| if [[ "$1" == "last" ]]; then | |
| # ✅ VÉRIFIER TÂCHE EN COURS (gère cas "No activities") | |
| # echo "---last" | |
| ######## | |
| check_current_task "last" | |
| ######## | |
| # echo "getlast" | |
| echo "" | |
| gum style --foreground 208 "LAST TASK (fzf)" | |
| getlast "start" | |
| # exit 1 | |
| fi # last | |
| # tnow | |
| if [[ "$1" == "current" ]]; then | |
| /bin/tock current | |
| echo $2 | |
| [[ $2 != "clock" ]] && GO_CURRENT=$(gum choose "bye" "clock" "start" "stop") | |
| if [[ "$GO_CURRENT" == "start" ]]; then | |
| echo "" | |
| else | |
| if [[ "$GO_CURRENT" == "bye" ]]; then | |
| #### | |
| exit 1 | |
| elif [[ "$GO_CURRENT" == "clock" ]]; then | |
| paneclock | |
| exit 1 | |
| elif [[ "$GO_CURRENT" == "stop" ]]; then | |
| #### | |
| /bin/tock stop | |
| #### | |
| if [[ -n "$TOCK_PANES" ]]; then | |
| gum style --foreground 208 "🗑️ Fermeture $(echo "$TOCK_PANES" | wc -l) pane(s) '/bin/tock'..." | |
| echo "$TOCK_PANES" | while read -r PANE_ID; do | |
| [[ -n "$PANE_ID" ]] && wezterm cli kill-pane --pane-id "$PANE_ID" | |
| done | |
| sleep 0.5 | |
| fi | |
| fi | |
| exit 1 | |
| fi | |
| fi # tnow current | |
| if [[ $1 == "continue" ]]; then | |
| exit 1 | |
| elif [[ $2 == "clock" ]]; then | |
| exit 1 | |
| fi | |
| if [[ $1 == "continue" ]]; then | |
| exit 1 | |
| elif [[ $2 == "clock" ]]; then | |
| exit 1 | |
| fi | |
| # add | |
| if [[ "$1" == "a" ]]; then ### 1 | |
| # tock add --description yes --project jav --duration 1h --start 00:00 | |
| if [[ "$5" != "" ]];then # "a" + 4 # miss 0 | |
| /bin/tock add $@ | |
| exit 1 | |
| elif [[ "$4" != "" ]];then # miss 1 | |
| DURATION=$3 | |
| elif [[ "$2" != "" ]];then # miss 3 / $3... | |
| # echo "--m2" | |
| # echo "$@" | |
| PROJET=$2 | |
| PROJECT_FILTER=$PROJET | |
| cat $FICHIER | grep "| $PROJECT_FILTER |" > $TMP_FILE | |
| # cat $TMP_FILE | |
| if [[ "$3" != "" ]];then # miss 2 | |
| # echo "--m3" | |
| DESCRIPTION=$3 | |
| else | |
| DESCRIPTIONS=$(awk -F' \\| ' '{print $3}' "$TMP_FILE" | sed '/_____RAS$/d' | sort -u) | |
| [[ "$DESCRIPTIONS" ]] && DESCRIPTIONS="\n$DESCRIPTIONS" | |
| DESCRIPTION_CHOIX=$(echo -e "_____RAS\n➕ Nouvelle$DESCRIPTIONS" | fzf \ | |
| --height 50% --border --header="Description ↓" \ | |
| --preview "grep '$PROJET_GO' '$FICHIER'") | |
| if [[ "$DESCRIPTION_CHOIX" == "➕ Nouvelle" ]]; then | |
| read -r -p "TACHE : " DESCRIPTION_CHOIX | |
| DESCRIPTION=$DESCRIPTION_CHOIX | |
| elif [[ "$DESCRIPTION_CHOIX" ]]; then | |
| DESCRIPTION=$DESCRIPTION_CHOIX | |
| elif [[ -z "$DESCRIPTION_CHOIX" ]]; then | |
| echo "❌ Annulé"; exit 0 | |
| fi | |
| fi # --m3 | |
| else # miss all | |
| # echo "--m3" | |
| # echo "$@" | |
| PROJETS=$(awk -F' \\| ' '{print $2}' "$FICHIER" | sort -u) | |
| PROJET_GO=$(echo -e "➕ Ajouter\n$PROJETS" | fzf --height 40% --border --header="Projet ↓") | |
| # echo $PROJET_GO | |
| if [[ "$PROJET_GO" == "➕ Ajouter" ]]; then | |
| PROJET=$(gum input --placeholder "Tache du projet..." --header "1. Projet") | |
| else | |
| PROJET=$PROJET_GO | |
| fi | |
| PROJECT_FILTER="$PROJET" | |
| # echo $PROJECT_FILTER | |
| cat $FICHIER | grep "| $PROJECT_FILTER |" > $TMP_FILE | |
| DESCRIPTIONS=$(awk -F' \\| ' '{print $3}' "$TMP_FILE" | sed '/_____RAS$/d' | sort -u) | |
| [[ "$DESCRIPTIONS" ]] && DESCRIPTIONS="\n$DESCRIPTIONS" | |
| DESCRIPTION_CHOIX=$(echo -e "_____RAS\n➕ Nouvelle$DESCRIPTIONS" | fzf \ | |
| --height 50% --border --header="Description ↓" \ | |
| --preview "grep '$PROJET_GO' '$FICHIER'") | |
| if [[ "$DESCRIPTION_CHOIX" == "➕ Nouvelle" ]]; then | |
| read -r -p "TACHE : " DESCRIPTION_CHOIX | |
| DESCRIPTION=$DESCRIPTION_CHOIX | |
| elif [[ "$DESCRIPTION_CHOIX" ]]; then | |
| DESCRIPTION=$DESCRIPTION_CHOIX | |
| elif [[ -z "$DESCRIPTION_CHOIX" ]]; then | |
| echo "❌ Annulé"; exit 0 | |
| fi | |
| fi | |
| if [[ "$PROJET" == "" ]]; then | |
| echo '❌ PROJET' | |
| exit 1 | |
| elif [[ "$DESCRIPTION" == "" ]]; then | |
| echo '❌ 1 DESCRIPTION' | |
| exit 1 | |
| fi | |
| echo "📁 Projet : $PROJET" | gum style --foreground 208 | |
| echo "📝 Description : $DESCRIPTION" | gum style --foreground 87 | |
| if [[ "$STARTIME" == "" ]]; then | |
| CURRENT_TIME=$(date +"%H:%M") | |
| STARTIME=$(echo -e "$CURRENT_TIME\n0:00\n➕ Autre\n08:00\n09:00\n10:00\n11:00\n12:00\n13:00\n14:00\n15:00\n16:00\n17:00\n18:00\n19:00\n20:00\n21:00\n22:00\n23:00\n00:00" | fzf \ | |
| --height 50% --border --header="Commencé à ↓") | |
| if [[ "$STARTIME" == "➕ Autre" ]]; then | |
| read -r -p "Débute à : " STARTIME | |
| elif [[ -z "$STARTIME" ]]; then | |
| STARTIME=$(gum write --placeholder "00h00" --width 80 --header "Commencé à ?") | |
| fi | |
| fi | |
| if [[ "$DURATION" == "" ]]; then | |
| DURATION=$(gum write --placeholder "1h, 20min" --width 80 --header "Durée... ?") | |
| fi | |
| # gum style --foreground 212 " ⏱️ $STARTIME -> $DURATION" | |
| echo "⏱️ Durée Time : ${STARTIME} -> ${DURATION}" | gum style --foreground 82 | |
| ##### | |
| # echo "GO ADD !!!" | |
| echo "tadd -p ${PROJET} -d ${DESCRIPTION} --duration ${DURATION} --start ${STARTIME}" | |
| /bin/tock add -p "$PROJET" -d "$DESCRIPTION" --duration "$DURATION" --start "$STARTIME" | |
| exit 1 | |
| fi # add | |
| if [[ $1 == "rm" ]]; then | |
| projets $1 | |
| exit 1 | |
| fi | |
| # ✅ VÉRIFIER TÂCHE EN COURS (gère cas "No activities") | |
| check_current_task() { | |
| # echo $1 | |
| # echo $2 | |
| # Lire 2 premières lignes, prendre la 2ème | |
| TASK_LINE=$(/bin/tock current 2>/dev/null | head -2 | tail -1) | |
| # ✅ IGNORER explicitement "No currently running activities." | |
| if [[ "$TASK_LINE" == "No currently running activities." ]]; then | |
| gum style --foreground "#b2faff" "✅ Aucune tâche en cours (ctask)" | |
| if [[ $1 == "ctime" ]]; then | |
| # echo "oUI CTIME" | |
| echo "" | |
| gum style --foreground 208 "LAST TASK (fzf)" | |
| getlast "ctime" | |
| exit 1 | |
| fi | |
| elif [[ $1 == "last" ]];then | |
| echo "-----last" | |
| fi | |
| # Vérifier si ligne valide (pas header, pas vide) | |
| if [[ -n "$TASK_LINE" && ! "$TASK_LINE" =~ ^No && "$TASK_LINE" != "Description" ]]; then | |
| echo $TASK_LINE | |
| CURRENT_TASK=$(echo "$TASK_LINE" | xargs) | |
| CDESK=$(echo "$CURRENT_TASK" | awk '{print $3}') | |
| CPROJ=$(echo "$CURRENT_TASK" | awk '{print $4}') | |
| CTIME=$(echo "$CURRENT_TASK" | awk '{print $NF}') | |
| echo "" | |
| printf '\033[38;5;208m\033[1m⚠️ TÂCHE EN COURS (ttime) :\033[0m' | |
| echo "" | |
| echo "📁 Projet : $CPROJ" | gum style --foreground 208 | |
| echo "📝 Description : $CDESK" | gum style --foreground 87 | |
| echo "⏱️ Durée/time : $CTIME" | gum style --foreground 82 | |
| # echo "" | |
| if [[ $1 == "ctime" ]]; then | |
| # echo "---ctime" | |
| get_time "$CPROJ" "$CDESK" "$FICHIER" | |
| exit 1 | |
| fi | |
| if gum choose --header "🛑 Arrêter cette tâche ?" "oui" "non" | grep -q "oui"; then | |
| gum style --foreground 208 "🛑 Arrêt de la tâche..." | |
| tock stop | |
| gum style --foreground 45 "✅ Tâche arrêtée !" | |
| else | |
| gum style --foreground 82 "✅ Tâche continue..." | |
| fi | |
| else | |
| gum style --foreground "#b2faff" "✅ Aucune tâche en cours (1)" | |
| fi | |
| } | |
| if [[ $1 != "ntime" ]]; then | |
| check_current_task | |
| fi | |
| if [[ $2 == "ctime" ]]; then | |
| check_current_task "ctime" | |
| fi | |
| ####################################### | |
| ####################################### | |
| ####################################### | |
| ####################################### | |
| ####################################### | |
| ####################################### | |
| if printf '%s\n' "$@" | grep -qw "ntime"; then | |
| # echo "ttt" | |
| # echo "$@" | |
| if [[ -z "$2" ]];then | |
| # echo "m2" | |
| projets $@ | |
| elif [[ -z "$3" ]];then | |
| # echo "m3" | |
| ask_projet_dec $2 noadd | |
| else | |
| # echo "m else" | |
| ### alias ttime === tock ntime blaprojet bladesc | |
| PROJET_GO=$2 | |
| DESCRIPTION=$3 | |
| fi | |
| else | |
| if [[ -z "$1" ]]; then # ← Vérifie $1 (pas $2 !) | |
| # echo "1 ppp" | |
| ask_projet_dec # ← Appel SANS argument = mode interactif | |
| elif [[ $2 == "" ]]; then | |
| # echo "2 ppp" | |
| ask_projet_dec "$1" # ✅ $1 devient $1 de la fonction | |
| else # 2 Présent | |
| # echo "3 iii" | |
| PROJET_GO=$1 | |
| DESCRIPTION=$2 | |
| fi | |
| fi | |
| ####################################### | |
| ####################################### | |
| ####################################### | |
| ####################################### | |
| ####################################### | |
| ####################################### | |
| # Récap + tock start | |
| echo "" | |
| # echo $@ | |
| if [[ $1 == "ctime" || $1 == "ntime" ]]; then | |
| gum style --foreground 212 "TIMES :" | |
| else | |
| gum style --foreground 212 "PROJET PRÊT !" | |
| fi | |
| echo "📁 Projet : $PROJET_GO" | gum style --foreground 208 | |
| echo "📝 Description : $DESCRIPTION" | gum style --foreground 87 | |
| get_time "$PROJET_GO" "$DESCRIPTION" "$FICHIER" | |
| if printf '%s\n' "$@" | grep -qw "ntime"; then | |
| # echo "'ntime' trouvé !" | |
| exit 1 | |
| fi | |
| ########### | |
| # Lancer tock start | |
| /bin/tock start -p "$PROJET_GO" -d "$DESCRIPTION" | |
| echo "" | |
| ########### | |
| paneclock |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
need to fix PATHS
/bin/tock
and
/home/vi/Scripts/@KEEP/TUI_tock/TUI_tock_new_task.sh