1
0
mirror of https://github.com/kmein/niveum synced 2026-03-16 18:21:07 +01:00

chore: format with alejandra

This commit is contained in:
2022-03-10 21:52:12 +01:00
parent 13727abfd6
commit d37e90cb97
159 changed files with 4239 additions and 3405 deletions

View File

@@ -1,31 +1,35 @@
{ stdenv, fetchFromGitHub, lib, pandoc }:
let
{
stdenv,
fetchFromGitHub,
lib,
pandoc,
}: let
owner = "kamalist";
in
stdenv.mkDerivation rec {
pname = "auc";
version = "2019-04-02";
stdenv.mkDerivation rec {
pname = "auc";
version = "2019-04-02";
src = fetchFromGitHub {
inherit owner;
repo = "AUC";
rev = "66d1cd57472442b4bf3c1ed12ca5cadd57d076b3";
sha256 = "0gb4asmlfr19h42f3c5wg9c9i3014if3ymrqan6w9klgzgfyh2la";
};
src = fetchFromGitHub {
inherit owner;
repo = "AUC";
rev = "66d1cd57472442b4bf3c1ed12ca5cadd57d076b3";
sha256 = "0gb4asmlfr19h42f3c5wg9c9i3014if3ymrqan6w9klgzgfyh2la";
};
installPhase = ''
mkdir -p $out/{bin,man/man1}
install auc $out/bin
${pandoc}/bin/pandoc -V title=${lib.escapeShellArg pname} -V section=1 $src/README.md -s -t man -o $out/man/man1/auc.1
'';
meta = with lib; {
description = "Command-line Roman calendar";
longDescription = ''
AUC (Ab Urbe condita) is a command-line Roman calendar tool. Currently it shows the specified date in the format of the Ancient Romans.
installPhase = ''
mkdir -p $out/{bin,man/man1}
install auc $out/bin
${pandoc}/bin/pandoc -V title=${lib.escapeShellArg pname} -V section=1 $src/README.md -s -t man -o $out/man/man1/auc.1
'';
license = licenses.mit;
maintainers = [ maintainers.kmein ];
platforms = platforms.all;
};
}
meta = with lib; {
description = "Command-line Roman calendar";
longDescription = ''
AUC (Ab Urbe condita) is a command-line Roman calendar tool. Currently it shows the specified date in the format of the Ancient Romans.
'';
license = licenses.mit;
maintainers = [maintainers.kmein];
platforms = platforms.all;
};
}

View File

@@ -1,5 +1,9 @@
{ ruby, stdenv, bundlerEnv, fetchFromGitHub }:
let
{
ruby,
stdenv,
bundlerEnv,
fetchFromGitHub,
}: let
src = fetchFromGitHub {
owner = "kmein";
repo = "bvg";
@@ -13,12 +17,13 @@ let
lockfile = "${src.out}/Gemfile.lock";
gemset = "${src.out}/gemset.nix";
};
in stdenv.mkDerivation {
name = "bvg";
buildInputs = [ env.wrappedRuby ];
script = "${src.out}/bvg.rb";
buildCommand = ''
install -D -m755 $script $out/bin/bvg
patchShebangs $out/bin/bvg
'';
}
in
stdenv.mkDerivation {
name = "bvg";
buildInputs = [env.wrappedRuby];
script = "${src.out}/bvg.rb";
buildCommand = ''
install -D -m755 $script $out/bin/bvg
patchShebangs $out/bin/bvg
'';
}

View File

