From 7ae2fc2712a4dac490d2621fe35369b6b8c79cb8 Mon Sep 17 00:00:00 2001 From: Benjamin VAUDOUR Date: Sun, 27 Apr 2025 13:40:01 +0200 Subject: [PATCH] =?UTF-8?q?D=C3=A9sactivation=20de=20la=20commande=20pdf,?= =?UTF-8?q?=20ajout=20de=20commandes=20pour=20r=C3=A9cup=C3=A9rer=20les=20?= =?UTF-8?q?PKGBUILD=20Arch/AUR,=20commande=20de=20cn=C3=A9ation=20de=20fic?= =?UTF-8?q?hiers=20php,=20gestion=20de=20l=E2=80=99historique=20d=E2=80=99?= =?UTF-8?q?Elvish,=20nouveaux=20aliases=20(gzip,=20bzip2)=20+=20remplaceme?= =?UTF-8?q?nt=20de=20dog=20par=20doggo=20&=20exa=20par=20eza,=20helix=20ut?= =?UTF-8?q?ilis=C3=A9=20d=C3=A9sormais=20par=20d=C3=A9faut,=20rr=C3=A9?= =?UTF-8?q?=C3=A9criture=20de=20vpn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aliases/aliases.elv | 8 +- aliases/arch.elv | 25 +++ aliases/aur.elv | 11 + aliases/create-php.elv | 69 ++++++ aliases/history.elv | 264 +++++++++++++++++++++++ aliases/ls.elv | 12 +- aliases/pdf.elv | 462 ----------------------------------------- aliases/pdf.elv.save | 451 ++++++++++++++++++++++++++++++++++++++++ aliases/pdf.help | 97 +++++---- aliases/vi.elv | 2 +- aliases/vpn.elv | 273 ++++++++++++------------ rc.elv | 9 +- 12 files changed, 1041 insertions(+), 642 deletions(-) create mode 100644 aliases/arch.elv create mode 100644 aliases/aur.elv create mode 100644 aliases/create-php.elv create mode 100644 aliases/history.elv delete mode 100644 aliases/pdf.elv create mode 100644 aliases/pdf.elv.save diff --git a/aliases/aliases.elv b/aliases/aliases.elv index 67264f0..ed97fa7 100644 --- a/aliases/aliases.elv +++ b/aliases/aliases.elv @@ -1,18 +1,24 @@ edit:add-var aspire~ {|@argv| e:wget -r -k -E -np $@argv } +edit:add-var bzip2~ {|@argv| e:lbzip2 $@argv } edit:add-var cat~ {|@argv| e:bat -pp --tabs 2 $@argv } edit:add-var cp~ {|@argv| e:cp -iv $@argv } edit:add-var curl~ $e:curlie~ edit:add-var df~ $e:duf~ edit:add-var diff~ $e:delta~ edit:add-var dig~ {|@argv| e:dig +noall +answer $@argv } -edit:add-var dogall~ {|@argv| e:dog A AAAA CNAME TXT MX NS SOA $@argv } +edit:add-var dogall~ {|@argv| e:doggo A AAAA CNAME TXT MX NS SOA $@argv } edit:add-var du~ {|@argv| e:du -h $@argv } fn -erd {|@argv| e:erd -HlI --dir-order last --sort name --layout inverted $@argv } #edit:add-var erd~ $-erd~ edit:add-var grep~ {|@argv| e:grep --color=tty -d skip $@argv } +edit:add-var gzip~ {|@argv| e:pigz $@argv } #edit:add-var grep~ {|@argv| e:ack $@argv } edit:add-var hx~ {|@argv| e:helix $@argv } edit:add-var mv~ {|@argv| e:mv -iv $@argv } +edit:add-var open-db~ {|@argv| + var @params = (print (e:cat $E:HOME/.config/elvish/private/mariadb_connection) | from-terminated ' ') + e:dblab $@params --db $@argv +} edit:add-var pf~ {|@argv| e:pkgfile -vri $@argv } edit:add-var rm~ {|@argv| e:rm -Iv $@argv } edit:add-var rename~ {|@argv| /home/benjamin/bin/rename $@argv } diff --git a/aliases/arch.elv b/aliases/arch.elv new file mode 100644 index 0000000..3112d36 --- /dev/null +++ b/aliases/arch.elv @@ -0,0 +1,25 @@ +use str +var archbase = 'https://gitlab.archlinux.org/archlinux/packaging/packages/{repo}/-/raw/main/{file}' +var aurbase = 'https://aur.archlinux.org/cgit/aur.git/plain/{file}?h={repo}' + +fn -dl {|baseUrl repo @files| + if (== (count $files) 0) { + set @files = PKGBUILD + } + + echo $files + + each {|file| + var url = (str:replace '{file}' $file (str:replace '{repo}' $repo $baseUrl)) + printf "wget2 -O %s %s\n" $file $url + e:wget2 -O $file $url + } $files +} + +edit:add-var arch-dl~ {|repo @files| + -dl $archbase $repo $@files +} + +edit:add-var aur-dl~ {|repo @files| + -dl $aurbase $repo $@files +} diff --git a/aliases/aur.elv b/aliases/aur.elv new file mode 100644 index 0000000..37ddd5f --- /dev/null +++ b/aliases/aur.elv @@ -0,0 +1,11 @@ +edit:add-var aur-get~ {|package @files| + if (eq (count $files) 0) { + echo "usage: aur-get file1 [file2...]" + } + + peach {|file| + var url = (printf 'https://aur.archlinux.org/cgit/aur.git/plain/%s?h=%s' $file $package) + printf "Command: wget -O %s %s" $file $url + wget -O $file $url + } $files +} diff --git a/aliases/create-php.elv b/aliases/create-php.elv new file mode 100644 index 0000000..b8ffde4 --- /dev/null +++ b/aliases/create-php.elv @@ -0,0 +1,69 @@ +edit:add-var create-php~ {|@argv| + use flag + use os + use str + + var flags rest = (flag:parse $argv [ + [a $false 'Classe abstraite'] + [c $false 'Classe standard'] + [i $false 'Interface'] + [t $false 'Trait'] + ]) + + if (!= (count $rest) 1) { + echo 'Usage: create-php [-a|-c|-i|-t] ' + return + } + + var name = $@rest + var gitRoot = (git rev-parse --show-toplevel) + var currentDir = (pwd -P) + var currentDirRelative = (str:replace &max=1 $gitRoot '' $currentDir) + var isRoot = (==s $currentDirRelative '') + var isSrc = (==s $currentDirRelative '/src') + + if (and (not $isRoot) (not $isSrc) (!= (str:index $currentDirRelative '/src/') 0)) { + fail 'Vous devez être à la racine du projet ou dans un sous-répertoire de src/' + } + + var fromRoot = (== (str:index $name 'src/') 0) + if $fromRoot { + set name = (str:replace &max=1 'src/' '' $name) + } + + var @spl = (str:split '/' $name) + var @path className = $@spl + set path = (str:join '/' $path) + if (not (or $isRoot $isSrc $fromRoot)) { + set path = (printf '%s/%s' $currentDirRelative $path | str:trim-prefix '/') + } + + var fileName = (printf '%s/%s.php' $path $className) + var fullPath = (printf '%s/src/%s' $gitRoot $fileName) + if (os:exists &follow-symlink=$true $fullPath) { + fail 'Le fichier '$fullPath' existe déjà.' + } + + os:mkdir-all $gitRoot'/src/'$path + + var namespace = (str:replace '/' '\' $path) + var type = 'class' + if $flags['a'] { + set type = 'abstract class' + } elif $flags['i'] { + set type = 'interface' + } elif $flags['t'] { + set type = 'trait' + } + var content = [ + ' $fullPath +} diff --git a/aliases/history.elv b/aliases/history.elv new file mode 100644 index 0000000..a875bc0 --- /dev/null +++ b/aliases/history.elv @@ -0,0 +1,264 @@ +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 +} diff --git a/aliases/ls.elv b/aliases/ls.elv index b2b9591..2048094 100644 --- a/aliases/ls.elv +++ b/aliases/ls.elv @@ -6,12 +6,12 @@ fn -go-ls {|@argv| e:go-ls --group-directories-first -T '+%Y.%m.%d %H:%M' --git $@argv } -fn -exa {|@argv| - e:exa --color auto --git --icons --group-directories-first $@argv +fn -eza {|@argv| + e:eza --color auto --git --icons --group-directories-first $@argv } -fn -exal {|@argv| - -exa -lghH@ --time-style long-iso $@argv +fn -ezal {|@argv| + -eza -lghH --time-style long-iso $@argv } fn -lsd {|@argv| @@ -22,8 +22,8 @@ fn -lsdl {|@argv| -lsd -lg --header $@argv } -var cmd = $-exa~ -var cmdl = $-exal~ +var cmd = $-eza~ +var cmdl = $-ezal~ edit:add-var ls~ {|@argv| $cmd $@argv } #edit:add-var la~ {|@argv| $cmd -a $@argv } diff --git a/aliases/pdf.elv b/aliases/pdf.elv deleted file mode 100644 index cd3c90d..0000000 --- a/aliases/pdf.elv +++ /dev/null @@ -1,462 +0,0 @@ -edit:add-var pdf~ {|action @args| - use math - use os - use path - use re - use str - use framagit.org/benjamin.vaudour/elv-lib/mods/common - use framagit.org/benjamin.vaudour/elv-lib/mods/format - use framagit.org/benjamin.vaudour/elv-lib/mods/map - use framagit.org/benjamin.vaudour/elv-lib/mods/pdf - - var -c~ = $common:cexec~ - var -cc~ = {|c f1| -c $c $f1 $nop~} - - fn must-pdf {|file| -cc (not (pdf:is-pdf $file)) { fail (printf '%s n’est pas un fichier pdf' $file) }} - fn must-exist {|file| -cc (pdf:not-exist $file) { fail (printf '%s n’existe pas' $file) }} - fn must-not-exist {|file| -cc (pdf:exist $file) { fail (printf '%s existe déjà' $file) }} - fn must-pdf-exist {|file| - must-pdf $file - must-exist $file - } - fn must-pdf-not-exist {|file| - must-pdf $file - must-not-exist $file - } - fn must-valid {|v cond| -cc (not ($cond $v)) { fail (printf '%s: paramètre invalide' $v) }} - - fn out {|in suffix| - var out = (str:trim-suffix $in .pdf) - str:join '' [ $out $suffix ] - } - - fn help {|@args| cat $E:HOME/.config/elvish/aliases/pdf.help} - - fn decrypt {|@args| - var l = (count $args) - -cc (or (< $l 1) (> $l 3)) { fail 'decrypt doit contenir entre 1 et 3 paramètres' } - var in = $args[0] - var out = (out $in _decrypted.pdf) - var passwd = [] - must-pdf-exist $in - if (> $l 1) { - set @passwd = $args[1] - if (> $l 2) { - set out = $args[2] - } - } - must-pdf-not-exist $out - pdf:decrypt &out=$out $in $@passwd - } - - fn rotate {|@args| - var l = (- (count $args) 1) - -cc (< $l 1) { fail 'rotate doit contenir au moins 1 paramètres' } - var in = $args[0] - var out = (out $in _rotated.pdf) - if (pdf:is-pdf $args[$l]) { - set @args out = (all $args[1..]) - } - must-pdf-exist $in - must-pdf-not-exist $out - each {|e| - must-valid $e $pdf:is-rotate-selection~ - } $args - pdf:rotate &keep=$true &out=$out $in $@args - } - - fn merge {|@args| - var l = (- (count $args) 1) - -cc (< $l 1) { fail 'merge doit contenir au moins 2 paramètres' } - var @selection out = $@args - must-pdf-not-exist $out - var has-in = $false - each {|e| - if (pdf:is-pdf $e) { - must-exist $e - set has-in = $true - } else { - -cc (not $has-in) { fail 'Une sélection doit être précédée d’un fichier d’entrée' } - must-valid $e $pdf:is-selection~ - } - } $selection - pdf:cat &out=$out $@selection - } - - fn unmerge {|@args| - var l = (- (count $args) 1) - -cc (< $l 1) { fail 'unmerge doit contenir au moins 2 paramètres' } - var in = $args[0] - var out = (out $in _unmerged) - if (not (pdf:is-selection $args[$l])) { - set @args out = (all $args[1..]) - } - must-pdf-exist $in - must-not-exist $out - each {|e| - must-valid $e $pdf:is-selection~ - } $args - pdf:uncat $in $out $@args - } - - fn split {|@args| - var l = (- (count $args) 1) - -cc (< $l 1) { fail 'split doit contenir au moins 2 paramètres' } - var out = $args[$l] - set args = $args[..$l] - must-not-exist $out - var s = 1 - if (pdf:is-number $args[0]) { - set s @args = $@args - } - var t = (pdf:-t) - try { - pdf:cat &out=$t $@args - pdf:split &size=$s $t $out - } finally { - os:remove-all $t - } - } - - fn split-at {|@args| - var l = (count $args) - -cc (!= $l 3) { fail 'split-at doit contenir 3 paramètres' } - var rg in out = $@args - must-pdf-exist $in - must-not-exist $out - must-valid $rg {|e| re:match '^\d+(,\d+)*$' $e } - var b sel = 1 [] - str:split ',' $rg | order | each {|s| - var e = (- $s 1) - if (== $b $e) { - set @sel = $@sel $b - set b = $s - } elif (< $b $e) { - set @sel = $@sel (printf '%d-%d' $b $e) - set b = $s - } - } - set @sel = $@sel (printf '%d-z' $b) - unmerge $in $@sel $out - } - - fn zip {|@args| - var l = (- (count $args) 1) - -cc (< $l 1) { fail 'zip doit contenir au moins 2 paramètres' } - var @selection out = $@args - must-pdf-not-exist $out - var has-in = $false - each {|e| - if (pdf:is-pdf $e) { - must-exist $e - set has-in = $true - } else { - -cc (not $has-in) { fail 'Une sélection doit être précédée d’un fichier d’entrée' } - must-valid $e $pdf:is-selection~ - } - } $selection - pdf:cat &collate=$true &out=$out $@selection - } - - fn unzip {|@args| - var l = (- (count $args) 1) - -cc (< $l 1) { fail 'unzip doit contenir au moins 2 paramètres' } - var in @sel out = $@args - var mod = 2 - if (pdf:is-number $in) { - set mod = $in - -cc (eq (count $sel) 0) { fail 'unzip doit contenir au moins 3 paramètres' } - set in @sel = $@sel - } - must-not-exist $out - var t = (pdf:-t) - try { - pdf:cat &out=$t $in $@sel - var n = (pdf:nb-pages $t) - os:mkdir $out - range 1 (+ 1 $mod) | each {|m| - var sel = (range 1 (+ $n 1) | each {|i| - var s = (% $i $mod) - -cc (== $s 0) { set s = $mod } - -cc (== $s $m) $i - } | each $to-string~ | str:join ',') - pdf:cat &out=(printf '%s/%d.pdf' $out $m) $t $sel - } - } finally { - os:remove-all $t - } - } - - fn pts2cm {|v| / (math:round (* $v 3.52778)) 100} - fn -date {|raw| - var y m d = $raw[2..6] $raw[6..8] $raw[8..10] - var h n s = $raw[10..12] $raw[12..14] $raw[14..16] - var rest = [] - -cc (> (count $raw[16..]) 0) { set @rest = (str:split "'" $raw[16..]) } - var tz = '+00:00' - if (> (count $rest) 0) { - var tz = $rest[0] - -cc (eq $tz[0] 'Z') { set tz = $tz[1..] } - -cc (eq $tz '') { set tz = '00' } - -cc (and (not-eq $tz[0] '+') (not-eq $tz[0] '-')) { set tz = (printf '+%s' $tz) } - var mm = '00' - -cc (and (> (count $rest) 1) (pdf:is-number $rest[1])) { set mm = $rest[1] } - set tz = (printf '%s:%s' $tz $mm) - } - var date = (printf ^ - '%s-%s-%sT%s:%s:%sZ%s' ^ - $y $m $d ^ - $h $n $s ^ - $tz) - date --date $date - } - - fn info {|@args| - -cc (!= (count $args) 1) { fail 'info doit contenir un paramètre' } - var in @_ = $@args - must-pdf-exist $in - var json = (pdf:json $in) - var objects = $json[objects] - var trailer = $objects[trailer] - var infos = $objects[$trailer[/Info]] - var pages = $json[pages] - var p1 = $objects[$pages[0][object]] - var w h = (all $p1[/MediaBox][2..] | each $pts2cm~) - var layout = (-c (> $w $h) 'Paysage' 'Portrait') - var title = (map:value-of $infos '/Title') - var subject = (map:value-of $infos '/Subject') - var author = (map:value-of $infos '/Author') - var creator = (map:value-of $infos '/Creator') - var producer = (map:value-of $infos '/Producer') - var mdate = (-c (has-key $infos '/ModDate') { -date $infos[/ModDate] } '') - var crypted = (-c (pdf:encryption $in)[encrypted] 'Oui' 'Non') - var hasform = ( -c (pdf:form $in)[hasacroform] 'Oui' 'Non') - var data = [ - [&k='Chemin' &v=(path:abs $in)] - [&k='Taille' &v=(format:size (stat -c '%s' $in))] - [&k='Version PDF' &v=(pdf:version $in)] - [&k='Nombre de pages' &v=(count $pages)] - [&k='Format des pages' &v=(printf '%sx%s cm (%s)' $w $h $layout)] - [&k='Titre' &v=$title] - [&k='Subjet' &v=$subject] - [&k='Auteur' &v=$author] - [&k='Créateur' &v=$creator] - [&k='producteur' &v=$producer] - [&k='Date de création' &v=(-date $infos[/CreationDate])] - [&k='Date de modification' &v=$mdate] - [&k='Chiffré' &v=$crypted] - [&k='Acroform' &v=$hasform] - ] - var label = (format:repeat 21 ' ') - var @props = (format:column &align=right k $label) (format:column v $label) - set props = (format:update-props $props $data) - var sep = (format:repeat (+ $props[0][size] $props[1][size] 3) '.') - var @part = $data[..5] $data[5..12] $data[12..] - each {|d| - format:list &with-header=$false &csep=' : ' &recompute=$false $props $@d - echo $sep - } $part - } - - fn list-attachments {|in| all (pdf:attachments $in)} - fn display-attachments {|in| - var @data = (list-attachments $in) - printf "%d pièce(s)-jointe(s) trouvée(s):\n\n" (count $data) - each $echo~ $data - echo - } - fn extract-attachments {|in out| list-attachments $in | each {|f| pdf:attachment $in $out/$f $f }} - fn list-fonts {|in| - pdf:fonts $in | each {|f| - -cc (has-key $f /FontDescriptor) { put [&font=$f &fd=$f[/FontDescriptor]] } - } | each {|f| - -cc (has-key $f[fd] /FontName) { assoc $f name $f[fd][/FontName] } - } | each {|f| - var @_ n = (str:split '+' $f[name]) - var font = $f[font] - var fd = $f[fd] - var embed = (has-key $fd /FontFile2) - var file = (-c $embed $fd[/FontFile2] '') - set n = (str:trim-prefix $n '/') - put [ - &id=$font[id] - &name=$n - &embed=$embed - &file=$file - &type=(str:trim-prefix $font[/Subtype] '/') - &encoding=(str:trim-prefix $font[/Encoding] '/') - ] - } - } - fn display-fonts {|in| - var @data = (list-fonts $in) - printf "%d police(s) trouvée(s):\n\n" (count $data) - var props = [ - (format:column &align=center id ID) - (format:column name Nom) - (format:column type Type) - (format:column encoding Encodage) - (format:column &align=center embed Téléchargeable) - (format:column &align=center file Fichier) - ] - format:list $props $@data - echo - } - fn extract-fonts {|in out| - list-fonts $in | each {|f| - -cc $f[embed] { pdf:filtered-stream $in (printf '%s/%s.ttf' $out $f[name]) $f[file] } - } - } - fn list-images {|in| - pdf:images $in | each {|i| - var w = (format:int $i[/Width]) - var h = (format:int $i[/Height]) - var c = (-c (has-key $i /ColorSpace) { put $i[/ColorSpace][0] } '') - put [ - &id=$i[id] - &page=(format:int $i[page]) - &name=(str:trim-prefix $i[name] '/') - &width=$w - &height=$h - &dim=(printf '%dx%d' $w $h) - &filter=(str:trim-prefix $i[/Filter] '/') - &size=(format:size $i[/Length]) - &bpc=(format:int $i[/BitsPerComponent]) - &color=(str:trim-prefix $c '/') - ] - } - var objects = (pdf:objects $in) - all (pdf:pages $in) | each {|p| - var pn = (format:int $p[pageposfrom1]) - all $p[images] | each {|img| - var id = $img[object] - var o = (pdf:-object &extend=$true $objects $id) - var s = $o[/Length] - var c = (-c (has-key $o /ColorSpace) { put $o[/ColorSpace][0] } '') - var w = (format:int $o[/Width]) - var h = (format:int $o[/Height]) - put [ - &id=$id - &page=$pn - &name=(str:trim-prefix $img[name] '/') - &width=$w - &height=$h - &dim=(printf '%dx%d' $w $h) - &filter=(str:trim-prefix $o[/Filter] '/') - &size=(format:size $s) - &bpc=(format:int $o[/BitsPerComponent]) - &color=(str:trim-prefix $c '/') - ] - } - } - } - fn display-images {|in| - var @data = (list-images $in) - printf "%d image(s) trouvée(s):\n\n" (count $data) - var props = [ - (format:column &align=right page Page) - (format:column &align=center id ID) - (format:column name Nom) - (format:column &align=right size Taille) - (format:column &align=right dim Dimensions) - (format:column color Couleur) - (format:column &align=right bpc BPC) - (format:column &align=center filter Filtre) - ] - format:list $props $@data - echo - } - fn extract-images {|in out| - # En attendant de savoir décoder correctement les images, on utilise poppler - pdfimages -all $in $out/Im - } - - fn list {|@args| - -cc (!= (count $args) 2) { fail 'list doit comporter 2 paramètres' } - var types in = $@args - must-pdf-exist $in - var display = [ - &a=$display-attachments~ - &f=$display-fonts~ - &i=$display-images~ - ] - str:split ',' $types | each {|t| - set t = (str:to-lower $t) - must-valid $t {|e| and (> (count $e) 0) (has-key $display $e[0])} - $display[$t[0]] $in - } - } - - fn extract {|@args| - -cc (!= (count $args) 3) { fail 'extract doit comporter 3 paramètres' } - var types in out = $@args - must-pdf-exist $in - must-not-exist $out - var extr = [ - &a=$extract-attachments~ - &f=$extract-fonts~ - &i=$extract-images~ - ] - try { - os:mkdir $out - str:split ',' $types | each {|t| - set t = (str:to-lower $t) - must-valid $t {|e| and (> (count $e) 0) (has-key $extr $e[0])} - $extr[$t[0]] $in $out - } - } catch e { - os:remove-all $out - fail $e - } - } - - fn gray {|@args| - -cc (!= (count $args) 2) { fail 'gray doit comporter 2 paramètres' } - var in out = $@args - must-pdf-exist $in - must-pdf-not-exist $out - convert -colorspace gray $in $out - } - - fn mono {|@args| - var c = (count $args) - -cc (or (< $c 2) (> $c 3)) { fail 'mono doit comporter entre 2 et 3 paramètres' } - var t = $nil - if (pdf:is-number $args[0]) { - set t @args = $@args - -cc (or (< $t 0) (> $t 100)) { fail le taux doit être compris entre 0 et 100 } - -cc (< $c 2) { fail 'mono doit comporter 3 paramètres' } - } - var in out = $@args - must-pdf-exist $in - must-pdf-not-exist $out - if $t { - convert -colorspace gray -threshold $t'%' $in $out - } else { - convert -monochrome $in $out - } - } - - var actions = [ - &help=$help~ - &decrypt=$decrypt~ - &rotate=$rotate~ - &merge=$merge~ - &cat=$merge~ - &unmerge=$unmerge~ - &uncat=$unmerge~ - &split=$split~ - &split-at=$split-at~ - &cut=$split-at~ - &zip=$zip~ - &unzip=$unzip~ - &info=$info~ - &list=$list~ - &extract=$extract~ - &gray=$gray~ - &mono=$mono~ - #&compress=$compress~ - ] - -cc (not (has-key $actions $action)) { fail (printf '%s: action inconnue' $action) } - $actions[$action] $@args -} diff --git a/aliases/pdf.elv.save b/aliases/pdf.elv.save new file mode 100644 index 0000000..f379b3c --- /dev/null +++ b/aliases/pdf.elv.save @@ -0,0 +1,451 @@ +edit:add-var pdf~ {|action @args| + use flag + use math + use os + use path + use re + use str + use framagit.org/benjamin.vaudour/elv-lib/mods/list + use framagit.org/benjamin.vaudour/elv-lib/mods/map + use framagit.org/benjamin.vaudour/elv-lib/mods/pdf + + fn -parse {|rest specs| + var flags = [&] + var @spec = (each {|s| + var d = (map:value-of &default=$false $s 'default') + var sh = $s['short'] + var lg = $s['long'] + if (has-key $s 'default') { + assoc $s 'arg-required' $true + } else { + set d = $false + assoc $s 'arg-optional' $true + } + set flags[$sh] = $d + set flags[$lg] = $d + } $specs) + + var parsed argv = (flag:parse-getopt $rest $spec) + each {|p| + var v = $p['arg'] + var s = $p['spec'] + var sh = $s['short'] + var lg = $s['long'] + + if (map:value-of &default=$false $s 'arg-optional') { + set v = $true + } + set flags[$sh] = $v + set flags[$lg] = $v + } $parsed + + put $flags $argv + } + + fn -size {|s| + var b = (num 1024.0) + var u = ['' K M G] + var i = 0 + + while (and (< $i 3) (>= $s $b)) { + set s i = (/ $s $b) (+ $i 1) + } + + if (> $i 0) { + set s = (/ (math:round (* $s 10.0)) 10.0) + } + + str:join '' [ (echo $s) $u[$i] ] + } + + fn -f {|arg| + if (eq $arg $nil) { + put '' + } elif (pdf:is-string $arg) { + put $arg + } elif (==s (kind-of $arg) 'bool') { + if $arg { + put 'Oui' + } else { + put 'Non' + } + } else { + echo $arg + } + } + + fn -format {|title header data| + var size = [&] + each {|c| set size[$c] = (wcswidth $c) } $header + each {|line| + keys $line | each {|k| + var v = $line[$k] + var l = (wcswidth $v) + if (> $l $size[$k]) { + set size[$k] = $l + } + } + } $data + + echo (styled $title bold yellow) + if (== (count $data) 0) { + echo 'Aucune donnée…' + } else { + echo (styled (each {|c| pdf:align $c $size[$c] } $header | str:join ' ') bold underlined) + each {|line| + echo (each {|c| pdf:align $line[$c] $size[$c] } $header | str:join ' ') + } $data + } + echo + } + + fn help {|@args| e:cat $E:HOME/.config/elvish/aliases/pdf.help } + + fn compress {|@rest| + var flags rest = (-parse $rest [ + [&short=r &long=resolution &default=$nil] + [&short=t &long=type &default='screen'] + ]) + var input output = (list:value-of $rest 0) (list:value-of $rest 1) + var type resolution = $flags[t] &$flags[r] + + pdf:must ¬=$true $input {|arg| eq $arg $nil } 'Le fichier d’entrée est obligatoire' + pdf:must-pdf-exist $input + + if (eq $output $nil) { + set output = (pdf:output $input '_compressed.pdf') + } + pdf:must-pdf-not-exist $output + + pdf:must ['default' 'screen' 'ebook' 'printer' 'prepress'] {|arg| has-value $arg $type} (printf '%s: type invalide' $type) + + if (not-eq $resolution $nil) { + pdf:must $resolution {|arg| and (pdf:is-number $arg) (>= $arg 72) (<= $arg 300) } 'La résolution doit être comprise entre 72 et 300' + } + + pdf:compress &resolution=$resolution &type=$type $input $output + } + + fn decrypt {|input @rest| + var output password = (list:value-of &default=(pdf:output $input '_decrypted.pdf') $rest 1) (list:value-of $rest 0) + + pdf:must-pdf-exist $input + pdf:must-pdf-not-exist $output + + pdf:decrypt &output=$output &password=$password $input + } + + fn gray {|input @rest| + var output = (list:value-of &default=(pdf:output $input '_gray.pdf') $rest 0) + + pdf:must-pdf-exist $input + pdf:must-pdf-not-exist $output + + pdf:gray $input $output + } + + fn info {|input| + pdf:must-pdf-exist $input + + var json = (pdf:json $input) + var dict = (pdf:objects $json) + var infos = (pdf:object &fmt=$true &rec=$true $dict 'trailer' '/Info') + var page = (pdf:page $json 1) + var dim = (pdf.deep &dict=$dict $page 'object' '/MediaBox') + set dim = [ + &w= (pdf:pts2cm $dim[2]) + &h= (pdf:pts2cm $dim[3]) + ] + if (> $dim[w] $dim[h]) { + set dim[l] = 'Paysage' + } else { + set dim[l] = 'Portrait' + } + + var encrypted form = 'Non' 'Non' + if (pdf:encryption $json)['encrypted'] { + set encrypted = 'Oui' + } + if (pdf:form $json)['hasacroform'] { + set form = 'Oui' + } + + var title = (map:value-of &default='' $infos '/Title') + var subject = (map:value-of &default='' $infos '/Subject') + var author = (map:value-of &default='' $infos '/Author') + var creator = (map:value-of &default='' $infos '/Creator') + var producer = (map:value-of &default='' $infos '/Producer') + var cdate = (map:value-of &default='' $infos '/CreationDate') + var mdate = (map:value-of &default='' $infos '/ModDate') + + var result = [ + &'Chemin'= (path:abs $input) + &'Version'= (pdf:Version $json) + &'Nombre de pages'= (pdf:nb-pages $input) + &'Format des pages'= (printf '%s×%s cm (%s)' $dim[w] $dim[h] $dim[l]) + &'Titre'= $title + &'Sujet'= $subject + &'Auteur'= $author + &'Créateur'= $creator + &'Producteur'= $producer + &'Date de création'= $cdate + &'Date de modification'= $mdate + &'Chiffré'= $encrypted + &'Acroform'= $form + ] + + var l = 1 + keys $result | each {|k| + var w = (+ (wcswidth $k) 1) + if (> $w $l) { + set l = $w + } + } + + keys $result each {|k| + var v = $result[$k] + echo (styled (pdf:align $k':' $l)) $v + } + } + + fn mono {|@rest| + var flags rest = (-parse $rest [ + [&short=d &long=density &default=600] + ]) + var input output = (list:value-of $rest 0) (list:value-of $rest 1) + var density = $flags[d] + + pdf:must ¬=$true $input {|arg| eq $arg $nil } 'Le fichier d’entrée est obligatoire' + pdf:must-pdf-exist $input + + if (eq $output $nil) { + set output = (pdf:output $input '_mono.pdf') + } + pdf:must-pdf-not-exist $output + + pdf:must $density {|d| and (pdf:is-number $d) (>= $d 72) (<= $d 1200) } 'La densité doit être comprise entre 72 et 1200' + + pdf:mono &density=$density $input $output + } + + fn merge {|@selection output| + pdf:must (count $selection) {|c| > $c 0 } 'La commande doit contenir au moins deux paramètres' + pdf:must-pdf-not-exist $output + + pdf:merge &output=$output $@selection + } + + fn unmerge {|input @selection output| + pdf:must {count $selection} {|c| > $c 0} 'La commande doit contenir au moins trois paramètres' + pdf:must-pdf-exist $input + pdf:must-not-exist $output + + pdf:unmerge $input $@selection $output + } + + fn split {|@rest input output| + var flags _ = (-parse $rest [ + [&short=s &long=size &default=1] + ]) + var size = $flags[s] + + pdf:must-valid $size {|arg |and (pdf:is-number $arg) (> $arg 0) } + pdf:must-pdf-exist $input + pdf:must-not-exist $output + + pdf:split &size=$size $input $output + } + + fn split-at {|rg input output| + pdf:must-valid $rg {|arg| re:match '^\d+(,\d+)*$' } + var @pages = (str:split ',' $rg | order | compact) + var last = 1 + var selection = [] + each {|p| + if (== $p $last) { + set @selection = $@selection $p + } elif (> $p $last) { + set @selection = $@selection (printf '%d-%d' $last $p) + } + set last = (+ $p 1) + } $pages + + set @selection = $@selection (printf '%d-z' $last) + + unmerge $input $@selection $output + } + + fn zip {|@rest output| + var flags selection = (-parse $rest [ + [&short=c &long=collate &default=0] + ]) + var collate = $flags[c] + + pdf:must-pdf-not-exist $output + pdf:must-valid $collate $pdf:is-number~ + + pdf:merge &collate &output=$output $@selection + } + + fn unzip {|@rest output| + var flags selection = (-parse rest [ + [&short=m &long=modulo &default=2] + ]) + var modulo = $flags[m] + + pdf:must-valid $modulo {|arg| and (pdf:is-number $arg) (> $arg 2) } + pdf:must-not-exist $output + + var t = (pdf:tmp-pdf) + + try { + pdf:merge &output=$t $@selection + + var n = (pdf:nb-pages $t) + var @sel = (range $modulo | each {|_| put [] }) + + range $n {|i| + var s = (% $i $modulo) + set sel[$s] = (conj $sel[$s] (+ $i 1) ) + } + set @sel = (each {|s| str:join ',' $s } $sel) + + unmerge $t $@sel $output + } catch err { + } + + os:remove-all $t + } + + fn list {|@rest input| + pdf:must-pdf-exist $input + + var flags _ = (-parse $rest [ + [&short=a &long=attachments] + [&short=f &long=fonts] + [&short=i &long=images] + ]) + + var json = (pdf:json $input) + + if $flags[a] { + var data = (pdf:attachments &fmt=$true &rec=$true $json) + var @attachments = (keys $data | each {|id| + var a = $data[$id] + var name = (pdf:deep $a 'filespec' '/F') + var size = (pdf:deep $a 'filespec' '/EF' '/F' 'dict' '/Params' '/Size') + var mime = (pdf:deep $a 'streams' '/F' 'mimetype') + var desc = (pdf:deep $a 'description') + put [ + &'ID'= $id + &'Nom'= $name + &'Taille'= (-size $size) + &'Mimetype'= (-f $mime) + &'Description'= (-f $desc) + ] + }) + + -format 'PIÈCES-JOINTES:' ['ID' 'Nom' 'Taille' 'Mimetype' 'Description'] $attachments + } + + if $flags[f] { + var data = (pdf:fonts &fmt=$true &rec=$true $json) + var @fonts = (each {|f| + if (has-key $f '/FontDescriptor') { + put $f + } + } $data | each {|f| + var fd = (pdf:deep $f '/FontDescriptor') + var id = (pdf:deep $fd '/FontFile2' 'object_id') + var file = (pdf:deep $fd '/FontFile2' 'dict') + var name = (pdf:deep $fd '/FontName') + + if (not-eq $name $nil) { + set name = (re:replace '^.*\+' '' $name) + } + var basename type encoding = (put '/BaseFont' '/Subtype' '/Encoding' | each {|k| + var v = (pdf:deep $f $k) + if (==s (kind-of $v) 'string') { + str:trim-left $v '/' + } else { + put $v + } + }) + + put [ + &'ID'= $id + &'Nom'= (-f $name) + &'Nom de base'= (-f $basename) + &'Embarqué'= (-f (not-eq $file $nil)) + &'Type'= (-f $type) + &'Encodage'= (-f $encoding) + ] + }) + + -format 'POLICES:' ['ID' 'Nom' 'Nom de base' 'Embarqué' 'Type' 'Encodage'] $fonts + } + + if $flags[i] { + var data = (pdf:images &fmt=$true &rec=$true $json) + var @images = (each {|i| + var dict = (pdf:deep $i 'object' 'dict') + var id = (pdf:deep $i 'object' 'object_id') + var page = (pdf:deep $i 'page') + var w = (pdf:deep $dict '/Width') + var h = (pdf:deep $dict '/Height') + var size = (pdf:deep $dict '/Length') + var bpc = (pdf:deep $dict '/BitsPerComponent') + var name = (pdf:deep $i 'name') + + if (not-eq $name $nil) { + set name = (str:trim-left $name '/') + } + + var filter color = (put '/Filter' '/ColorSpace' | each {|k| + var v = (pdf:deep $dict $k) + if (==s (kind-of $v) 'string') { + str:trim-left $v '/' + } else { + put $v + } + }) + + put [ + &'ID'= $id + &'Page'= (-f $page) + &'Nom'= (-f $name) + &'Dimensions'= (printf '%d×%d px' $w $h) + &'Filtre'= (-f $filter) + &'Couleur'= (-f $color) + &'BPC'= (-f $bpc) + &'Taille'= (-size $size) + ] + } $data) + + -format 'IMAGES:' ['ID' 'Page' 'Nom' 'Dimensions' 'Filtre' 'Couleur' 'BPC' 'Taille'] $images + } + } + + var actions = [ + &help=$help~ + &cat=$merge~ + &compress=$compress~ + &cut=$split-at~ + &decrypt=$decrypt~ + #&extract=$extract~ + &gray=$gray~ + &info=$info~ + &list=$list~ + &merge=$merge~ + &mono=$mono~ + &split=$split~ + &split-at=$split-at~ + &uncat=$unmerge~ + &unmerge=$unmerge~ + &unzip=$unzip~ + &zip=$zip~ + ] + + pdf:must $actions {|arg| has-key $arg $action } (printf '%s: action inconnue' $action) + $actions[$action] $@args +} diff --git a/aliases/pdf.help b/aliases/pdf.help index e9524e6..f9ae30a 100644 --- a/aliases/pdf.help +++ b/aliases/pdf.help @@ -1,45 +1,64 @@ -Usage: epdf (commande) [options] +Usage: pdf (commande) [options] Commandes: + help: + Affiche cette aide + cat: + alias de merge + compress: [] [] + Compresse la taille du fichier + Options disponibles : + -t, --type Type de compression. Valeurs autorisées : default, screen, ebook, print, prepress [défaut: screen] + -r, --resolution Résolution. Contrainte : 72 <= <= 300. + Si la résolution n’est pas précisée, sa valeur dépend du type : + - 72 si default ou screen, + - 150 si ebook, + - 300 si print ou prepress. + Fichier de sortie par défaut : _compressed.pdf + cut: + alias de split-at + decrypt: [ []] + Retourne un fichier déchiffré. Si aucun mot de passe n’est donné, tente le déchiffrement avec un mot de passe à blanc. + Fichier de sortie par défaut : _decrypted.pdf + extract: + @TODO + gray: [] + Convertit le fichier d’entrée en nuances de gris + Fichier de sortie par défaut : _gray.pdf + info: + Affiche les propriétés du document + list: + Affiche la liste des fichiers inclus en filtrant selon le type (pièce-jointe (-a), image (-i) ou police (-f)). + Options disponibles : + -a, --attachments + -i, --images + -f, --fonts merge: [] ... - Fusionne la liste des pages sélectionnées dans le fichier de sortie - cat: alias de merge - unmerge: ... [] - Crée un nouveau pdf pour chaque pagerange défini - Défauts : = _unmerged - uncat: alias de unmerge - split: [] [pagerange] .... - Découpe les fichiers d’entrée en fichiers de pages - et place les découpes dans les fichiers /{1,2,…}.pdf - Défauts : = 1 - split-at: [pagerange] ... - Découpe les fichiers d’entrée aux pages indiquées (séparées par des virgules) - cut: alias de split-at - zip: [] ... - Réunit alternativement chaque page de chaque fichier d’entrée - dans le fichier de sortie - unzip: [] [] ... + Fusionne la liste des pages sélectionnées dans le fichier de sortie. + mono: [] [] + Convertit le fichier d’entrée en noir et blanc + Options disponibles : + -d, --density Densité. Contrainte : 72 <= <= 1200. [défaut: 600] + Fichier de sortie par défaut : _mono.pdf + split: [] + Découpe les fichiers d’entrée en plusieurs fichiers. Le nombre de pages des fichiers dépend de la taille des fichiers. + Options disponibles : + -s, --size Taille max des fichiers. Contrainte : > 0. [défaut: 1] + split-at: + Découpe les fichiers d’entrée aux pages indiquées (séparées par des virgules). + uncat: + alias de unmerge + unmerge: ... + Crée un nouveau pdf pour chaque pagerange défini. + unzip: [] [] ... Sépare alternativement chaque page dans les fichiers /{1,2,…}.pdf Le nombre de fichiers créé est indiqué par le modulo. - Défauts : = 2 - rotate: ... [] - Copie le fichier en tournant les pages demandées - Fichier de sortie par défaut : _rotated.pdf - decrypt: [] [] - Retourne un fichier déchiffré. Si aucun mot de passe n’est donné, tente le déchiffrement - avec un mot de passe à blanc - Fichier de sortie par défaut : _decrypted.pdf - gray: - Convertit le fichier d’entrée en nuances de gris - mono: [] - Convertit le fichier d’entrée en noir et blanc, au taux de coupure (exprimé en pourcentage, entre 0 et 100) - Défauts : = 50 - list: (a(ttachments)|i(mages)|f(onts)) - Affiche la liste des fichiers inclus en filtrant selon le type (pièce-jointe, image ou police) - extract: (a(ttachments)|i(mages)|f(onts)) - Extrait les types de documents demandés dans le dossier - info: [ ...] - Affiche les propriétés du document + Options disponibles : + -m, --modulo Contrainte : > 1. [défaut: 2] + zip: [] [] ... + Réunit alternativement chaque page de chaque sélection dans le fichier de sortie. + Options disponibles : + -c, --collate Nb de pages successives à prendre pour chaque sélection. Contrainte : > 0. [défaut: 1] Sélection des pages: Les sélections peuvent comprendre les éléments suivants. Plusieurs sélection sont séparées par des virgules @@ -47,10 +66,10 @@ Sélection des pages: n-m de la page n à m range (ie. 3-6) m-n pareil mais en sens inverse (ie. 6-3) z représente la dernière page du document (pour remplacer un n° de page) + x Exclut la page (ex: x15) ou la rangée de pages (ex: x2-18) r compte à partir de la dernière page (ie. 3-r2) ...:even pour une sélection donnée, ne conserve que que les pages paires (ie. 1-10:even) ...:odd pareil mais pour les pages impaires - +90: tourne le groupe de sélection vers la droite (ie. +90:1-5,8,z-12 tourne les pages 1 à 5, - 8 et de la dernière page à la 12è) + +90: tourne le groupe de sélection vers la droite (ie. +90:1-5,8,z-12 tourne les pages 1 à 5, 8 et de la dernière page à la 12è) -90: pareil mais à gauche +180: pareil mais en bas diff --git a/aliases/vi.elv b/aliases/vi.elv index ec264e1..7764bfe 100644 --- a/aliases/vi.elv +++ b/aliases/vi.elv @@ -1,4 +1,4 @@ -var app = 'nvim' +var app = 'helix' var editors = [ &emac=[ diff --git a/aliases/vpn.elv b/aliases/vpn.elv index d1d3887..2b93d8b 100644 --- a/aliases/vpn.elv +++ b/aliases/vpn.elv @@ -1,133 +1,148 @@ -use re -use str -use framagit.org/benjamin.vaudour/elv-lib/mods/list - -var vpnType = [ - &wireguard=$nil - &vpn=$nil -] - -var shortcut = [ - &ca=ca.kaosx.ovh - &fr=fr.kaosx.ovh - &lu=luence-wg - &lu2=luence-ovpn - &cli=luence-client - &nl=proton_nl5 - &jp=proton_jp2 - &us=proton_us3 -] - -var next = [ - &ca.kaosx.ovh=fr.kaosx.ovh - &fr.kaosx.ovh=luence-wg - &luence-wg=luence-client - &luence-ovpn=luence-client -# &luence-client=proton_nl5 -# &proton_nl5=proton_us3 -# &proton_us3=proton_jp2 -] - -fn -list {|&active=$false| - var @argv = connection show - if $active { - set @argv = $@argv --active - } - nmcli $@argv | re:awk {|_ @name uuid tpe dev| - if (has-key $vpnType $tpe) { - str:join ' ' $name - } - } -} - -fn -up {|name| - nmcli connection up $name -} - -fn -down {|name| - nmcli connection down $name -} - -fn -active {|| - -list &active=$true -} - -fn -is-active {|name| - -active | list:contains $name -} - -fn -next {|| - var @n = (-active | list:first {|e| has-key $next $e }) - if (== 1 (count $n)) { - put $next[$n[0]] - } else { - put ca.kaosx.ovh - } -} - -fn -vpn-stop {|| - var @a = (-active) - if (== (count $a) 0) { - echo 'Aucune connexion active' - } else { - -active | each $-down~ - } -} - -fn -vpn-start {|name| - if (has-key $shortcut $name) { - set name = $shortcut[$name] - } - if (not (-list | list:contains $name)) { - printf "Le VPN “%s” n’èxiste pas\n" $name - } else { - -active | each $-down~ - -up $name - } -} - -fn -vpn-list {|| - var @act = (-active) - -list | each {|n| - if (list:contains $n $act) { - echo (styled $n green) - } else { - echo $n - } - } -} - -fn -vpn-help {|| - echo 'vpn: Active ou désactive les connections VPN' - echo 'Usage:' - echo ' help Affiche cette aide' - echo ' list Liste les VPN disponibles' - echo ' stop Arrête toutes les connexions VPN actives' - echo ' Active la connexion VPN donnée et désactive les autres' - echo ' (sans argument) Active la prochaine connexion VPN et désactive les autres' -} - -fn -vpn {|| - -vpn-start (-next) -} - edit:add-var vpn~ {|@argv| - var c = (count $argv) - if (== $c 0) { - -vpn - } elif (!= $c 1) { - -vpn-help - fail 'Arguments invalides' - } else { - var e = $argv[0] - if (eq $e help) { - -vpn-help - } elif (eq $e list) { - -vpn-list - } elif (eq $e stop) { - -vpn-stop - } else { - -vpn-start $e + use flag + use re + use str + use framagit.org/benjamin.vaudour/elv-lib/mods/map + + var shortcuts = [ + &ca= ca.kaosx.ovh + &fr= fr.kaosx.ovh + &lu= luence-wg + &cli= luence-client + &fdn= fdn-openvpn + ] + + var next = [ + &ca.kaosx.ovh= fr.kaosx.ovh + &fr.kaosx.ovh= luence-wg + &luence-wg= luence-client + &luence-client= fdn-openvpn + ] + + fn -start {|name| e:nmcli connection up $name > /dev/null } + fn -stop {|name| e:nmcli connection down $name > /dev/null } + fn -list {|&active=$false| + var @args = connection show + if $active { + set @args = $@args --active + } + e:nmcli $@args | re:awk {|_ @name uuid tpe dev| + var name = (str:join ' ' $name) + if (has-value $shortcuts $name) { + put [ + &name= $name + &type= $tpe + &active= (not-eq $dev --) + ] + } } } + + fn -name {|name| map:value-of &default=$name $shortcuts $name } + fn -exists {|name| has-value [ (-list | each {|c| put $c[name] }) ] (-name $name) } + fn -is-active {|name| has-value [ (-list &active=$true | each {|c| put $c[name] }) ] (-name $name) } + + fn -next {|| + var @active = (-list &active=$true) + var n = ca.kaosx.ovh + if (> (count $active) 0) { + set n = (map:value-of &default=$n $next $active[0][name]) + } + + put $n + } + + fn help {|@rest| + echo 'Usage: vpn [] [...]' + echo 'Actions disponibles:' + echo ' - list [(-a|--active)]' + echo ' - start ' + echo ' - stop []' + } + + fn list {|@rest| + var flags _ = (flag:parse-getopt $rest [ + [&short=a &long=active &arg-optional=$true] + ]) + var active = (> (count $flags) 0) + + var @connections = (-list &active=$active) + if (== (count $connections) 0) { + echo (styled 'Aucun VPN' yellow) + } else { + each {|c| + if $c[active] { + printf "%s (%s)\n" (styled $c[name] green bold) $c[type] + } else { + printf "%s (%s)\n" $c[name] $c[type] + } + } $connections + } + } + + fn stop {|@rest| + if (== (count $rest) 0) { + var @actives = (-list &active=$true | each {|c| put $c[name] }) + if (== (count $actives) 0) { + echo (styled 'Aucun VPN actif' yellow) + } else { + stop $@actives + } + } else { + each {|n| + var n = (-name $n) + if (not (-is-active $n)) { + echo (styled (printf '%s non actif' $n) yellow) + } else { + if ?(-stop $n) { + printf "%s %s\n" (styled $n bold) (styled désactivé bold red) + } else { + echo (styled (printf 'Arrêt de %s échoué' $n) red) + } + } + } $rest + } + } + + fn start {|name| + var name = (-name $name) + if (-is-active $name) { + echo (styled (printf '%s est déjà actif' $name) yellow) + } elif (not (-exists $name)) { + echo (styled (printf '%s inconnu' $name) yellow) + } else { + var @actives = (-list &active=$true | each {|c| put $c[name] }) + if (> (count $actives) 0) { + stop $@actives + } + if ?(-start $name) { + printf "%s %s\n" (styled $name bold) (styled activé bold green) + } else { + echo (styled (printf 'Démarrage de %s échoué' $name) red) + } + } + } + + fn next {|@name| + if (== (count $name) 0) { + start (-next) + } else { + start $name[0] + } + } + + var actions = [ + &help= $help~ + &list= $list~ + &start= $start~ + &stop= $stop~ + ] + + var action = $next~ + + if (and (> (count $argv) 0) (has-key $actions $argv[0])) { + set action argv = $actions[$argv[0]] $argv[1..] + } + + $action $@argv } diff --git a/rc.elv b/rc.elv index c3ecb67..515739f 100644 --- a/rc.elv +++ b/rc.elv @@ -2,18 +2,19 @@ set-env BAT_PAGER 'less -RF' set-env EXA_COLORS 'da=36:*.pdf=4:*.doc=4:*.xls=4:*.docx=4:*.xlsx=4:*.odt=4:*.ods=4' #set-env EDITOR vim -set-env EDITOR nvim +#set-env EDITOR nvim #set-env EDITOR kak -#set-env EDITOR hx +set-env EDITOR hx #set-env VISUAL 'vim -R' -set-env VISUAL 'nvim -R' +#set-env VISUAL 'nvim -R' #set-env VISUAL 'kak -ro' -#set-env VISUAL hx +set-env VISUAL hx set-env CURRENT_SHELL 'elvish' set-env STARSHIP_CONFIG ~/.config/starship/starship.toml set-env PERL5LIB /home/benjamin/perl5/lib/perl5 set-env NODE_OPTIONS --openssl-legacy-provider set-env QSV_SNIFF_DELIMITER 1 +set-env PHP_CS_FIXER_IGNORE_ENV 1 set @paths = /home/benjamin/{bin,Go/bin,perl5/bin} $@paths {