Désactivation de la commande pdf, ajout de commandes pour récupérer les PKGBUILD Arch/AUR, commande de cnéation de fichiers php, gestion de l’historique d’Elvish, nouveaux aliases (gzip, bzip2) + remplacement de dog par doggo & exa par eza, helix utilisé désormais par défaut, rréécriture de vpn

This commit is contained in:
Benjamin VAUDOUR 2025-04-27 13:40:01 +02:00
parent b3d74ce2d7
commit 7ae2fc2712
12 changed files with 1041 additions and 642 deletions

View file

@ -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 }

25
aliases/arch.elv Normal file
View file

@ -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
}

11
aliases/aur.elv Normal file
View file

@ -0,0 +1,11 @@
edit:add-var aur-get~ {|package @files|
if (eq (count $files) 0) {
echo "usage: aur-get <package> 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
}

69
aliases/create-php.elv Normal file
View file

@ -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] <path>'
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 = [
'<?php'
''
(printf 'namespace App\%s;' $namespace)
''
(printf '%s %s' $type $className)
'{'
'}'
]
echo (str:join "\n" $content) > $fullPath
}

264
aliases/history.elv Normal file
View file

@ -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
}

View file

@ -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 }

View file

@ -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 nest pas un fichier pdf' $file) }}
fn must-exist {|file| -cc (pdf:not-exist $file) { fail (printf '%s nexiste 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 dun fichier dentré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 dun fichier dentré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
}

451
aliases/pdf.elv.save Normal file
View file

@ -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 &not=$true $input {|arg| eq $arg $nil } 'Le fichier dentré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 &not=$true $input {|arg| eq $arg $nil } 'Le fichier dentré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
}

View file

@ -1,45 +1,64 @@
Usage: epdf (commande) [options]
Usage: pdf (commande) [options]
Commandes:
help:
Affiche cette aide
cat:
alias de merge
compress: [<options>] <inputfile> [<outputfile>]
Compresse la taille du fichier
Options disponibles :
-t, --type <str> Type de compression. Valeurs autorisées : default, screen, ebook, print, prepress [défaut: screen]
-r, --resolution <int> Résolution. Contrainte: 72 <= <int> <= 300.
Si la résolution nest 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 : <inputfile>_compressed.pdf
cut:
alias de split-at
decrypt: <inputfile> [<password> [<outputfile>]]
Retourne un fichier déchiffré. Si aucun mot de passe nest donné, tente le déchiffrement avec un mot de passe à blanc.
Fichier de sortie par défaut : <inputfile>_decrypted.pdf
extract:
@TODO
gray: <inputfile> [<outputfile>]
Convertit le fichier dentrée en nuances de gris
Fichier de sortie par défaut : <inputfile>_gray.pdf
info: <inputfile>
Affiche les propriétés du document
list: <options> <inputfile>
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: <inputfile> [<pagerange>] ... <outputfile>
Fusionne la liste des pages sélectionnées dans le fichier de sortie
cat: alias de merge
unmerge: <inputfile> <pagerange>... [<outputdir>]
Crée un nouveau pdf pour chaque pagerange défini
Défauts : <outputdir> = <inputfile>_unmerged
uncat: alias de unmerge
split: [<size>] <inputfile> [pagerange] .... <outputdir>
Découpe les fichiers dentrée en fichiers de <size> pages
et place les découpes dans les fichiers <outputdir>/{1,2,…}.pdf
Défauts : <size> = 1
split-at: <pageselect> <inputfile> [pagerange] ... <outputdir>
Découpe les fichiers dentrée aux pages indiquées (séparées par des virgules)
cut: alias de split-at
zip: <inputfile> [<pagerange>] ... <outputfile>
Réunit alternativement chaque page de chaque fichier dentrée
dans le fichier de sortie
unzip: [<modulo>] <inputfile> [<pagerange>] ... <outputdir>
Fusionne la liste des pages sélectionnées dans le fichier de sortie.
mono: [<options>] <inputfile> [<outputfile>]
Convertit le fichier dentrée en noir et blanc
Options disponibles :
-d, --density <int> Densité. Contrainte : 72 <= <int> <= 1200. [défaut: 600]
Fichier de sortie par défaut : <inputfile>_mono.pdf
split: [<options>] <inputfile> <outputdir>
Découpe les fichiers dentrée en plusieurs fichiers. Le nombre de pages des fichiers dépend de la taille des fichiers.
Options disponibles :
-s, --size <int> Taille max des fichiers. Contrainte : <int> > 0. [défaut: 1]
split-at: <pageselect> <inputfile> <outputdir>
Découpe les fichiers dentrée aux pages indiquées (séparées par des virgules).
uncat:
alias de unmerge
unmerge: <inputfile> <pagerange>... <outputdir>
Crée un nouveau pdf pour chaque pagerange défini.
unzip: [<options>] <inputfile> [<pagerange>] ... <outputdir>
Sépare alternativement chaque page dans les fichiers <outputdir>/{1,2,…}.pdf
Le nombre de fichiers créé est indiqué par le modulo.
Défauts : <modulo> = 2
rotate: <inputfile> <pagerange> ... [<outputfile>]
Copie le fichier en tournant les pages demandées
Fichier de sortie par défaut : <inputfile>_rotated.pdf
decrypt: <inputfile> [<password>] [<outputfile>]
Retourne un fichier déchiffré. Si aucun mot de passe nest donné, tente le déchiffrement
avec un mot de passe à blanc
Fichier de sortie par défaut : <inputfile>_decrypted.pdf
gray: <inputfile> <outputfile>
Convertit le fichier dentrée en nuances de gris
mono: [<split>] <inputfile> <outputfile>
Convertit le fichier dentrée en noir et blanc, au taux de coupure (exprimé en pourcentage, entre 0 et 100)
Défauts : <split> = 50
list: (a(ttachments)|i(mages)|f(onts)) <inputfile>
Affiche la liste des fichiers inclus en filtrant selon le type (pièce-jointe, image ou police)
extract: (a(ttachments)|i(mages)|f(onts)) <inputfile> <outputdir>
Extrait les types de documents demandés dans le dossier <outputdir>
info: <inputfile> [<field> ...]
Affiche les propriétés du document
Options disponibles :
-m, --modulo <int> Contrainte : <int> > 1. [défaut: 2]
zip: [<options>] <inputfile> [<pagerange>] ... <outputfile>
Réunit alternativement chaque page de chaque sélection dans le fichier de sortie.
Options disponibles :
-c, --collate <int> Nb de pages successives à prendre pour chaque sélection. Contrainte : <int> > 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

View file

@ -1,4 +1,4 @@
var app = 'nvim'
var app = 'helix'
var editors = [
&emac=[

View file

@ -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 ' <vpn> 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 [<action>] [<args>...]'
echo 'Actions disponibles:'
echo ' - list [(-a|--active)]'
echo ' - start <name>'
echo ' - stop [<name>]'
}
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
}

9
rc.elv
View file

@ -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
{