@@ -1,4 +1,10 @@
{ lib, stdenv, makeWrapper, pandoc, fetchFromGitHub }:
{
lib,
stdenv,
makeWrapper,
pandoc,
fetchFromGitHub,
}:
stdenv.mkDerivation {
name = "daybook";
src = fetchFromGitHub {
@@ -7,8 +13,8 @@ stdenv.mkDerivation {
rev = "cad1aef158b0df36861434eb04c953d99a122e80";
sha256 = "07qippyry0yjf971pnqxm9i0xpvih8mvbhxwfwpwq980jik1hbl1";
};
nativeBuildInputs = [ makeWrapper ];
buildInputs = [ pandoc ];
nativeBuildInputs = [makeWrapper];
buildInputs = [pandoc];
buildPhase = ''
mkdir -p $out/man/man1
pandoc --standalone --to man daybook.1.md -o $out/man/man1/daybook.1

View File

@@ -1,12 +1,19 @@
{ pkgs, lib, ... }:
let
kpaste = pkgs.callPackage <stockholm/krebs/5pkgs/simple/kpaste> { };
opustags = pkgs.callPackage <niveum/packages/opustags.nix> { };
betacode = pkgs.callPackage <niveum/packages/python3Packages/betacode.nix> { };
wrapScript = { packages ? [ ], name, script }:
{
pkgs,
lib,
...
}: let
kpaste = pkgs.callPackage <stockholm/krebs/5pkgs/simple/kpaste> {};
opustags = pkgs.callPackage <niveum/packages/opustags.nix> {};
betacode = pkgs.callPackage <niveum/packages/python3Packages/betacode.nix> {};
wrapScript = {
packages ? [],
name,
script,
}:
pkgs.writers.writeDashBin name ''
PATH=$PATH:${
lib.makeBinPath (packages ++ [ pkgs.coreutils pkgs.findutils ])
lib.makeBinPath (packages ++ [pkgs.coreutils pkgs.findutils])
}
${script} "$@"
'';
@@ -16,424 +23,437 @@ let
rev = "0582b495937117d899ce8ef715a89c6cc25a36cf";
sha256 = "0c4hkny4zkknlimc9yi9ljss2cws4zn8lzd8ip9b8mfsm094dlfl";
};
in rec {
auc = pkgs.callPackage ./auc.nix {};
in
rec {
auc = pkgs.callPackage ./auc.nix {};
instaget = wrapScript {
packages = [ pkgs.jq pkgs.curl pkgs.gnugrep ];
script = ./instaget.sh;
name = "instaget";
};
instaget = wrapScript {
packages = [pkgs.jq pkgs.curl pkgs.gnugrep];
script = ./instaget.sh;
name = "instaget";
};
infschmv = pkgs.writers.writeDashBin "InfSchMV" ''
${pkgs.curl}/bin/curl -sSL https://www.berlin.de/corona/massnahmen/verordnung/ \
| ${pkgs.pup}/bin/pup .textile \
| ${pkgs.pandoc}/bin/pandoc -f html -t man -s \
| ${pkgs.man}/bin/man -l -
'';
infschmv = pkgs.writers.writeDashBin "InfSchMV" ''
${pkgs.curl}/bin/curl -sSL https://www.berlin.de/corona/massnahmen/verordnung/ \
| ${pkgs.pup}/bin/pup .textile \
| ${pkgs.pandoc}/bin/pandoc -f html -t man -s \
| ${pkgs.man}/bin/man -l -
'';
trans =
let
trans = let
script = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/soimort/translate-shell/gh-pages/trans.awk";
sha256 = "178r8d27bry1mzd1g8x2svp4w469hwv7nnxnmnsinx974skjx0jb";
};
in pkgs.writers.writeDashBin "trans" ''
${pkgs.gawk}/bin/gawk -f ${script} -- "$@"
in
pkgs.writers.writeDashBin "trans" ''
${pkgs.gawk}/bin/gawk -f ${script} -- "$@"
'';
dns-sledgehammer = pkgs.writers.writeDashBin "dns-sledgehammer" ''
${pkgs.coreutils}/bin/printf '%s\n' 'nameserver 1.1.1.1' 'options edns0' > /etc/resolv.conf
'';
dns-sledgehammer = pkgs.writers.writeDashBin "dns-sledgehammer" ''
${pkgs.coreutils}/bin/printf '%s\n' 'nameserver 1.1.1.1' 'options edns0' > /etc/resolv.conf
'';
much-scripts = let
much-current-query = wrapScript {
packages = [pkgs.curl];
name = "much-current-query";
script = ./much-current-query.sh;
};
mail-send = wrapScript {
packages = [pkgs.notmuch pkgs.msmtp pkgs.jq];
name = "mail-send";
script = ./mail-send.sh;
};
mail-reply = wrapScript {
packages = [much-current-query pkgs.notmuch pkgs.gnused pkgs.jq];
name = "mail-reply";
script = ./mail-reply.sh;
};
mail-kill = wrapScript {
name = "mail-kill";
script = ./mail-kill.sh;
packages = [pkgs.notmuch];
};
in
pkgs.symlinkJoin {
name = "much-scripts";
paths = [mail-send much-current-query mail-reply mail-kill];
};
much-scripts = let
much-current-query = wrapScript {
packages = [ pkgs.curl ];
name = "much-current-query";
script = ./much-current-query.sh;
showkeys-toggle = pkgs.writers.writeDashBin "showkeys-toggle" ''
if ${pkgs.procps}/bin/pgrep screenkey; then
exec ${pkgs.procps}/bin/pkill screenkey
else
exec ${pkgs.screenkey}/bin/screenkey
fi
'';
qrpaste = pkgs.writers.writeDashBin "qrpaste" ''
file="$(${pkgs.mktemp}/bin/mktemp --tmpdir)"
trap clean EXIT
clean() {
rm "$file"
}
${pkgs.qrencode}/bin/qrencode "$(${pkgs.xclip}/bin/xclip -selection clipboard -out)" -o "$file"
${pkgs.sxiv}/bin/sxiv "$file"
'';
ttspaste = pkgs.writers.writeDashBin "ttspaste" ''
${pkgs.xclip}/bin/xclip -selection clipboard -out | ${pkgs.curl}/bin/curl -G http://tts.r/api/tts --data-urlencode 'text@-' | ${pkgs.mpv}/bin/mpv -
'';
interdimensional-cable = let
nimaid-github-io = pkgs.fetchFromGitHub {
owner = "nimaid";
repo = "nimaid.github.io";
rev = "9cb4ede215be6bb01bd2df1ef3e9689cc8c4eb9e";
sha256 = "1g47cj5an7xgmhpc09m7qim5j9rspqxvnzfy90cnlvz4pg8hil96";
};
in
pkgs.writeShellScriptBin "interdimensional-cable" ''
export PATH=${lib.makeBinPath [pkgs.mpv pkgs.jq pkgs.gnused]}
mpv --shuffle --playlist=<(jq -r '.videos[]' ${nimaid-github-io}/tv/interdimensional_database.json | sed 's#^#https://youtu.be/#')
'';
tag = wrapScript {
packages = [pkgs.vorbisTools pkgs.python3Packages.eyeD3 opustags];
script = "${voidrice}/.local/bin/tag";
name = "tag";
};
mail-send = wrapScript {
packages = [ pkgs.notmuch pkgs.msmtp pkgs.jq ];
name = "mail-send";
script = ./mail-send.sh;
meteo = wrapScript {
packages = [pkgs.jq pkgs.curl pkgs.xdotool pkgs.sxiv pkgs.gnused];
script = ./meteo.sh;
name = "meteo";
};
mail-reply = wrapScript {
packages = [ much-current-query pkgs.notmuch pkgs.gnused pkgs.jq ];
name = "mail-reply";
script = ./mail-reply.sh;
kirciuoklis = wrapScript {
packages = [pkgs.curl pkgs.jq];
script = ./kirciuoklis.sh;
name = "kirciuoklis";
};
mail-kill = wrapScript {
name = "mail-kill";
script = ./mail-kill.sh;
packages = [ pkgs.notmuch ];
booksplit = wrapScript {
packages = [pkgs.ffmpeg tag pkgs.glibc.bin];
script = "${voidrice}/.local/bin/booksplit";
name = "booksplit";
};
in pkgs.symlinkJoin {
name = "much-scripts";
paths = [ mail-send much-current-query mail-reply mail-kill ];
};
showkeys-toggle = pkgs.writers.writeDashBin "showkeys-toggle" ''
if ${pkgs.procps}/bin/pgrep screenkey; then
exec ${pkgs.procps}/bin/pkill screenkey
else
exec ${pkgs.screenkey}/bin/screenkey
fi
'';
qrpaste = pkgs.writers.writeDashBin "qrpaste" ''
file="$(${pkgs.mktemp}/bin/mktemp --tmpdir)"
trap clean EXIT
clean() {
rm "$file"
}
${pkgs.qrencode}/bin/qrencode "$(${pkgs.xclip}/bin/xclip -selection clipboard -out)" -o "$file"
${pkgs.sxiv}/bin/sxiv "$file"
'';
ttspaste = pkgs.writers.writeDashBin "ttspaste" ''
${pkgs.xclip}/bin/xclip -selection clipboard -out | ${pkgs.curl}/bin/curl -G http://tts.r/api/tts --data-urlencode 'text@-' | ${pkgs.mpv}/bin/mpv -
'';
interdimensional-cable =
let nimaid-github-io = pkgs.fetchFromGitHub {
owner = "nimaid";
repo = "nimaid.github.io";
rev = "9cb4ede215be6bb01bd2df1ef3e9689cc8c4eb9e";
sha256 = "1g47cj5an7xgmhpc09m7qim5j9rspqxvnzfy90cnlvz4pg8hil96";
};
in pkgs.writeShellScriptBin "interdimensional-cable" ''
export PATH=${lib.makeBinPath [ pkgs.mpv pkgs.jq pkgs.gnused ]}
mpv --shuffle --playlist=<(jq -r '.videos[]' ${nimaid-github-io}/tv/interdimensional_database.json | sed 's#^#https://youtu.be/#')
'';
tag = wrapScript {
packages = [ pkgs.vorbisTools pkgs.python3Packages.eyeD3 opustags ];
script = "${voidrice}/.local/bin/tag";
name = "tag";
};
meteo = wrapScript {
packages = [ pkgs.jq pkgs.curl pkgs.xdotool pkgs.sxiv pkgs.gnused ];
script = ./meteo.sh;
name = "meteo";
};
kirciuoklis = wrapScript {
packages = [ pkgs.curl pkgs.jq ];
script = ./kirciuoklis.sh;
name = "kirciuoklis";
};
booksplit = wrapScript {
packages = [ pkgs.ffmpeg tag pkgs.glibc.bin ];
script = "${voidrice}/.local/bin/booksplit";
name = "booksplit";
};
n = wrapScript {
script = ./n.sh;
name = "n";
};
dirmir = wrapScript {
name = "dirmir";
script = ./dirmir.sh;
};
liddel-scott-jones = wrapScript {
name = "lsj";
script = ./liddel-scott-jones.sh;
packages = [ pkgs.curl pkgs.pup betacode pkgs.gnused pkgs.pandoc pkgs.man ];
};
sanskrit-dictionary = pkgs.writers.writeDashBin "sa" ''
set -efu
usage() {
echo "usage: [OUTPUT=deva|roman] $0 mw|mwe|boet|bopp|apte|boro TERM"
exit 1
}
[ $# -eq 2 ] || usage
case $1 in
mw) id=MWScan;;
mwe) id=MWEScan;;
bopp) id=BOPScan;;
boet) id=PWGScan;;
apte) id=AEScan;;
boro) id=BORScan;;
*) usage;;
esac
shift
input="$*"
${pkgs.curl}/bin/curl -sSL "https://www.sanskrit-lexicon.uni-koeln.de/scans/$id/2020/web/webtc/getword.php?key=$input&filter=''${OUTPUT-roman}&accent=yes&transLit=hk" \
| ${pkgs.pandoc}/bin/pandoc --standalone --variable=title:"$input" --from=html --to=man \
| ${pkgs.gnused}/bin/sed 's/\s\+\([:.,;]\)/\1/g;s/\s\+/ /g' \
| ${pkgs.man}/bin/man --local-file --pager="${pkgs.bat}/bin/bat -p" -
'';
playlist = import ./pls.nix { inherit pkgs; };
mpv-tv = import ./mpv-tv.nix { inherit pkgs lib; };
favicon = wrapScript {
packages = [ pkgs.imagemagick ];
name = "favicon";
script = ./favicon.sh;
};
closest = pkgs.writers.writeDashBin "closest" ''
${pkgs.writers.writeHaskellBin "closest" {
libraries = with pkgs.haskellPackages; [ parallel optparse-applicative edit-distance ];
ghcArgs = ["-O3" "-threaded" ];
} (builtins.readFile ./distance.hs)}/bin/closest +RTS -N4 -RTS --dictionary ${pkgs.fetchurl {
url = "https://gist.github.com/MarvinJWendt/2f4f4154b8ae218600eb091a5706b5f4/raw/36b70dd6be330aa61cd4d4cdfda6234dcb0b8784/wordlist-german.txt";
sha256 = "0vr4lmlckgvj4s8sk502sknq9pf3297rvasj5sqqm05zzbdgpppj";
}} "$@"
'';
horoscope = pkgs.callPackage ./horoscope {};
genius = wrapScript {
packages = [ pkgs.curl pkgs.gnused pkgs.pandoc ];
name = "genius";
script = ./genius.sh;
};
literature-quote = wrapScript {
packages = [ pkgs.xsv pkgs.curl pkgs.gnused ];
name = "literature-quote";
script = ./literature-quote.sh;
};
man-pdf = wrapScript {
packages = [ pkgs.man pkgs.ghostscript ];
name = "man-pdf";
script = ./man-pdf.sh;
};
odyssey = wrapScript {
packages = [ pkgs.curl pkgs.xmlstarlet ];
name = "odyssey";
script = ./odyssey.sh;
};
tolino-screensaver = wrapScript {
packages = [ pkgs.imagemagick ];
name = "tolino-screensaver";
script = ./tolino-screensaver.sh;
};
wttr = wrapScript {
packages = [ pkgs.curl ];
name = "wttr";
script = ./wttr.sh;
};
vg = wrapScript {
packages = [ pkgs.ripgrep pkgs.fzf pkgs.gawk ];
name = "vg";
script = ./vg.sh;
};
dmenurandr = wrapScript {
packages = [ pkgs.dmenu pkgs.gnugrep pkgs.gnused pkgs.xorg.xrandr pkgs.gawk pkgs.libnotify pkgs.arandr ];
name = "dmenurandr";
script = ./dmenurandr.sh;
};
dmenubluetooth = wrapScript {
packages = [ pkgs.bluez5 pkgs.dmenu pkgs.libnotify ];
name = "dmenubluetooth";
script = ./dmenubluetooth.sh;
};
fkill = wrapScript {
packages = [ pkgs.procps pkgs.gawk pkgs.gnused pkgs.fzf pkgs.bash ];
script = ./fkill.sh;
name = "fkill";
};
nix-git = wrapScript {
packages = [ pkgs.nix-prefetch-git pkgs.jq ];
script = ./nix-git.sh;
name = "nix-git";
};
linkhandler = wrapScript {
packages =
[ pkgs.utillinux pkgs.mpv pkgs.curl pkgs.gnused pkgs.sxiv pkgs.ts ];
script = "${voidrice}/.local/bin/linkhandler";
name = "linkhandler";
};
mansplain = wrapScript {
packages = [ pkgs.man pkgs.zathura pkgs.dmenu pkgs.gnused ];
script = ./mansplain.sh;
name = "mansplain";
};
notetags = wrapScript {
script = ./notetags.sh;
name = "notetags";
};
fzfmenu = wrapScript {
script = ./fzfmenu.sh;
name = "fzfmenu";
packages = [ pkgs.st pkgs.fzf pkgs.dash pkgs.bash ];
};
swallow = wrapScript {
script = ./swallow.sh;
name = "swallow";
packages = [ pkgs.xdo ];
};
ipa = pkgs.writers.writeHaskellBin "ipa" {
libraries = with pkgs; [ haskellPackages.text haskellPackages.ipa ];
} ''
import Data.Maybe (fromJust)
import Language.IPA
import qualified Data.Text as T
import qualified Data.Text.IO as T
main = T.interact (T.unwords . map (unIPA . fromJust . (xSampaToIpa =<<) . mkXSampa) . T.words)
'';
default-gateway = pkgs.writers.writeDashBin "default-gateway" ''
${pkgs.iproute}/bin/ip -json route | ${pkgs.jq}/bin/jq --raw-output '.[0].gateway'
'';
betacode = pkgs.writers.writeHaskellBin "betacode" {
libraries = with pkgs; [
(haskell.lib.unmarkBroken (haskell.lib.doJailbreak haskellPackages.betacode))
haskellPackages.text
];
} ''
import qualified Data.Text.IO as T
import qualified Data.Text as T
import Text.BetaCode
main = T.interact (either (error . T.unpack) id . fromBeta)
'';
devanagari = pkgs.callPackage ../devanagari {};
timer = pkgs.writers.writeDashBin "timer" ''
[ $# -eq 2 ] || {
echo "Usage: $0 TIME MESSAGE" 1>&2
exit 1
}
time=$(echo "$1" | ${pkgs.bc}/bin/bc)
echo "sleeping $time seconds, then saying: $2"
${pkgs.coreutils}/bin/sleep "$time" && {
echo "$2" | ${pkgs.espeak}/bin/espeak -v german-mbrola-6
}
'';
manual-sort = pkgs.writers.writeHaskellBin "manual-sort" {} ''
{-# LANGUAGE LambdaCase #-}
import Data.Char (toLower)
import System.Environment (getArgs)
import System.IO (BufferMode(NoBuffering), hSetBuffering, stdout)
insertionSortM :: Monad f => (a -> a -> f Ordering) -> [a] -> f [a]
insertionSortM cmp = foldr ((=<<) . insertByM cmp) (pure [])
where
insertByM cmp x = \case
[] -> pure [x]
yys@(y : ys) -> cmp x y >>= \case
GT -> (y :) <$> insertByM cmp x ys
_ -> pure (x : yys)
ask :: Show a => a -> a -> IO Ordering
ask a b = do
putStr (show a ++ " > " ++ show b ++ "? (y/n) ")
map toLower <$> getLine >>= \case
'y' : _ -> return GT
_ -> return LT
main :: IO ()
main = do
hSetBuffering stdout NoBuffering
argv <- getArgs
sorted <- insertionSortM ask argv
mapM_ (\(place, thing) -> putStrLn (show place ++ ". " ++ show thing)) $ zip [1 ..] (reverse sorted)
'';
scrot-dmenu = wrapScript {
script = ./scrot-dmenu.sh;
name = "dmenu-scrot";
packages = [ pkgs.xclip pkgs.scrot kpaste pkgs.libnotify pkgs.dmenu ];
};
unicodmenu = pkgs.callPackage ./unicodmenu.nix { };
mpv-radio =
let
streams = import <niveum/lib/streams.nix> {
di-fm-key = lib.strings.fileContents <secrets/di.fm/key>;
n = wrapScript {
script = ./n.sh;
name = "n";
};
streams-tsv = pkgs.writeText "streams.tsv" (lib.concatMapStringsSep "\n" ({ desc ? "", stream, station, ... }: "${station}\t${desc}\t${stream}") streams);
in pkgs.writers.writeDashBin "mpv-radio" ''
exec ${pkgs.mpv}/bin/mpv --force-window=yes "$(${pkgs.dmenu}/bin/dmenu -i -l 5 < ${streams-tsv} | ${pkgs.coreutils}/bin/cut -f3)"
'';
rfc = wrapScript {
script = ./rfc.sh;
name = "rfc";
packages = [ pkgs.curl pkgs.pup pkgs.gnused pkgs.gawk pkgs.gnugrep pkgs.fzf ];
};
dirmir = wrapScript {
name = "dirmir";
script = ./dirmir.sh;
};
new-mac = wrapScript {
script = ./new-mac.sh;
name = "new-mac";
packages = [ pkgs.gnused pkgs.openssl pkgs.jq pkgs.iproute2 ];
};
liddel-scott-jones = wrapScript {
name = "lsj";
script = ./liddel-scott-jones.sh;
packages = [pkgs.curl pkgs.pup betacode pkgs.gnused pkgs.pandoc pkgs.man];
};
bvg = pkgs.callPackage ./bvg.nix { };
nav = pkgs.callPackage ./nav.nix { };
k-lock = pkgs.callPackage ./k-lock.nix { };
sanskrit-dictionary = pkgs.writers.writeDashBin "sa" ''
set -efu
menu-calc = pkgs.writers.writeDashBin "=" ''
# https://github.com/onespaceman/menu-calc
usage() {
echo "usage: [OUTPUT=deva|roman] $0 mw|mwe|boet|bopp|apte|boro TERM"
exit 1
}
answer=$(echo "$@" | ${pkgs.pari}/bin/gp -q | ${pkgs.gnused}/bin/sed '/\./ s/\.\{0,1\}0\{1,\}$//')
[ $# -eq 2 ] || usage
action=$(printf "copy\nclear" | ${pkgs.dmenu}/bin/dmenu -p "= $answer")
case $1 in
mw) id=MWScan;;
mwe) id=MWEScan;;
bopp) id=BOPScan;;
boet) id=PWGScan;;
apte) id=AEScan;;
boro) id=BORScan;;
*) usage;;
esac
case $action in
"clear") $0 ;;
"copy") printf %s "$answer" | ${pkgs.xclip}/bin/xclip -selection clipboard;;
"") ;;
*) $0 "$answer $action" ;;
esac
'';
shift
# ref https://tex.stackexchange.com/a/502542
scanned = pkgs.writers.writeDashBin "scanned" ''
[ $# -eq 1 -a -f "$1" -a -r "$1" ] || exit 1
input="$*"
${pkgs.imagemagick}/bin/convert -density 150 "$1" -colorspace gray -linear-stretch 3.5%x10% -blur 0x0.5 -attenuate 0.25 +noise Gaussian "scanned-$1"
'';
${pkgs.curl}/bin/curl -sSL "https://www.sanskrit-lexicon.uni-koeln.de/scans/$id/2020/web/webtc/getword.php?key=$input&filter=''${OUTPUT-roman}&accent=yes&transLit=hk" \
| ${pkgs.pandoc}/bin/pandoc --standalone --variable=title:"$input" --from=html --to=man \
| ${pkgs.gnused}/bin/sed 's/\s\+\([:.,;]\)/\1/g;s/\s\+/ /g' \
| ${pkgs.man}/bin/man --local-file --pager="${pkgs.bat}/bin/bat -p" -
'';
nix-index-update = pkgs.writers.writeDashBin "nix-index-update" ''
filename="index-x86_64-$(uname | tr A-Z a-z)"
mkdir -p ~/.cache/nix-index
cd ~/.cache/nix-index
# -N will only download a new version if there is an update.
${pkgs.wget}/bin/wget -q -N https://github.com/Mic92/nix-index-database/releases/latest/download/$filename
ln -f $filename files
'';
} // {
devour = pkgs.callPackage <niveum/packages/devour.nix> { };
depp = pkgs.callPackage <niveum/packages/depp.nix> { };
text2pdf = pkgs.callPackage <niveum/packages/text2pdf.nix> { };
vimv = pkgs.callPackage <niveum/packages/vimv.nix> { };
when = pkgs.callPackage <niveum/packages/when.nix> { };
mahlzeit = pkgs.haskellPackages.callPackage <niveum/packages/mahlzeit.nix> { };
inherit opustags;
}
playlist = import ./pls.nix {inherit pkgs;};
mpv-tv = import ./mpv-tv.nix {inherit pkgs lib;};
favicon = wrapScript {
packages = [pkgs.imagemagick];
name = "favicon";
script = ./favicon.sh;
};
closest = pkgs.writers.writeDashBin "closest" ''
${
pkgs.writers.writeHaskellBin "closest" {
libraries = with pkgs.haskellPackages; [parallel optparse-applicative edit-distance];
ghcArgs = ["-O3" "-threaded"];
} (builtins.readFile ./distance.hs)
}/bin/closest +RTS -N4 -RTS --dictionary ${
pkgs.fetchurl {
url = "https://gist.github.com/MarvinJWendt/2f4f4154b8ae218600eb091a5706b5f4/raw/36b70dd6be330aa61cd4d4cdfda6234dcb0b8784/wordlist-german.txt";
sha256 = "0vr4lmlckgvj4s8sk502sknq9pf3297rvasj5sqqm05zzbdgpppj";
}
} "$@"
'';
horoscope = pkgs.callPackage ./horoscope {};
genius = wrapScript {
packages = [pkgs.curl pkgs.gnused pkgs.pandoc];
name = "genius";
script = ./genius.sh;
};
literature-quote = wrapScript {
packages = [pkgs.xsv pkgs.curl pkgs.gnused];
name = "literature-quote";
script = ./literature-quote.sh;
};
man-pdf = wrapScript {
packages = [pkgs.man pkgs.ghostscript];
name = "man-pdf";
script = ./man-pdf.sh;
};
odyssey = wrapScript {
packages = [pkgs.curl pkgs.xmlstarlet];
name = "odyssey";
script = ./odyssey.sh;
};
tolino-screensaver = wrapScript {
packages = [pkgs.imagemagick];
name = "tolino-screensaver";
script = ./tolino-screensaver.sh;
};
wttr = wrapScript {
packages = [pkgs.curl];
name = "wttr";
script = ./wttr.sh;
};
vg = wrapScript {
packages = [pkgs.ripgrep pkgs.fzf pkgs.gawk];
name = "vg";
script = ./vg.sh;
};
dmenurandr = wrapScript {
packages = [pkgs.dmenu pkgs.gnugrep pkgs.gnused pkgs.xorg.xrandr pkgs.gawk pkgs.libnotify pkgs.arandr];
name = "dmenurandr";
script = ./dmenurandr.sh;
};
dmenubluetooth = wrapScript {
packages = [pkgs.bluez5 pkgs.dmenu pkgs.libnotify];
name = "dmenubluetooth";
script = ./dmenubluetooth.sh;
};
fkill = wrapScript {
packages = [pkgs.procps pkgs.gawk pkgs.gnused pkgs.fzf pkgs.bash];
script = ./fkill.sh;
name = "fkill";
};
nix-git = wrapScript {
packages = [pkgs.nix-prefetch-git pkgs.jq];
script = ./nix-git.sh;
name = "nix-git";
};
linkhandler = wrapScript {
packages = [pkgs.utillinux pkgs.mpv pkgs.curl pkgs.gnused pkgs.sxiv pkgs.ts];
script = "${voidrice}/.local/bin/linkhandler";
name = "linkhandler";
};
mansplain = wrapScript {
packages = [pkgs.man pkgs.zathura pkgs.dmenu pkgs.gnused];
script = ./mansplain.sh;
name = "mansplain";
};
notetags = wrapScript {
script = ./notetags.sh;
name = "notetags";
};
fzfmenu = wrapScript {
script = ./fzfmenu.sh;
name = "fzfmenu";
packages = [pkgs.st pkgs.fzf pkgs.dash pkgs.bash];
};
swallow = wrapScript {
script = ./swallow.sh;
name = "swallow";
packages = [pkgs.xdo];
};
ipa = pkgs.writers.writeHaskellBin "ipa" {
libraries = with pkgs; [haskellPackages.text haskellPackages.ipa];
} ''
import Data.Maybe (fromJust)
import Language.IPA
import qualified Data.Text as T
import qualified Data.Text.IO as T
main = T.interact (T.unwords . map (unIPA . fromJust . (xSampaToIpa =<<) . mkXSampa) . T.words)
'';
default-gateway = pkgs.writers.writeDashBin "default-gateway" ''
${pkgs.iproute}/bin/ip -json route | ${pkgs.jq}/bin/jq --raw-output '.[0].gateway'
'';
betacode = pkgs.writers.writeHaskellBin "betacode" {
libraries = with pkgs; [
(haskell.lib.unmarkBroken (haskell.lib.doJailbreak haskellPackages.betacode))
haskellPackages.text
];
} ''
import qualified Data.Text.IO as T
import qualified Data.Text as T
import Text.BetaCode
main = T.interact (either (error . T.unpack) id . fromBeta)
'';
devanagari = pkgs.callPackage ../devanagari {};
timer = pkgs.writers.writeDashBin "timer" ''
[ $# -eq 2 ] || {
echo "Usage: $0 TIME MESSAGE" 1>&2
exit 1
}
time=$(echo "$1" | ${pkgs.bc}/bin/bc)
echo "sleeping $time seconds, then saying: $2"
${pkgs.coreutils}/bin/sleep "$time" && {
echo "$2" | ${pkgs.espeak}/bin/espeak -v german-mbrola-6
}
'';
manual-sort = pkgs.writers.writeHaskellBin "manual-sort" {} ''
{-# LANGUAGE LambdaCase #-}
import Data.Char (toLower)
import System.Environment (getArgs)
import System.IO (BufferMode(NoBuffering), hSetBuffering, stdout)
insertionSortM :: Monad f => (a -> a -> f Ordering) -> [a] -> f [a]
insertionSortM cmp = foldr ((=<<) . insertByM cmp) (pure [])
where
insertByM cmp x = \case
[] -> pure [x]
yys@(y : ys) -> cmp x y >>= \case
GT -> (y :) <$> insertByM cmp x ys
_ -> pure (x : yys)
ask :: Show a => a -> a -> IO Ordering
ask a b = do
putStr (show a ++ " > " ++ show b ++ "? (y/n) ")
map toLower <$> getLine >>= \case
'y' : _ -> return GT
_ -> return LT
main :: IO ()
main = do
hSetBuffering stdout NoBuffering
argv <- getArgs
sorted <- insertionSortM ask argv
mapM_ (\(place, thing) -> putStrLn (show place ++ ". " ++ show thing)) $ zip [1 ..] (reverse sorted)
'';
scrot-dmenu = wrapScript {
script = ./scrot-dmenu.sh;
name = "dmenu-scrot";
packages = [pkgs.xclip pkgs.scrot kpaste pkgs.libnotify pkgs.dmenu];
};
unicodmenu = pkgs.callPackage ./unicodmenu.nix {};
mpv-radio = let
streams = import <niveum/lib/streams.nix> {
di-fm-key = lib.strings.fileContents <secrets/di.fm/key>;
};
streams-tsv = pkgs.writeText "streams.tsv" (lib.concatMapStringsSep "\n" ({
desc ? "",
stream,
station,
...
}: "${station}\t${desc}\t${stream}")
streams);
in
pkgs.writers.writeDashBin "mpv-radio" ''
exec ${pkgs.mpv}/bin/mpv --force-window=yes "$(${pkgs.dmenu}/bin/dmenu -i -l 5 < ${streams-tsv} | ${pkgs.coreutils}/bin/cut -f3)"
'';
rfc = wrapScript {
script = ./rfc.sh;
name = "rfc";
packages = [pkgs.curl pkgs.pup pkgs.gnused pkgs.gawk pkgs.gnugrep pkgs.fzf];
};
new-mac = wrapScript {
script = ./new-mac.sh;
name = "new-mac";
packages = [pkgs.gnused pkgs.openssl pkgs.jq pkgs.iproute2];
};
bvg = pkgs.callPackage ./bvg.nix {};
nav = pkgs.callPackage ./nav.nix {};
k-lock = pkgs.callPackage ./k-lock.nix {};
menu-calc = pkgs.writers.writeDashBin "=" ''
# https://github.com/onespaceman/menu-calc
answer=$(echo "$@" | ${pkgs.pari}/bin/gp -q | ${pkgs.gnused}/bin/sed '/\./ s/\.\{0,1\}0\{1,\}$//')
action=$(printf "copy\nclear" | ${pkgs.dmenu}/bin/dmenu -p "= $answer")
case $action in
"clear") $0 ;;
"copy") printf %s "$answer" | ${pkgs.xclip}/bin/xclip -selection clipboard;;
"") ;;
*) $0 "$answer $action" ;;
esac
'';
# ref https://tex.stackexchange.com/a/502542
scanned = pkgs.writers.writeDashBin "scanned" ''
[ $# -eq 1 -a -f "$1" -a -r "$1" ] || exit 1
${pkgs.imagemagick}/bin/convert -density 150 "$1" -colorspace gray -linear-stretch 3.5%x10% -blur 0x0.5 -attenuate 0.25 +noise Gaussian "scanned-$1"
'';
nix-index-update = pkgs.writers.writeDashBin "nix-index-update" ''
filename="index-x86_64-$(uname | tr A-Z a-z)"
mkdir -p ~/.cache/nix-index
cd ~/.cache/nix-index
# -N will only download a new version if there is an update.
${pkgs.wget}/bin/wget -q -N https://github.com/Mic92/nix-index-database/releases/latest/download/$filename
ln -f $filename files
'';
}
// {
devour = pkgs.callPackage <niveum/packages/devour.nix> {};
depp = pkgs.callPackage <niveum/packages/depp.nix> {};
text2pdf = pkgs.callPackage <niveum/packages/text2pdf.nix> {};
vimv = pkgs.callPackage <niveum/packages/vimv.nix> {};
when = pkgs.callPackage <niveum/packages/when.nix> {};
mahlzeit = pkgs.haskellPackages.callPackage <niveum/packages/mahlzeit.nix> {};
inherit opustags;
}

