Evaluer ses scripts en temps réel (dangereux ⚠️) - retour accueil
git clone git://bebou.netlib.re/liverepl
Log | Files | Refs | README |
commit f72d2ba44473cee7907e2b21cdbba97cf56df892 parent bf0b025e77d863259aca29bf7dfabb7780f58d7b Auterice: Arthur Pons <arthur.pons@unistra.fr> Date: Wed, 28 Aug 2024 16:08:44 +0200 Toute nouvelle interface, c'est mieux Diffstat:
M | README | | | 25 | +++++++++++++++++++++++-- |
A | findtoaction | | | 9 | +++++++++ |
M | liverepl | | | 78 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------- |
A | pipeline | | | 18 | ++++++++++++++++++ |
D | tmuxliverepl | | | 16 | ---------------- |
5 files changed, 112 insertions(+), 34 deletions(-)
diff --git a/README b/README @@ -1,2 +1,23 @@ -Attention, n'utilisez pas ce projet à moins que vous sachiez vraiment ce que -vous faites +# liverepl + +Un outil pour évaluer automatiquement des commandes unix. Il est possible de +l'utiliser pour filtrer une entrée ou en source de donnée. Il est possible de +ne modifier qu'une partie d'un squelette de commande renseigné en argument ou +d'écrire la commande en entier. + +Renvoie dans stdin le contenu généré ou filtré. + +Prend des arguments : + +-f si la commande tapée filtre, si pas de -f alors la commande génère +-i le fichier en entrée, - pour stdin (-f alors obligatoire) +-o fichier de sortie + +Si -i ou -o manquant alors ce seront des fichiers temporaires dans /tmp + +Dépend de zsh (pour son builtin read) + +Permet de faire des trucs comme findtoaction ou pipeline + +Un POC, pas très performant (avec les clears et le besoin de se rafraichir constamment) + diff --git a/findtoaction b/findtoaction @@ -0,0 +1,9 @@ +#! /bin/sh + +a=$(find | ./liverepl -f "grep -E '{}'") +b=$(echo "$a" | ./liverepl -f "xargs {} echo $1") +clear +echo "$b" +read -p "Do you want to execute this ?" ans +[ "$ans" = "y" ] +echo "$b" | sh diff --git a/liverepl b/liverepl @@ -1,16 +1,62 @@ -#! /bin/sh - -script=$(mktemp) -data=$(mktemp) -touch "$script" -chmod +x "$script" -vim -c "set aw"\ - -c "autocmd TextChanged * silent! !$script > $data 2>&1"\ - -c "autocmd TextChangedI * silent! !$script > $data 2>&1"\ - -c "vnew $data"\ - -c "set updatetime=100 | set autoread | au CursorHoldI * checktime | au CursorHold * checktime"\ - -c "wincmd h"\ - -c "doautocmd TextChanged"\ - "$script" -echo "script : $script" -echo "données : $data" +#! /bin/zsh + +while getopts "fi:o:c:" opt;do + case $opt in + (i|o|c) + eval "$opt='$OPTARG'";; + (f) + filter="yes" + esac +done + +[ -n "$i" ] && tmpf="$i" || tmpf=$(mktemp) +[ -n "$o" ] && tmpres="$o" || tmpres=$(mktemp) +setopt extendedglob +trap "echo -n '\033[?25h' 1>&2" EXIT QUIT KILL SIGKILL SIGINT INT +entry="" +key="" +echo -n "\033[?25l" 1>&2 + +[ "$filter" = "yes" -a "$tmpf" = "-" ] && {tmpf=$(mktemp);cat > $tmpf;} + +saveanddisp() { tee $tmpres | head -n$(( $(tput lines) - 2 )) 1>&2 } + +dispprompt() { + echo -n "\033[$(( $(tput lines) - 1 ))B" 1>&2 + echo -n "\033[92m> \033[0m$entry" 1>&2 + echo -n "\033[H" 1>&2 +} + +managekey() { + case "$key" in + () [ "${#entry}" -gt 0 ] && entry=${entry::-1};; + () entry="";; + (|$'\n') break;; + (*) entry="$entry$key";; + esac +} + +while :;do + clear + echo -n "\033[2J" 1>&2 + if [ "$filter" = "yes" ];then + if [ -n "$c" ];then + eval < $tmpf $(echo "$c" | sed -E "s\{\}$entry") | + saveanddisp + else + eval < $tmpf "${entry:-cat}" | + saveanddisp + fi + elif [ -n "$c" ];then + eval $(echo "$c" | sed -E "s\{\}$entry") | + saveanddisp + else + eval "$entry" | saveanddisp + fi + key="" + dispprompt; read -t1 -k1 key; managekey +done +clear +echo -n "\033[?25h" 1>&2 +cat $tmpres + diff --git a/pipeline b/pipeline @@ -0,0 +1,18 @@ +#! /bin/sh + +while getopts "t:n:" opt;do + eval "$opt='$OPTARG'" +done + +nb="${n:-1}" +tmpd=$(mktemp -d) +tmux new-session -d -s "$t" "./liverepl -o $tmpd/1" +tmux send-keys -t "$t" "seq 10" +for i in $(seq 2 $nb);do + tmux split-window -t "$t" -h "./liverepl -f -i $tmpd/$(($i-1)) -o $tmpd/$i" +done +tmux select-pane -t "$t":0.0 +tmux select-layout -t "$t" even-horizontal +# Attach to session +tmux attach -t "$t" + diff --git a/tmuxliverepl b/tmuxliverepl @@ -1,16 +0,0 @@ -#! /bin/sh - -[ -e "$2" ] && { echo "fichier $2 existe déjà"; exit 1; } -script=${1:-$(mktemp)} -data=${2:-$(mktemp)} -touch "$script" -chmod +x "$script" -tmux new \ -vim -c "set aw"\ - -c "autocmd TextChanged * silent! !./$script > $data 2>&1"\ - -c "autocmd TextChangedI * silent! !./$script > $data 2>&1"\ - -c "doautocmd TextChanged"\ - "$script"\ -\; split-window -h "watch -c -d -t -n 0.1 cat $data" \; select-pane -L -echo "script : $script" -echo "données : $data"