🎲 — mikrobloggeriet olorm — olorm-27 · olorm-28 · olorm-29
Jeg har laget et lite skript som jeg bruker ofte.
Det er et skript som åpner en tilfeldig fil i en teksteditor.
Du kan eksplisitt velge teksteditor med
--editor
/-e
, ellers velger skriptet hva enn du
har i $EDITOR
.
Om du bruker vi
, vim
, nvim
,
lvim
får du også åpnet fila på en tilfeldig linje.
Om du bruker hx
, code
, codium
får du også åpnet fila på en tilfeldig kolonne på en tilfeldig
linje.
function openr
argparse e/editor= -- $argv
or return
if set -ql _flag_editor
set editor $_flag_editor
else
set editor $EDITOR
end
set file (git ls-files | shuf -n1)
set line_text (cat -n $file | shuf -n1)
set line (string sub -l6 $line_text | string trim)
set position (shuf -n1 -i1-(string sub -s6 $line_text | gwc -c))
switch $editor
case hx
$editor $file:$line:$position
case vi vim nvim lvim
$editor $file +$line
case code codium
$editor --goto $file:$line:$position
case '*'
$editor $file
end
end
Man kjører programmet slik:
$ openr
eventuelt feks slik:
$ openr -e emacs
eller
$ openr --editor /Applications/Xcode.app/Contents/MacOS/Xcode
fish
fish
, som dette er skrevet i, er en modernere
sh
/bash
/zsh
. Det er mye bedre å
skrive i, og er ikke POSIX-kompatibelt. Det vil si at du ikke kan
klistre inn vilkårlige shellscripts fra internett og forvente at
fish
kan kjøre det. Men det er uansett ikke så lurt.
argparse
argparse e/editor= -- $argv
or return
Her bruker vi fish'
finfine argparse
-kommando
til å definere og parse kommandoargumenter. Vi sier at vi har
étt argument, editor
(kortform: e
) som har et
parameter (=
), og vi skal lese dette inn fra
$argv
(som er en liste over alle ordene man skriver etter
openr
).
Denne editor
-verdien blir så stappet i de implisitte
variablene $_flag_editor
og $_flag_e
.
if set -ql _flag_editor
set editor $_flag_editor
else
set editor $EDITOR
end
Her sjekker vi om $_flag_editor
er oppgitt, og setter
isåfall $editor
til den verdien.
Om $_flag_editor
ikke er satt setter vi
$editor
til å være hva enn $EDITOR
er.
set file (git ls-files | shuf -n1)
Her lister vi ut alle filene git vet om i mappen (og undermapper) man
står i med git ls-files
. SÃ¥ pipes dette inn i
shuf -n1
som gir oss én tilfeldig linje av det som blir
pipet inn, altså et tilfeldig filnavn. Vi setter dette i variablen
$file
.
set line_text (cat -n $file | shuf -n1)
Her lister vi ut innholdet i fila vi fant i forrige steg. Med
-n
får vi også med linjenumre (som vi bruker i et senere
steg.) SÃ¥ pipes dette inn i en shuf -n1
som over. SÃ¥ vi
står igjen med $line_text
som inneholder en tilfeldig linje
fra fila i $fila
, med linjenummer foran.
set line (string sub -l6 $line_text | string trim)
Her skraper vi ut de seks første tegnene i $line_text
som vi definerte over, og luker vekk whitespace med
string trim
. Vi sitter igjen med linjenummeret fra den
tilfeldige linja i variablen $line
.
set position (shuf -n1 -i1-(string sub -s6 $line_text | gwc -c))
Denne bråkete linja fjerner linjenummeret fra $line_text
og teller antall tegn med gwc -c
. Vi bruker
gwc
over wc
fordi wc
på MacOS
putter inn whitespace før tallet vårt. Så tar vi og generer en
liste av tall fra 1
til det antallet tegn vi nettopp fant.
SÃ¥ velger vi oss ut et tilfeldig av disse tallene. Og setter det i
$position
.
Som du kanskje ser er narrativet i koden og prosaen nokså forskjellig her. Beklager om det er vanskelig å følge, men vi sitter i hvert fall igjen med et tilfeldig kolonnenummer.
switch
switch $editor
case hx
$editor $file:$line:$position
case vi vim nvim lvim
$editor $file +$line
case code codium
$editor --goto $file:$line:$position
case '*'
$editor $file
end
Her velger vi hvordan vi vil starte editoren basert på innholdet i
$editor
.
hx
starter vi $editor
(hx
) med en syntaks som spesfiserer linje og kolonnevi
-variant, får vi bare linjeVSCode
får vi både linje og
kolonneJeg synes det er nyttig å av og til åpne en tilfeldig fil i et prosjekt og lese den og reflektere litt over hva den gjør/er og hvorfor den eksisterer. Er det en gammel bit med kode? Hvordan passer den inn med den nye koden vi skriver? Ser jeg noen åpenbare forbedringer jeg kan gjøre her og nå? Kanskje denne koden kan hjelpe meg å se resten av koden på en litt annen måte?