264 lines
5.7 KiB
Text
264 lines
5.7 KiB
Text
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
|
|
}
|