#!/bin/sh -Ce clip() { print "$1" | tee /dev/tty | head -n 1 | pbcopy; } checkpath() { set -- $(realpath "$1"); [ "${1#~/.cle/}" != "$1" ]; } del() { set -- ~/.cle/"$1" checkpath "$1" || die "invalid path $1" rm -i "$1" rmdir -p "${1%/*}" 2>/dev/null || true } die() { echo "$@" >&2; exit 1; } edit() { [ "$1" ] || die 'missing argument' tmp=$(mktemp) f=~/.cle/"$1" trap 'rm -f "$tmp"' EXIT print "$1" >| "$tmp" || mkdir -p "${f%/*}" [ -s "$tmp" ] || gen >| "$tmp" "${EDITOR:-vim}" "$tmp" crypt < "$tmp" >| "$f" } gen() { LC_ALL=C tr -dc 'A-Za-z0-9!?%=' < /dev/urandom | head -c 10; } list() { cd ~/.cle && find -- * -name .git -prune -o -type f -print; } print() { [ -f ~/.cle/"$1" ] && crypt -d < ~/.cle/"$1"; } tui() { list | fzf --preview 'cle print {}' \ --preview-window hidden \ --header 'Ret Select, Esc Cancel, ^E Edit, ^N New, ^P Preview, ^Del Delete' \ --bind 'ctrl-delete:execute(cle del {})+reload(cle list)' \ --bind 'ctrl-e:execute(cle edit {})' \ --bind 'ctrl-n:execute(cle edit {q})+reload(cle list)' \ --bind 'ctrl-p:toggle-preview' \ --query "$1" --select-1 | xargs cle clip } case $1 in (clip|del|edit|gen|list|print) cmd=$1; shift; $cmd "$@" ;; (*) tui "$@" ;; esac