View File

@@ -1,5 +1,7 @@
{ lib, writeShellScriptBin }:
let
{
lib,
writeShellScriptBin,
}: let
aliasFlag = name: value: "-c alias.${name}=${lib.escapeShellArg value}";
aliases = {
eroeffne = "init";
@@ -20,15 +22,16 @@ let
tagebuch = "log";
zustand = "status";
};
in writeShellScriptBin "depp" ''
if [ $# -gt 0 ]; then
git ${
in
writeShellScriptBin "depp" ''
if [ $# -gt 0 ]; then
git ${
lib.concatStringsSep " " (lib.attrsets.mapAttrsToList aliasFlag aliases)
} "$@"
else
printf "${
else
printf "${
lib.concatStringsSep "\n"
(lib.attrsets.mapAttrsToList (n: v: n + " " + v) aliases)
}\n"
fi
''
fi
''

View File

@@ -1,4 +1,4 @@
{ poetry2nix }:
{poetry2nix}:
poetry2nix.mkPoetryApplication {
projectDir = ./.;
projectDir = ./.;
}

View File

@@ -1,4 +1,9 @@
{ writeShellScriptBin, wget, curl, jq }:
{
writeShellScriptBin,
wget,
curl,
jq,
}:
writeShellScriptBin "instaget" ''
for url in "$@"; do
json="$(${curl}/bin/curl -s "$url" \

View File

@@ -1,5 +1,8 @@
{ writers, lib, xlockmore }:
let
{
writers,
lib,
xlockmore,
}: let
xlockModes = lib.concatStringsSep "\\n" [
# "braid"
"galaxy"
@@ -8,18 +11,19 @@ let
"pyro2"
"space"
];
in writers.writeDashBin "k-lock" ''
MODE=$(printf "${xlockModes}" | shuf -n 1)
in
writers.writeDashBin "k-lock" ''
MODE=$(printf "${xlockModes}" | shuf -n 1)
${xlockmore}/bin/xlock \
-saturation 0.4 \
-erasemode no_fade \
+description \
-showdate \
-username " " \
-password " " \
-info " " \
-validate "..." \
-invalid "Computer says no." \
-mode "$MODE"
''
${xlockmore}/bin/xlock \
-saturation 0.4 \
-erasemode no_fade \
+description \
-showdate \
-username " " \
-password " " \
-info " " \
-validate "..." \
-invalid "Computer says no." \
-mode "$MODE"
''

View File

@@ -1,46 +1,52 @@
# klem < klemm < klemmbrett ~ clipboard
{ pkgs, lib, ... }@args:
let
{
pkgs,
lib,
...
} @ args: let
cfg = eval.config;
eval = lib.evalModules {
modules = [{
_file = toString ./klem.nix;
imports = [ (args.config or { }) ];
options = {
selection = lib.mkOption {
default = "clipboard";
type = lib.types.enum [ "primary" "secondary" "clipboard" ];
};
dmenu = lib.mkOption {
default = "${pkgs.dmenu}/bin/dmenu -i -p klem";
type = lib.types.path;
};
scripts = lib.mkOption {
default = {
pastebin = "${pkgs.curl}/bin/curl -fSs -F 'f:1=<-' ix.io";
shorten = ''
${pkgs.curl}/bin/curl -fSs -F "shorten=$(${pkgs.coreutils}/bin/cat)" https://0x0.st
'';
"replace p.r" = "${pkgs.gnused}/bin/sed 's/\\<r\\>/krebsco.de/'";
modules = [
{
_file = toString ./klem.nix;
imports = [(args.config or {})];
options = {
selection = lib.mkOption {
default = "clipboard";
type = lib.types.enum ["primary" "secondary" "clipboard"];
};
dmenu = lib.mkOption {
default = "${pkgs.dmenu}/bin/dmenu -i -p klem";
type = lib.types.path;
};
scripts = lib.mkOption {
default = {
pastebin = "${pkgs.curl}/bin/curl -fSs -F 'f:1=<-' ix.io";
shorten = ''
${pkgs.curl}/bin/curl -fSs -F "shorten=$(${pkgs.coreutils}/bin/cat)" https://0x0.st
'';
"replace p.r" = "${pkgs.gnused}/bin/sed 's/\\<r\\>/krebsco.de/'";
};
type = lib.types.attrs;
};
type = lib.types.attrs;
};
};
}];
}
];
};
scriptCase = option: script: ''
'${option}') ${toString script} ;;
'';
in pkgs.writers.writeDashBin "klem" ''
${pkgs.xclip}/bin/xclip -selection ${cfg.selection} -out \
| case $(echo "${
in
pkgs.writers.writeDashBin "klem" ''
${pkgs.xclip}/bin/xclip -selection ${cfg.selection} -out \
| case $(echo "${
lib.concatStringsSep "\n" (lib.attrNames cfg.scripts)
}" | ${cfg.dmenu}) in
${lib.concatStringsSep "\n" (lib.mapAttrsToList scriptCase cfg.scripts)}
*) ${pkgs.coreutils}/bin/cat ;;
esac \
| tr -d '\r\n' \
| ${pkgs.xclip}/bin/xclip -selection ${cfg.selection} -in
''
${lib.concatStringsSep "\n" (lib.mapAttrsToList scriptCase cfg.scripts)}
*) ${pkgs.coreutils}/bin/cat ;;
esac \
| tr -d '\r\n' \
| ${pkgs.xclip}/bin/xclip -selection ${cfg.selection} -in
''

View File

@@ -1,5 +1,7 @@
{ pkgs, lib }:
let
{
pkgs,
lib,
}: let
streams-tsv = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/jnk22/kodinerds-iptv/master/iptv/kodi/kodi_tv.m3u";
sha256 = "1cw1gmb16vwh6qfw0z3wjjfgn0zg2qplnddqzva5b0xx2g2appla";
@@ -8,6 +10,7 @@ let
mv $out.tmp $out
'';
};
in pkgs.writers.writeDashBin "mpv-tv" ''
exec ${pkgs.mpv}/bin/mpv --force-window=yes "$(${pkgs.dmenu}/bin/dmenu -i -l 5 < ${streams-tsv} | ${pkgs.coreutils}/bin/cut -f2)"
''
in
pkgs.writers.writeDashBin "mpv-tv" ''
exec ${pkgs.mpv}/bin/mpv --force-window=yes "$(${pkgs.dmenu}/bin/dmenu -i -l 5 < ${streams-tsv} | ${pkgs.coreutils}/bin/cut -f2)"
''

View File

@@ -1,4 +1,9 @@
{ lib, fetchFromGitHub, stdenv, fzf }:
{
lib,
fetchFromGitHub,
stdenv,
fzf,
}:
stdenv.mkDerivation rec {
name = "nav";
version = "8da22b1";
@@ -12,9 +17,9 @@ stdenv.mkDerivation rec {
mkdir -p $out/bin/
install nav $out/bin/
'';
propagatedBuildInputs = [ fzf ];
propagatedBuildInputs = [fzf];
meta = {
maintainer = [ lib.maintainers.kmein ];
maintainer = [lib.maintainers.kmein];
description = "JSON data structure navigator";
homepage = "https://github.com/huntrar/nav";
};

View File

@@ -1,5 +1,4 @@
{ pkgs }:
let
{pkgs}: let
inherit (pkgs) lib;
playlistAPI = "https://radio.lassul.us";
@@ -41,28 +40,28 @@ let
"noooo"
];
in
pkgs.writers.writeDashBin "pls" ''
case "$1" in
good|like|cool|nice|noice|top|yup|yass|yes|+)
${pkgs.curl}/bin/curl -sS -XPOST "${playlistAPI}/good"
echo ${lib.escapeShellArg (lib.concatStringsSep "\n" messages.good)} | shuf -n1 | ${sendIRC}
;;
skip|next|bad|sucks|no|nope|flop|-)
${pkgs.curl}/bin/curl -sS -XPOST "${playlistAPI}/skip"
echo ${lib.escapeShellArg (lib.concatStringsSep "\n" messages.bad)} | shuf -n1 | ${sendIRC}
;;
say|msg)
shift
echo "$@" | ${sendIRC}
;;
recent)
${pkgs.curl}/bin/curl -sS -XGET "${playlistAPI}/recent" | tac | head
;;
*)
${pkgs.curl}/bin/curl -sS -XGET "${playlistAPI}/current" \
| ${pkgs.miller}/bin/mlr --ijson --oxtab cat \
| ${pkgs.gnused}/bin/sed -n '/artist\|title\|youtube/p'
;;
esac
wait
''
pkgs.writers.writeDashBin "pls" ''
case "$1" in
good|like|cool|nice|noice|top|yup|yass|yes|+)
${pkgs.curl}/bin/curl -sS -XPOST "${playlistAPI}/good"
echo ${lib.escapeShellArg (lib.concatStringsSep "\n" messages.good)} | shuf -n1 | ${sendIRC}
;;
skip|next|bad|sucks|no|nope|flop|-)
${pkgs.curl}/bin/curl -sS -XPOST "${playlistAPI}/skip"
echo ${lib.escapeShellArg (lib.concatStringsSep "\n" messages.bad)} | shuf -n1 | ${sendIRC}
;;
say|msg)
shift
echo "$@" | ${sendIRC}
;;
recent)
${pkgs.curl}/bin/curl -sS -XGET "${playlistAPI}/recent" | tac | head
;;
*)
${pkgs.curl}/bin/curl -sS -XGET "${playlistAPI}/current" \
| ${pkgs.miller}/bin/mlr --ijson --oxtab cat \
| ${pkgs.gnused}/bin/sed -n '/artist\|title\|youtube/p'
;;
esac
wait
''

