Skip to content

Instantly share code, notes, and snippets.

@bonnebulle
Last active February 1, 2026 17:11
Show Gist options
  • Select an option

  • Save bonnebulle/a9e85099fdbe9ebe1d1b4b5f91ab7718 to your computer and use it in GitHub Desktop.

Select an option

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
#!/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
@bonnebulle
Copy link
Author

need to fix PATHS
/bin/tock
and
/home/vi/Scripts/@KEEP/TUI_tock/TUI_tock_new_task.sh

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment