edit:add-var history~ {|@argv| use flag use re use store use str use framagit.org/benjamin.vaudour/elv-lib/mods/map fn -history {|@seq| var @seq = (order $seq | compact) var all = (== (count $seq) 0) if $all { store:cmds 0 -1 } else { store:cmds 0 -1 | each {|h| if (has-value $seq $h[seq]) { put $h } } } } fn -group {|| var @hist = (all) var group = [&] each {|h| var t s = $h[text] $h[seq] var seq = (conj (map:value-of &default=[] $group $t) $s) set group[$t] = $seq } $hist put $group } fn -search {|cb| -history | each {|h| if ($cb $h[text]) { put $h } } } fn -remove {|seq| each $store:del-cmd~ $seq } fn clean {|| var hist = (-history | -group) keys $hist | each {|k| var seq = $hist[$k] var l = (- (count $seq) 1) if (> $l 0) { put $seq[..$l] } } | each $-remove~ } fn -parse {|@args| var flags term = (flag:parse $args [ [r $false 'Regexp'] [e $false 'Exact'] [i $false 'Insensible à la casse'] ]) if (== (count $term) 0) { fail 'Veuillez préciser le terme de recherche' } set term = $term[0] var contains~ = {|s| str:contains $s $term } var exact~ = {|s| ==s $s $term } var match~ = {|s| re:match $term $s } var insensitive~ = {|cb| put {|s| $cb (str:to-lower $s) $term } } var cb = $contains~ if $flags[e] { if $flags[i] { set term = (str:to-lower $term) set cb = (insensitive $exact~) } else { set cb = $exact~ } } elif $flags[r] { if $flags[i] { set term = '(?i)'$term } set cb = $match~ } elif $flags[i] { set term = (str:to-lower $term) set cb = (insensitive $contains~) } put $cb } fn search {|@args| var cb = (-parse $@args) -search $cb | each {|h| put $h[text] } | order | compact } fn remove {|@args| var cb = (-parse $@args) var hist = (-search $cb | -group) if (== (count $hist) 0) { echo 'Terme non trouvé' } else { var @keys = (keys $hist | order | compact) echo 'Sélectionnez les entrées à supprimer séparées par des virgules (0 pour tout, par défaut, rien)' echo range (count $keys) | each {|i| printf "%d) %s\n" (+ $i 1) $keys[$i] } print 'Votre choix : ' echo var result = (read-line) if (re:match '^\d+(,\d+)*$' $result) { var @idx = (str:split ',' $result) var @seq = [] var l = (count $keys) if (has-value $idx 0) { set @seq = (keys $hist | each {|k| all $hist[$k] }) } else { set @seq = (each {|i| if (<= $i $l) { var k = $keys[(- $i 1)] all $hist[$k] } } $idx) } set @seq = (order $seq | compact) -remove $seq printf "%d entrées supprimées\n" (count $seq) } else { echo 'Action annulée' } } } var actions = [ #&help= $help~ &clean= $clean~ &search= $search~ &del= $remove~ ] var action @argv = $@argv $actions[$action] $@argv } edit:add-var dir-history~ {|@argv| use flag use re use store use str use framagit.org/benjamin.vaudour/elv-lib/mods/map fn -dirs {|| store:dirs | each {|d| put $d[path] } | order | compact } fn -search {|cb| -dirs | each {|d| if ($cb $d) { put $d } } } fn -remove {|dirs| each $store:del-dir~ $dirs } fn clean {|| -remove (-dirs) } fn -parse {|@args| var flags term = (flag:parse $args [ [r $false 'Regexp'] [e $false 'Exact'] [i $false 'Insensible à la casse'] ]) if (== (count $term) 0) { fail 'Veuillez préciser le terme de recherche' } set term = $term[0] var contains~ = {|s| str:contains $s $term } var exact~ = {|s| ==s $s $term } var match~ = {|s| re:match $term $s } var insensitive~ = {|cb| put {|s| $cb (str:to-lower $s) $term } } var cb = $contains~ if $flags[e] { if $flags[i] { set term = (str:to-lower $term) set cb = (insensitive $exact~) } else { set cb = $exact~ } } elif $flags[r] { if $flags[i] { set term = '(?i)'$term } set cb = $match~ } elif $flags[i] { set term = (str:to-lower $term) set cb = (insensitive $contains~) } put $cb } fn search {|@args| var cb = (-parse $@args) -search $cb } fn remove {|@args| var cb = (-parse $@args) var @dirs = (-search $cb) if (== (count $dirs) 0) { echo 'Terme non trouvé' } else { echo 'Sélectionnez les entrées à supprimer séparées par des virgules (0 pour tout, par défaut, rien)' echo range (count $dirs) | each {|i| printf "%d) %s\n" (+ $i 1) $dirs[$i] } print 'Votre choix : ' echo var result = (read-line) if (re:match '^\d+(,\d+)*$' $result) { var @idx = (str:split ',' $result) var @seq = [] var l = (count $dirs) if (has-value $idx 0) { set seq = $dirs } else { set @seq = (each {|i| if (and (> $i 0) (<= $i $l)) { var k = (- $i 1) put $dirs[$k] } } $idx) } set @seq = (order $seq | compact) -remove $seq printf "%d entrées supprimées\n" (count $seq) } else { echo 'Action annulée' } } } var actions = [ #&help= $help~ &clean= $clean~ &search= $search~ &del= $remove~ ] var action @argv = $@argv $actions[$action] $@argv }