View File

@@ -1,24 +1,40 @@
{ lib, runCommand, fetchurl, writeText, writers, coreutils, dmenu, gnused, libnotify, xclip, xdotool, gawk }:
let
{
lib,
runCommand,
fetchurl,
writeText,
writers,
coreutils,
dmenu,
gnused,
libnotify,
xclip,
xdotool,
gawk,
}: let
unicode-file = runCommand "unicode.txt" {} ''
${writers.writePython3 "generate.py" { flakeIgnore = [ "E501" "E722" ]; } ''
import csv
${
writers.writePython3 "generate.py" {flakeIgnore = ["E501" "E722"];} ''
import csv
with open("${fetchurl {
url = "https://unicode.org/Public/UCD/latest/ucd/UnicodeData.txt";
sha256 = "sha256-NgGOaGV/3LNIX2NmMP/oyFMuAcl3cD0oA/W4nWxf6vs=";
}}", "r") as unicode_data:
reader = csv.reader(unicode_data, delimiter=";")
next(reader) # skip first row containing \0
for row in reader:
codepoint = row[0]
name = row[1]
alternate_name = row[10]
try:
print(chr(int(codepoint, 16)), codepoint, name, alternate_name, sep=" ")
except:
continue
''} > $out
with open("${
fetchurl {
url = "https://unicode.org/Public/UCD/latest/ucd/UnicodeData.txt";
sha256 = "sha256-NgGOaGV/3LNIX2NmMP/oyFMuAcl3cD0oA/W4nWxf6vs=";
}
}", "r") as unicode_data:
reader = csv.reader(unicode_data, delimiter=";")
next(reader) # skip first row containing \0
for row in reader:
codepoint = row[0]
name = row[1]
alternate_name = row[10]
try:
print(chr(int(codepoint, 16)), codepoint, name, alternate_name, sep=" ")
except:
continue
''
} > $out
'';
kaomoji-file = writeText "kaomoji.txt" ''
¯\(°_o)/¯ dunno lol shrug dlol
@@ -56,18 +72,19 @@ let
𓂺 penis
𓂸 penis
'';
in # ref https://github.com/LukeSmithxyz/voidrice/blob/9fe6802122f6e0392c7fe20eefd30437771d7f8e/.local/bin/dmenuunicode
writers.writeDashBin "unicodmenu" ''
PATH=${lib.makeBinPath [ coreutils dmenu gnused libnotify xclip xdotool ]}
chosen=$(cat ${kaomoji-file} ${unicode-file} | dmenu -p unicode -i -l 10 | sed "s/ .*//")
in
# ref https://github.com/LukeSmithxyz/voidrice/blob/9fe6802122f6e0392c7fe20eefd30437771d7f8e/.local/bin/dmenuunicode
writers.writeDashBin "unicodmenu" ''
PATH=${lib.makeBinPath [coreutils dmenu gnused libnotify xclip xdotool]}
chosen=$(cat ${kaomoji-file} ${unicode-file} | dmenu -p unicode -i -l 10 | sed "s/ .*//")
[ "$chosen" != "" ] || exit
[ "$chosen" != "" ] || exit
echo "$chosen" | tr -d '\n' | xclip -selection clipboard
echo "$chosen" | tr -d '\n' | xclip -selection clipboard
if [ -n "$1" ]; then
xdotool key Shift+Insert
else
notify-send --app-name="$(basename "$0")" "'$chosen' copied to clipboard." &
fi
''
if [ -n "$1" ]; then
xdotool key Shift+Insert
else
notify-send --app-name="$(basename "$0")" "'$chosen' copied to clipboard." &
fi
''