elvish_config/aliases/history.elv

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
}